diff options
author | Karl Berry <karl@freefriends.org> | 2022-01-21 17:25:16 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2022-01-21 17:25:16 +0000 |
commit | d4696bc762d79099bd38898faea19cd7af41c1f5 (patch) | |
tree | 7da6d0bf4f49c5592296f0f903c94d152ad0d857 /Build/source/texk | |
parent | 4dcaee1b127fff1f88f720d6c18c8e96989b98ef (diff) |
dvisvgm 2.13
git-svn-id: svn://tug.org/texlive/trunk@61679 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk')
372 files changed, 17137 insertions, 6384 deletions
diff --git a/Build/source/texk/README b/Build/source/texk/README index 05d9ecacf04..344fbe04186 100644 --- a/Build/source/texk/README +++ b/Build/source/texk/README @@ -1,5 +1,5 @@ $Id$ -Copyright 2006-2021 TeX Users Group. +Copyright 2006-2022 TeX Users Group. You may freely use, modify and/or distribute this file. This TeX Live directory contains the programs that use the kpathsea @@ -64,9 +64,10 @@ dvipos - maintained here, by us dvipsk - maintained here, by us -dvisvgm 2.11.1 - checked 23jan21 +dvisvgm 2.13 - checked 21jan22 https://dvisvgm.de/Downloads/ https://github.com/mgieseki/dvisvgm + https://ctan.org/pkg/dvisvgm gregorio 5.2.1 - checked 19dec19 CTAN/support/gregoriotex/gregorio-5.2.1.zip diff --git a/Build/source/texk/dvisvgm/TLpatches/TL-Changes b/Build/source/texk/dvisvgm/TLpatches/TL-Changes index b2bdba2711e..cb97d3ca891 100644 --- a/Build/source/texk/dvisvgm/TLpatches/TL-Changes +++ b/Build/source/texk/dvisvgm/TLpatches/TL-Changes @@ -5,6 +5,7 @@ Changes applied to the original dvisvgm source as obtained from: or (hopefully) https://ctan.org/pkg/dvisvgm Update version in ./version.ac. +Update DATE and copyrights in configure.ac. mv dvisvgm-src dvisvgm-prev tar xf dvisvgm-VER.tar.gz @@ -30,11 +31,11 @@ cd .. Update our ./configure.ac from upstream dvisvgm-src/configure.ac. See patch-04-configure for reference, but they won't apply as-is. -Probably simpler to check the previous original dvisvgm/configure.ac +Probably easiest to check the previous original dvisvgm/configure.ac vs. the new, and then install the changes in our configure.ac by hand. # patch to integrate into TL build; will probably need adjusting also. patch -d dvisvgm-src -p1 <TLpatches/patch-08-makefiles -# remake autostuff (then make, etc.). +# remake autostuff (then make, etc., as usual). autoreconf diff --git a/Build/source/texk/dvisvgm/TLpatches/patch-04-configure b/Build/source/texk/dvisvgm/TLpatches/patch-04-configure index fa1a443637b..8f210a67ff5 100644 --- a/Build/source/texk/dvisvgm/TLpatches/patch-04-configure +++ b/Build/source/texk/dvisvgm/TLpatches/patch-04-configure @@ -1,18 +1,18 @@ ---- dvisvgm-2.11.1/configure.ac 2021-01-21 23:07:49.000000000 +0900 -+++ configure.ac 2021-01-23 08:58:18.575395177 +0900 -@@ -1,149 +1,156 @@ +--- dvisvgm-2.13/configure.ac 2022-01-20 01:52:06.000000000 -0800 ++++ configure.ac 2022-01-21 09:14:30.484086131 -0800 +@@ -1,81 +1,69 @@ -# This file is part of dvisvgm --# Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> +-# Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> -# -# Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.59) --AC_INIT([dvisvgm],[2.11.1],[martin.gieseking@uos.de]) -+dnl $Id$ +-AC_INIT([dvisvgm],[2.13],[martin.gieseking@uos.de]) ++dnl $Id: configure.ac 57804 2021-02-19 23:14:47Z karl $ +dnl Process this file with autoconf to produce a configure script +dnl for dvisvgm in TeX Live. +dnl -+dnl Copyright 2015-2021 Karl Berry <tex-live@tug.org> ++dnl Copyright 2015-2022 Karl Berry <tex-live@tug.org> +dnl Copyright 2009-2014 Peter Breitenlohner <tex-live@tug.org> +dnl +dnl This file is free software; the copyright holder @@ -20,12 +20,12 @@ +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl Adapted for TeX Live from original dvisvgm configure.ac -+dnl Copyright 2005-2020 Martin Gieseking ++dnl Copyright 2005-2022 Martin Gieseking +dnl +AC_PREREQ([2.65]) +m4_include([version.ac])[] dnl define dvisvgm_version +AC_INIT([dvisvgm (TeX Live)], dvisvgm_version, [tex-k@tug.org]) - DATE="January 2021" + DATE="January 2022" -AC_CONFIG_SRCDIR(src) +AC_CONFIG_SRCDIR([dvisvgm-src/src/dvisvgm.cpp]) AC_CONFIG_HEADERS([config.h]) @@ -127,7 +127,7 @@ +fi AS_IF([test "x$have_libgs" = "xno"], # Ghostscript not found, check for dlopen - [AC_CHECK_LIB(dl, dlopen,, +@@ -83,66 +71,85 @@ [AC_DEFINE(DISABLE_GS, 1, [Set to 1 if PostScript support should be disabled])] [AC_MSG_WARN(PostScript support disabled)])]) +fi @@ -137,17 +137,6 @@ - -# Check for libraries. -PKG_CHECK_MODULES([FREETYPE], [freetype2]) -- --AC_ARG_ENABLE([woff], -- [AS_HELP_STRING([--disable-woff], [Disable WOFF support @<:@default=no@:>@])], -- [], -- [enable_woff=yes]) --AM_CONDITIONAL([ENABLE_WOFF], [test "x$enable_woff" = "xyes"]) -- --AC_ARG_WITH([ttfautohint], -- [AS_HELP_STRING([--with-ttfautohint@<:@=prefix@:>@], [enable ttfautohint support (disabled by default)])], -- [with_ttfautohint="$withval"], -- [with_ttfautohint=no]) +if test -z "$HAVE_LIBGS" || test "$HAVE_LIBGS" -eq 0; then + AC_MSG_NOTICE([not linking to libgs, trying to arrange for dynamic loading]) + # Windows (native or MinGW32) has neither <dlfcn.h> nor dlopen(). @@ -211,6 +200,17 @@ +AC_CHECK_FUNC([kpse_set_program_name], [], + [AC_MSG_ERROR([cannot find/use libkpathsea])]) +-AC_ARG_ENABLE([woff], +- [AS_HELP_STRING([--disable-woff], [Disable WOFF support @<:@default=no@:>@])], +- [], +- [enable_woff=yes]) +-AM_CONDITIONAL([ENABLE_WOFF], [test "x$enable_woff" = "xyes"]) +- +-AC_ARG_WITH([ttfautohint], +- [AS_HELP_STRING([--with-ttfautohint@<:@=prefix@:>@], [enable ttfautohint support (disabled by default)])], +- [with_ttfautohint="$withval"], +- [with_ttfautohint=no]) +- -# Add option to enable linking of bundled libraries (brotli, potrace, woff2, xxhash). -AC_ARG_ENABLE([bundled-libs], - [AS_HELP_STRING([--enable-bundled-libs], [use bundled libraries instead of the system ones @<:@default=no@:>@])]) @@ -270,9 +270,7 @@ +# emacs-page # Check for header files. AC_HEADER_DIRENT - AC_HEADER_STDC -@@ -158,80 +165,74 @@ - AC_FUNC_STAT +@@ -159,79 +166,75 @@ AC_CHECK_FUNCS_ONCE([ftime gettimeofday sigaction umask uselocale]) -# add options for selection of "optional" library locations @@ -286,22 +284,15 @@ - [AS_IF([test -n "$ZLIB_DIR"], - [ZLIB_CFLAGS="-I$ZLIB_DIR -I$ZLIB_DIR/include"] - [ZLIB_LIBS="-L$ZLIB_DIR/lib" -lz])])]) ++AC_SEARCH_LIBS(clock_gettime, rt)dnl for Solaris 10 and other old libc + +-AC_SUBST([ZLIB_CFLAGS]) +-AC_SUBST([ZLIB_LIBS]) +AC_ARG_ENABLE([woff], + [AS_HELP_STRING([--disable-woff], [Disable WOFF support @<:@default=no@:>@])], + [], + [enable_woff=yes]) +AM_CONDITIONAL([ENABLE_WOFF], [test "x$enable_woff" = "xyes"]) -+ -+AC_DEFINE([HAVE_LIBKPATHSEA], 1, [Define to 1 if you have the `kpathsea' library (-lkpathsea).]) -+AC_DEFINE([HAVE_LIBFREETYPE], 1, [Define to 1 if you have the `freetype2' library (-lfreetype).]) -+AC_DEFINE([HAVE_LIBZ], 1, [Define to 1 if you have the `z' library (-lz).]) -+if false; then -+ AC_DEFINE([KPSE_CXX_UNSAFE], 1, [Define to 1 if the kpathsea headers are not C++ safe.]) -+fi - --AC_SUBST([ZLIB_CFLAGS]) --AC_SUBST([ZLIB_LIBS]) -+# TL: skip ttfautohint? -# Check if the kpathsea headers are C++ safe -AC_MSG_CHECKING([if the kpathsea headers are C++ safe]) @@ -313,6 +304,15 @@ - AC_DEFINE([KPSE_CXX_UNSAFE], 1, - [Define to 1 if the kpathsea headers are not C++ safe.])]) -AC_LANG_POP([C++]) ++AC_DEFINE([HAVE_LIBKPATHSEA], 1, [Define to 1 if you have the `kpathsea' library (-lkpathsea).]) ++AC_DEFINE([HAVE_LIBFREETYPE], 1, [Define to 1 if you have the `freetype2' library (-lfreetype).]) ++AC_DEFINE([HAVE_LIBZ], 1, [Define to 1 if you have the `z' library (-lz).]) ++if false; then ++ AC_DEFINE([KPSE_CXX_UNSAFE], 1, [Define to 1 if the kpathsea headers are not C++ safe.]) ++fi ++ ++# TL: skip ttfautohint? ++ +# Add option to enable linking of bundled libraries (brotli, potrace, woff2, xxhash). +AC_ARG_ENABLE([bundled-libs], + [AS_HELP_STRING([--enable-bundled-libs], [use bundled libraries instead of the system ones @<:@default=no@:>@])], diff --git a/Build/source/texk/dvisvgm/TLpatches/patch-08-makefiles b/Build/source/texk/dvisvgm/TLpatches/patch-08-makefiles index 1dbf08162f4..495c2f81aee 100644 --- a/Build/source/texk/dvisvgm/TLpatches/patch-08-makefiles +++ b/Build/source/texk/dvisvgm/TLpatches/patch-08-makefiles @@ -1,37 +1,39 @@ - See ./TL-Changes. - -diff '--exclude=*~' '--exclude=*.py[co]' '--exclude=*.[ao]' '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=autom4te.cache' '--exclude=Makefile.in' '--exclude=configure' '--exclude=Work' '--exclude=inst' '--exclude=build-pdftex' '--ignore-matching-lines=\$Id' -u2r dvisvgm-2.11.1/Makefile.am dvisvgm-src/Makefile.am ---- dvisvgm-2.11.1/Makefile.am 2021-01-21 06:06:33.000000000 -0800 -+++ dvisvgm-src/Makefile.am 2021-01-23 00:47:24.909030000 -0800 -@@ -6,5 +6,5 @@ - AUTOMAKE_OPTIONS = foreign +diff --strip-trailing-cr -u1 -r dvisvgm-2.13/Makefile.am dvisvgm-src/Makefile.am +--- dvisvgm-2.13/Makefile.am 2022-01-18 05:39:00.000000000 -0800 ++++ dvisvgm-src/Makefile.am 2022-01-21 09:15:51.800456322 -0800 +@@ -7,3 +7,3 @@ EXTRA_DIST = COPYING -SUBDIRS = libs m4 src tests doc +SUBDIRS = libs src #not for TL: m4 tests doc ACLOCAL_AMFLAGS = -I m4 - -diff '--exclude=*~' '--exclude=*.py[co]' '--exclude=*.[ao]' '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=autom4te.cache' '--exclude=Makefile.in' '--exclude=configure' '--exclude=Work' '--exclude=inst' '--exclude=build-pdftex' '--ignore-matching-lines=\$Id' -u2r dvisvgm-2.11.1/libs/ff-woff/Makefile.am dvisvgm-src/libs/ff-woff/Makefile.am ---- dvisvgm-2.11.1/libs/ff-woff/Makefile.am 2021-01-21 06:06:33.000000000 -0800 -+++ dvisvgm-src/libs/ff-woff/Makefile.am 2021-06-26 08:57:25.865861500 -0700 -@@ -84,5 +84,5 @@ - EXTRA_DIST = LICENSE +Only in dvisvgm-2.13: aclocal.m4 +Only in dvisvgm-2.13: ar-lib +Only in dvisvgm-2.13: compile +Only in dvisvgm-2.13: config.guess +Only in dvisvgm-2.13: config.sub +Only in dvisvgm-2.13: configure +Only in dvisvgm-2.13: depcomp +Only in dvisvgm-2.13: install-sh +diff --strip-trailing-cr -u1 -r dvisvgm-2.13/libs/ff-woff/Makefile.am dvisvgm-src/libs/ff-woff/Makefile.am +--- dvisvgm-2.13/libs/ff-woff/Makefile.am 2019-04-12 07:39:46.000000000 -0700 ++++ dvisvgm-src/libs/ff-woff/Makefile.am 2022-01-21 09:15:51.801456314 -0800 +@@ -85,3 +85,3 @@ -AM_CFLAGS = -I$(srcdir)/inc -I$(srcdir)/fontforge $(ZLIB_CFLAGS) +AM_CFLAGS = -I$(srcdir)/inc -I$(srcdir)/fontforge $(ZLIB_INCLUDES) - @CODE_COVERAGE_RULES@ -diff '--exclude=*~' '--exclude=*.py[co]' '--exclude=*.[ao]' '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=autom4te.cache' '--exclude=Makefile.in' '--exclude=configure' '--exclude=Work' '--exclude=inst' '--exclude=build-pdftex' '--ignore-matching-lines=\$Id' -u2r dvisvgm-2.11.1/src/Makefile.am dvisvgm-src/src/Makefile.am ---- dvisvgm-2.11.1/src/Makefile.am 2021-01-21 06:06:33.000000000 -0800 -+++ dvisvgm-src/src/Makefile.am 2021-06-26 08:56:40.066387630 -0700 -@@ -5,5 +5,5 @@ - +Only in dvisvgm-2.13: ltmain.sh +Only in dvisvgm-2.13: m4 +Only in dvisvgm-2.13: missing +diff --strip-trailing-cr -u1 -r dvisvgm-2.13/src/Makefile.am dvisvgm-src/src/Makefile.am +--- dvisvgm-2.13/src/Makefile.am 2022-01-18 05:39:00.000000000 -0800 ++++ dvisvgm-src/src/Makefile.am 2022-01-21 09:15:51.801456314 -0800 +@@ -6,3 +6,3 @@ bin_PROGRAMS = dvisvgm -noinst_LTLIBRARIES = libdvisvgm.la +noinst_LIBRARIES = libdvisvgm.a SUBDIRS = optimizer - -@@ -15,11 +15,9 @@ - +@@ -16,9 +16,7 @@ dvisvgm_LDADD = \ - $(noinst_LTLIBRARIES) \ + $(noinst_LIBRARIES) \ @@ -44,9 +46,7 @@ diff '--exclude=*~' '--exclude=*.py[co]' '--exclude=*.[ao]' '--exclude=CVS' '--e - $(ZLIB_LIBS) + $(XXHASH_LIBS) - if ENABLE_WOFF -@@ -36,7 +34,15 @@ - endif +@@ -37,5 +35,13 @@ -dvisvgm_DEPENDENCIES = $(noinst_LTLIBRARIES) +dvisvgm_LDADD += \ @@ -62,9 +62,7 @@ diff '--exclude=*~' '--exclude=*.py[co]' '--exclude=*.[ao]' '--exclude=CVS' '--e + +libdvisvgm_a_SOURCES = \ AGLTable.hpp \ - BasicDVIReader.hpp BasicDVIReader.cpp \ -@@ -161,26 +167,30 @@ - +@@ -164,20 +170,14 @@ if ENABLE_WOFF -libdvisvgm_la_SOURCES += ffwrapper.c ffwrapper.h +libdvisvgm_a_SOURCES += ffwrapper.c ffwrapper.h @@ -90,7 +88,7 @@ diff '--exclude=*~' '--exclude=*.py[co]' '--exclude=*.[ao]' '--exclude=CVS' '--e - $(CODE_COVERAGE_CFLAGS) + -I$(dvisvgm_srcdir)/libs/variant/include - AM_CXXFLAGS += \ +@@ -185,3 +185,13 @@ $(POTRACE_CFLAGS) \ - $(XXHASH_CFLAGS) + $(XXHASH_CFLAGS) \ @@ -105,16 +103,12 @@ diff '--exclude=*~' '--exclude=*.py[co]' '--exclude=*.[ao]' '--exclude=CVS' '--e +AM_CXXFLAGS += -DTEXLIVEWIN32 +endif WIN32 - AM_LDFLAGS = \ -@@ -193,6 +203,4 @@ - -I$(dvisvgm_srcdir)/libs/ff-woff/inc +@@ -196,4 +206,2 @@ -AM_CXXFLAGS += $(TTFAUTOHINT_CFLAGS) - AM_CXXFLAGS += \ - $(BROTLI_CFLAGS) \ -@@ -205,7 +213,8 @@ - endif +@@ -208,5 +216,6 @@ -AM_LDFLAGS += $(TTFAUTOHINT_LIBS) endif @@ -122,14 +116,11 @@ diff '--exclude=*~' '--exclude=*.py[co]' '--exclude=*.[ao]' '--exclude=CVS' '--e +# TL: do not try to rebuild these source files. +if ! TEXLIVE_BUILD - # the command-line parser class is generated from options.xml by opt2cpp -@@ -221,6 +230,14 @@ - +@@ -224,2 +233,3 @@ psdefs.ps: ; +endif ! TEXLIVE_BUILD - @CODE_COVERAGE_RULES@ - +@@ -228 +238,8 @@ CLEANFILES = *.gcda *.gcno + +# Rebuild libkpathsea: @@ -138,14 +129,15 @@ diff '--exclude=*~' '--exclude=*.py[co]' '--exclude=*.[ao]' '--exclude=CVS' '--e +@FREETYPE2_RULE@ +# Rebuild libz: +@ZLIB_RULE@ -diff '--exclude=*~' '--exclude=*.py[co]' '--exclude=*.[ao]' '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=autom4te.cache' '--exclude=Makefile.in' '--exclude=configure' '--exclude=Work' '--exclude=inst' '--exclude=build-pdftex' '--ignore-matching-lines=\$Id' -u2r dvisvgm-2.11.1/src/optimizer/Makefile.am dvisvgm-src/src/optimizer/Makefile.am ---- dvisvgm-2.11.1/src/optimizer/Makefile.am 2021-01-21 06:06:33.000000000 -0800 -+++ dvisvgm-src/src/optimizer/Makefile.am 2020-11-25 00:24:36.317206031 -0800 -@@ -1,5 +1,5 @@ +Only in dvisvgm-src/src: Makefile.am~ +diff --strip-trailing-cr -u1 -r dvisvgm-2.13/src/optimizer/Makefile.am dvisvgm-src/src/optimizer/Makefile.am +--- dvisvgm-2.13/src/optimizer/Makefile.am 2019-12-06 00:42:54.000000000 -0800 ++++ dvisvgm-src/src/optimizer/Makefile.am 2022-01-21 09:15:51.801456314 -0800 +@@ -1,4 +1,4 @@ -noinst_LTLIBRARIES = liboptimizer.la +noinst_LIBRARIES = liboptimizer.a -liboptimizer_la_SOURCES = \ +liboptimizer_a_SOURCES = \ AttributeExtractor.hpp AttributeExtractor.cpp \ - DependencyGraph.hpp \ +Only in dvisvgm-2.13: test-driver diff --git a/Build/source/texk/dvisvgm/configure b/Build/source/texk/dvisvgm/configure index 096fb607dec..6b0e8551a53 100755 --- a/Build/source/texk/dvisvgm/configure +++ b/Build/source/texk/dvisvgm/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for dvisvgm (TeX Live) 2.11.1. +# Generated by GNU Autoconf 2.71 for dvisvgm (TeX Live) 2.13. # # Report bugs to <tex-k@tug.org>. # @@ -629,8 +629,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='dvisvgm (TeX Live)' PACKAGE_TARNAME='dvisvgm--tex-live-' -PACKAGE_VERSION='2.11.1' -PACKAGE_STRING='dvisvgm (TeX Live) 2.11.1' +PACKAGE_VERSION='2.13' +PACKAGE_STRING='dvisvgm (TeX Live) 2.13' PACKAGE_BUGREPORT='tex-k@tug.org' PACKAGE_URL='' @@ -1437,7 +1437,7 @@ 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 dvisvgm (TeX Live) 2.11.1 to adapt to many kinds of systems. +\`configure' configures dvisvgm (TeX Live) 2.13 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1509,7 +1509,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of dvisvgm (TeX Live) 2.11.1:";; + short | recursive ) echo "Configuration of dvisvgm (TeX Live) 2.13:";; esac cat <<\_ACEOF @@ -1642,7 +1642,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -dvisvgm (TeX Live) configure 2.11.1 +dvisvgm (TeX Live) configure 2.13 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -2404,7 +2404,7 @@ 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 dvisvgm (TeX Live) $as_me 2.11.1, which was +It was created by dvisvgm (TeX Live) $as_me 2.13, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3381,7 +3381,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -DATE="January 2021" +DATE="January 2022" ac_config_headers="$ac_config_headers config.h" @@ -9015,7 +9015,7 @@ fi # Define the identity of the package. PACKAGE='dvisvgm--tex-live-' - VERSION='2.11.1' + VERSION='2.13' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -21413,7 +21413,7 @@ Usage: $0 [OPTIONS] Report bugs to <bug-libtool@gnu.org>." lt_cl_version="\ -dvisvgm (TeX Live) config.lt 2.11.1 +dvisvgm (TeX Live) config.lt 2.13 configured by $0, generated by GNU Autoconf 2.71. Copyright (C) 2011 Free Software Foundation, Inc. @@ -24822,7 +24822,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by dvisvgm (TeX Live) $as_me 2.11.1, which was +This file was extended by dvisvgm (TeX Live) $as_me 2.13, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -24890,7 +24890,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -dvisvgm (TeX Live) config.status 2.11.1 +dvisvgm (TeX Live) config.status 2.13 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff --git a/Build/source/texk/dvisvgm/configure.ac b/Build/source/texk/dvisvgm/configure.ac index 99ba8473dc7..e1da5290521 100644 --- a/Build/source/texk/dvisvgm/configure.ac +++ b/Build/source/texk/dvisvgm/configure.ac @@ -2,7 +2,7 @@ dnl $Id$ dnl Process this file with autoconf to produce a configure script dnl for dvisvgm in TeX Live. dnl -dnl Copyright 2015-2021 Karl Berry <tex-live@tug.org> +dnl Copyright 2015-2022 Karl Berry <tex-live@tug.org> dnl Copyright 2009-2014 Peter Breitenlohner <tex-live@tug.org> dnl dnl This file is free software; the copyright holder @@ -10,12 +10,12 @@ dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl Adapted for TeX Live from original dvisvgm configure.ac -dnl Copyright 2005-2020 Martin Gieseking +dnl Copyright 2005-2022 Martin Gieseking dnl AC_PREREQ([2.65]) m4_include([version.ac])[] dnl define dvisvgm_version AC_INIT([dvisvgm (TeX Live)], dvisvgm_version, [tex-k@tug.org]) -DATE="January 2021" +DATE="January 2022" AC_CONFIG_SRCDIR([dvisvgm-src/src/dvisvgm.cpp]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_MACRO_DIRS([../../m4])dnl not just _DIR diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/ChangeLog b/Build/source/texk/dvisvgm/dvisvgm-src/ChangeLog new file mode 100644 index 00000000000..c215c9f4410 --- /dev/null +++ b/Build/source/texk/dvisvgm/dvisvgm-src/ChangeLog @@ -0,0 +1,10893 @@ +2022-01-19 Martin Gieseking <martin.gieseking@uos.de> + + * .github/workflows/c-cpp.yml: + CI: ensure latest package updates are installed + + * README.md: + updated README + +2022-01-18 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.1, doc/dvisvgm.txt.in: + reworded some sentences of the manual page +closes #159 + + * .appveyor.yml, configure.ac, doc/dvisvgm.1, src/Doxyfile, + src/version.hpp: + set version to 2.13 + +2022-01-17 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS: + updated NEWS + +2022-01-11 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile.am, README, README.md, configure.ac, doc/Makefile.am, + doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, + doc/dvisvgm.txt.in, doc/tweak-db-article.xsl, doc/tweak-db-refentry.xsl, + doc/tweak-dblatex-pdf.xsl, libs/Makefile.am, + libs/ff-woff/fontforge/tmpfile2.cpp, src/AGLTable.hpp, + src/BasicDVIReader.cpp, src/BasicDVIReader.hpp, src/Bezier.cpp, + src/Bezier.hpp, src/BgColorSpecialHandler.cpp, + src/BgColorSpecialHandler.hpp, src/Bitmap.cpp, src/Bitmap.hpp, + src/BoundingBox.cpp, src/BoundingBox.hpp, src/CLCommandLine.cpp, + src/CLCommandLine.hpp, src/CLOption.hpp, src/CMap.cpp, src/CMap.hpp, + src/CMapManager.cpp, src/CMapManager.hpp, src/CMapReader.cpp, + src/CMapReader.hpp, src/Calculator.cpp, src/Calculator.hpp, + src/CharMapID.cpp, src/CharMapID.hpp, src/Character.hpp, src/Color.cpp, + src/Color.hpp, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, + src/CommandLine.hpp, src/DLLoader.cpp, src/DLLoader.hpp, + src/DVIActions.hpp, src/DVIReader.cpp, src/DVIReader.hpp, + src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.hpp, src/Directory.cpp, src/Directory.hpp, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, + src/EPSFile.cpp, src/EPSFile.hpp, src/EPSToSVG.hpp, + src/EllipticalArc.cpp, src/EllipticalArc.hpp, src/EmSpecialHandler.cpp, + src/EmSpecialHandler.hpp, src/EncFile.cpp, src/EncFile.hpp, + src/FileFinder.cpp, src/FileFinder.hpp, src/FilePath.cpp, + src/FilePath.hpp, src/FileSystem.cpp, src/FileSystem.hpp, + src/FixWord.hpp, src/Font.cpp, src/Font.hpp, src/FontCache.cpp, + src/FontCache.hpp, src/FontEncoding.cpp, src/FontEncoding.hpp, + src/FontEngine.cpp, src/FontEngine.hpp, src/FontManager.cpp, + src/FontManager.hpp, src/FontMap.cpp, src/FontMap.hpp, + src/FontMetrics.cpp, src/FontMetrics.hpp, src/FontStyle.hpp, + src/FontWriter.cpp, src/FontWriter.hpp, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.hpp, src/GFReader.cpp, src/GFReader.hpp, + src/GFTracer.cpp, src/GFTracer.hpp, src/Ghostscript.cpp, + src/Ghostscript.hpp, src/Glyph.hpp, src/GlyphTracerMessages.hpp, + src/GraphicsPath.hpp, src/HashFunction.cpp, src/HashFunction.hpp, + src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, + src/HyperlinkManager.cpp, src/HyperlinkManager.hpp, src/ImageToSVG.cpp, + src/ImageToSVG.hpp, src/InputBuffer.cpp, src/InputBuffer.hpp, + src/InputReader.cpp, src/InputReader.hpp, src/JFM.cpp, src/JFM.hpp, + src/Length.cpp, src/Length.hpp, src/MD5HashFunction.hpp, src/Makefile.am, + src/MapLine.cpp, src/MapLine.hpp, src/Matrix.cpp, src/Matrix.hpp, + src/Message.cpp, src/Message.hpp, src/MessageException.hpp, + src/MetafontWrapper.cpp, src/MetafontWrapper.hpp, src/MiKTeXCom.cpp, + src/MiKTeXCom.hpp, src/NoPsSpecialHandler.cpp, + src/NoPsSpecialHandler.hpp, src/NumericRanges.hpp, src/Opacity.cpp, + src/Opacity.hpp, src/PDFParser.cpp, src/PDFParser.hpp, src/PDFToSVG.hpp, + src/PSFilter.hpp, src/PSInterpreter.cpp, src/PSInterpreter.hpp, + src/PSPattern.cpp, src/PSPattern.hpp, src/PSPreviewFilter.cpp, + src/PSPreviewFilter.hpp, src/PageRanges.cpp, src/PageRanges.hpp, + src/PageSize.cpp, src/PageSize.hpp, src/Pair.hpp, + src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, + src/PathClipper.cpp, src/PathClipper.hpp, src/PdfSpecialHandler.cpp, + src/PdfSpecialHandler.hpp, src/PreScanDVIReader.cpp, + src/PreScanDVIReader.hpp, src/Process.cpp, src/Process.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/RangeMap.cpp, + src/RangeMap.hpp, src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, + src/SVGCharHandlerFactory.cpp, src/SVGCharHandlerFactory.hpp, + src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.hpp, + src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.hpp, + src/SVGElement.cpp, src/SVGElement.hpp, src/SVGOutput.cpp, + src/SVGOutput.hpp, src/SVGSingleCharTextHandler.cpp, + src/SVGSingleCharTextHandler.hpp, src/SVGTree.cpp, src/SVGTree.hpp, + src/ShadingPatch.cpp, src/ShadingPatch.hpp, src/SignalHandler.cpp, + src/SignalHandler.hpp, src/SourceInput.cpp, src/SourceInput.hpp, + src/SpecialActions.hpp, src/SpecialHandler.hpp, src/SpecialManager.cpp, + src/SpecialManager.hpp, src/StreamReader.cpp, src/StreamReader.hpp, + src/StreamWriter.cpp, src/StreamWriter.hpp, src/Subfont.cpp, + src/Subfont.hpp, src/System.cpp, src/System.hpp, src/TFM.cpp, + src/TFM.hpp, src/TTFAutohint.cpp, src/TTFAutohint.hpp, + src/TensorProductPatch.cpp, src/TensorProductPatch.hpp, src/Terminal.cpp, + src/Terminal.hpp, src/ToUnicodeMap.cpp, src/ToUnicodeMap.hpp, + src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp, + src/TriangularPatch.cpp, src/TriangularPatch.hpp, src/TrueTypeFont.cpp, + src/TrueTypeFont.hpp, src/Unicode.cpp, src/Unicode.hpp, + src/VFActions.hpp, src/VFReader.cpp, src/VFReader.hpp, + src/VectorIterator.hpp, src/VectorStream.hpp, src/XMLDocument.cpp, + src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.hpp, src/XMLString.cpp, + src/XMLString.hpp, src/XXHashFunction.hpp, src/ZLibOutputStream.hpp, + src/dvisvgm.cpp, src/ffwrapper.c, src/ffwrapper.h, src/macros.hpp, + src/optimizer/AttributeExtractor.cpp, + src/optimizer/AttributeExtractor.hpp, src/optimizer/DependencyGraph.hpp, + src/optimizer/GroupCollapser.cpp, src/optimizer/GroupCollapser.hpp, + src/optimizer/OptimizerModule.hpp, + src/optimizer/RedundantElementRemover.cpp, + src/optimizer/RedundantElementRemover.hpp, + src/optimizer/SVGOptimizer.cpp, src/optimizer/SVGOptimizer.hpp, + src/optimizer/TextSimplifier.cpp, src/optimizer/TextSimplifier.hpp, + src/optimizer/TransformSimplifier.cpp, + src/optimizer/TransformSimplifier.hpp, src/optimizer/WSNodeRemover.cpp, + src/optimizer/WSNodeRemover.hpp, src/options.dtd, src/options.xml, + src/psdefs.cpp, src/utility.cpp, src/utility.hpp, src/version.hpp.in, + src/windows.hpp, tests/BezierTest.cpp, tests/BitmapTest.cpp, + tests/BoundingBoxTest.cpp, tests/CMapManagerTest.cpp, + tests/CMapReaderTest.cpp, tests/CMapTest.cpp, tests/CalculatorTest.cpp, + tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, + tests/CommandLineTest.cpp, tests/DVIReaderTest.cpp, + tests/DependencyGraphTest.cpp, tests/DirectoryTest.cpp, + tests/DvisvgmSpecialTest.cpp, tests/EllipticalArcTest.cpp, + tests/EmSpecialTest.cpp, tests/FileFinderTest.cpp, + tests/FilePathTest.cpp, tests/FileSystemTest.cpp, + tests/FontCacheTest.cpp, tests/FontManagerTest.cpp, + tests/FontMapTest.cpp, tests/GFGlyphTracerTest.cpp, + tests/GFReaderTest.cpp, tests/GhostscriptTest.cpp, + tests/GraphicsPathTest.cpp, tests/HashFunctionTest.cpp, + tests/JFMReaderTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, + tests/MapLineTest.cpp, tests/MatrixTest.cpp, + tests/MessageExceptionTest.cpp, tests/PDFParserTest.cpp, + tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, + tests/PageSizeTest.cpp, tests/PairTest.cpp, + tests/PapersizeSpecialTest.cpp, tests/RangeMapTest.cpp, + tests/SVGOutputTest.cpp, tests/ShadingPatchTest.cpp, + tests/SpecialManagerTest.cpp, tests/SplittedCharInputBufferTest.cpp, + tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, + tests/StreamWriterTest.cpp, tests/StringMatcherTest.cpp, + tests/SubfontTest.cpp, tests/TFMReaderTest.cpp, + tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, + tests/TpicSpecialTest.cpp, tests/TriangularPatchTest.cpp, + tests/UnicodeTest.cpp, tests/UtilityTest.cpp, + tests/VectorIteratorTest.cpp, tests/VectorStreamTest.cpp, + tests/XMLNodeTest.cpp, tests/XMLStringTest.cpp, tests/check-conv, + tests/create-makefile, tests/data/Makefile.am, tests/genhashcheck.py, + tests/normalize.xsl, tests/testmain.cpp: + updated year in copyright statements to 2022 + +2022-01-10 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am: + don't build manpage in parallel +closes #171 + +2021-12-05 Martin Gieseking <martin.gieseking@uos.de> + + * libs/brotli/enc/encode.c: + fixed parameter type warning in Brotli library + +2021-12-04 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml: + updated Windows platform toolset to version 143 + +2021-12-03 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.1, doc/dvisvgm.txt.in, src/dvisvgm.cpp: + allow for conversion of multiple given EPS files + + * src/DVIToSVG.cpp: + fixed setting of hash algorithm given on command-line + + * doc/dvisvgm.1, doc/dvisvgm.txt.in, src/SVGOutput.cpp, src/SVGOutput.hpp, + src/dvisvgm.cpp: + added variables n and N to option --output + +2021-12-01 Martin Gieseking <martin.gieseking@uos.de> + + * src/InputReader.cpp: + replaced deprecated std::ptr_fun + +2021-11-30 Martin Gieseking <martin.gieseking@uos.de> + + * libs/xxHash/xxh3.h, libs/xxHash/xxhash.h: + updated xxHash to version 0.8.1 + + * doc/dvisvgm.1, doc/dvisvgm.txt.in: + manpage: extended introduction of section 'supported specials' + +2021-11-28 Martin Gieseking <martin.gieseking@uos.de> + + * src/Font.cpp, src/FontEngine.cpp, src/FontEngine.hpp: + use glyph metrics from font file to compute height and depth + + * doc/dvisvgm.1, doc/dvisvgm.txt.in: + manpage: slightly changed wording regarding the bgcolor handler + +2021-11-02 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml: + removed Travis configuration + +2021-10-30 Naveen M K <naveen521kk@gmail.com> + + * src/FileSystem.cpp: + mingw: fix for gcc 11 + +2021-09-26 Martin Gieseking <martin.gieseking@uos.de> + + * src/optimizer/GroupCollapser.cpp, src/optimizer/GroupCollapser.hpp, + src/optimizer/SVGOptimizer.cpp: + simplify transform attributes only if 'simplify-transform' is given + +2021-09-12 Martin Gieseking <martin.gieseking@uos.de> + + * tests/UtilityTest.cpp: + prevent creating temporaries in test loop + +2021-09-07 Martin Gieseking <martin.gieseking@uos.de> + + * tests/gtest/include/gtest/gtest-death-test.h, + tests/gtest/include/gtest/gtest-matchers.h, + tests/gtest/include/gtest/gtest-message.h, + tests/gtest/include/gtest/gtest-param-test.h, + tests/gtest/include/gtest/gtest-printers.h, + tests/gtest/include/gtest/gtest-spi.h, + tests/gtest/include/gtest/gtest-test-part.h, + tests/gtest/include/gtest/gtest-typed-test.h, + tests/gtest/include/gtest/gtest.h, + tests/gtest/include/gtest/gtest_pred_impl.h, + tests/gtest/include/gtest/gtest_prod.h, + tests/gtest/include/gtest/internal/custom/gtest-port.h, + tests/gtest/include/gtest/internal/custom/gtest-printers.h, + tests/gtest/include/gtest/internal/custom/gtest.h, + tests/gtest/include/gtest/internal/gtest-death-test-internal.h, + tests/gtest/include/gtest/internal/gtest-filepath.h, + tests/gtest/include/gtest/internal/gtest-internal.h, + tests/gtest/include/gtest/internal/gtest-param-util.h, + tests/gtest/include/gtest/internal/gtest-port-arch.h, + tests/gtest/include/gtest/internal/gtest-port.h, + tests/gtest/include/gtest/internal/gtest-string.h, + tests/gtest/include/gtest/internal/gtest-type-util.h, + tests/gtest/src/gtest-death-test.cc, tests/gtest/src/gtest-filepath.cc, + tests/gtest/src/gtest-internal-inl.h, tests/gtest/src/gtest-matchers.cc, + tests/gtest/src/gtest-port.cc, tests/gtest/src/gtest-printers.cc, + tests/gtest/src/gtest-test-part.cc, tests/gtest/src/gtest-typed-test.cc, + tests/gtest/src/gtest.cc, tests/gtest/src/gtest_main.cc, + tests/testutil.hpp: + updated gtest to version 1.11 + +2021-08-26 Martin Gieseking <martin.gieseking@uos.de> + + * src/optimizer/GroupCollapser.cpp, src/optimizer/GroupCollapser.hpp: + GroupCollapser: simplify transform attributes after combining them + +2021-08-16 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, doc/dvisvgm.1, src/Doxyfile, + src/version.hpp: + set version to 2.12 + + * NEWS: + updated NEWS + +2021-08-15 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + skip fill actions if colorspace with unsupported pattern type is active + +2021-08-13 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp: + ensure adding color attribute to tiling patterns +(closes #158) + +2021-07-19 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml: + updated FreeType to version 2.11 + +2021-07-04 Martin Gieseking <martin.gieseking@uos.de> + + * src/FilePath.cpp: + prevent out-of-bounds access + + * src/InputBuffer.hpp: + delete unused assignment operator + +2021-06-15 Martin Gieseking <martin.gieseking@uos.de> + + * .gitattributes: + Update .gitattributes + +marked all files in libs and its subfolders as + vendored code + +2021-06-13 Martin Gieseking <martin.gieseking@uos.de> + + * src/FilePath.cpp: + fixed handling of root directories in file paths + + * src/FilePath.cpp, src/FileSystem.cpp, tests/FilePathTest.cpp: + improved handling of drive letters on Windows + +2021-06-11 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + fixed displaced graphics if PDF MediaBox isn't located at origin + + * tests/data/Makefile.am: + added missing test data file to Makefile + +2021-06-10 Martin Gieseking <martin.gieseking@uos.de> + + * m4/ax_cxx_compile_stdcxx.m4: + ax_cxx_compile_stdcxx.m4 to version 12 + +2021-05-30 Martin Gieseking <martin.gieseking@uos.de> + + * src/Font.hpp: + simplified boolean expression + + * src/Font.hpp, src/SVGCharPathHandler.cpp: + removed default parameter from virtual methods + +2021-05-25 Martin Gieseking <martin.gieseking@uos.de> + + * src/PSPattern.hpp, src/PsSpecialHandler.cpp: + removed dynamic casting in processing of PS patterns + + * src/PdfSpecialHandler.cpp: + replaced dynamic_cast with static_cast as type is unambiguous + + * src/TensorProductPatch.cpp, src/TriangularPatch.cpp: + replaced dynamic casts of shading patches with PS type comparisons + + * src/CMapManager.cpp: + replaced dynamic cast of CMap type test with existing method + mapsToUnicode() + +2021-05-24 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, + src/Font.cpp, src/Font.hpp, src/FontEngine.cpp, src/FontManager.cpp, + src/SVGCharHandler.cpp, src/SVGCharPathHandler.cpp, + src/SVGCharTspanTextHandler.cpp, src/SVGTree.cpp, src/utility.hpp, + tests/FontManagerTest.cpp, tests/data/lmmono12-regular.otf: + added font_cast to replace dynamic casts of Font pointers + +2021-05-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp, src/FontMetrics.hpp, src/JFM.hpp: + replaced dynamic cast to test for JFM with dedicated method + +2021-04-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + fixed PS error thrown when trying to set a shading pattern + + * src/PsSpecialHandler.cpp, src/SVGElement.cpp, src/SVGElement.hpp: + always add fill attribute to pattern paths + +2021-04-10 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.1, doc/dvisvgm.txt.in: + reworded few parts of the manual page + +2021-04-01 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + restore proper context node at end of pattern definition + +2021-03-22 Martin Gieseking <martin.gieseking@uos.de> + + * src/GraphicsPath.hpp: + use std::equal to check equality of GraphicsPaths + + * src/EllipticalArc.cpp, src/Matrix.cpp, src/Matrix.hpp, + tests/MatrixTest.cpp: + Matrix: added default constructor; explicit init list constructor + + * src/GFReader.cpp, src/Message.cpp, src/VectorIterator.hpp: + removed redundant index checks + + * src/DVIToSVG.cpp, src/DVIToSVG.hpp: + initialize basic members outside constructor body + + * src/DvisvgmSpecialHandler.cpp: + two small code improvements + + * src/FontManager.cpp: + removed redundant check + + * src/GFGlyphTracer.cpp, src/GFGlyphTracer.hpp, src/HyperlinkManager.hpp, + src/PSInterpreter.cpp, src/PsSpecialHandler.cpp: + added missing const to reference parameters + + * src/InputBuffer.hpp: + prevent unwanted copying of input buffers + +2021-03-15 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.1: + fixed typo in manual + + * src/PSInterpreter.cpp: + fixed expression to check current GS running mode + + * src/SVGSingleCharTextHandler.cpp: + reset change flag of color and opacity properties unconditionally + + * src/SVGCharTspanTextHandler.cpp: + create initial tspan if opacity values differ from defaults + + * src/Ghostscript.cpp, src/Ghostscript.hpp, src/PSInterpreter.cpp, + src/PSInterpreter.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: + update opacity settings on grestore +Requires GS >= 9.52 because earlier + versions only provide operators to set the +opacity/blendmode values and + none to retrieve them. + + * src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PsSpecialHandler.hpp, + src/psdefs.cpp, tests/PSInterpreterTest.cpp: + renamed PS operator setisshapealpha + + * src/dvisvgm.cpp: + added missing parenthesis in info message + +2021-03-14 Martin Gieseking <martin.gieseking@uos.de> + + * src/optimizer/GroupCollapser.cpp, src/optimizer/TextSimplifier.cpp: + minor loop optimizations + + * src/XMLNode.cpp: + don't create newlines inside text elements +since they may lead to + additional whitespace, e.g. between tspans that lack absolute coordinates + + * src/SVGCharPathHandler.cpp, src/SVGElement.cpp, src/SVGElement.hpp: + don't add style attributes to groups because they're not inheritable + +2021-03-13 Martin Gieseking <martin.gieseking@uos.de> + + * src/Makefile.am, src/Opacity.cpp, src/Opacity.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp: + combined alpha and blendmode values into dedicated class + + * src/SVGCharHandler.hpp: + added default and move constructor to CharProperty + + * src/DVIToSVGActions.hpp, src/ImageToSVG.hpp, src/Opacity.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, + src/SVGCharHandler.hpp, src/SVGCharPathHandler.cpp, + src/SVGCharTspanTextHandler.cpp, src/SVGSingleCharTextHandler.cpp, + src/SVGTree.hpp, src/SpecialActions.hpp: + added opacity properties to text elements + + * src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, + src/SVGCharPathHandler.cpp, src/SVGCharTspanTextHandler.cpp, + src/SVGSingleCharTextHandler.cpp: + added shorthand operator for CharProperty::get() + + * src/Opacity.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp: + PS handler: replaced isolated opacity variables with Opacity class + + * src/Makefile.am, src/Opacity.hpp, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.hpp, src/SVGElement.cpp, src/SVGElement.hpp, + src/XMLNode.hpp: + added class to handle SVG attributes in a uniform manner + + * src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, + src/EmSpecialHandler.cpp, src/HyperlinkManager.cpp, src/ImageToSVG.hpp, + src/PSPattern.cpp, src/PsSpecialHandler.cpp, src/SVGCharHandler.cpp, + src/SVGCharHandler.hpp, src/SVGCharPathHandler.cpp, + src/SVGCharPathHandler.hpp, src/SVGCharTspanTextHandler.cpp, + src/SVGCharTspanTextHandler.hpp, src/SVGElement.cpp, src/SVGElement.hpp, + src/SVGSingleCharTextHandler.cpp, src/SVGTree.cpp, src/SVGTree.hpp, + src/SpecialActions.hpp, src/TpicSpecialHandler.cpp, + tests/TpicSpecialTest.cpp: + added opacity properties to graphics elements created outside the PS + handler +(closes #148) + + * src/EmSpecialHandler.cpp, src/SVGElement.cpp, src/SVGElement.hpp, + src/TpicSpecialHandler.cpp, tests/EmSpecialTest.cpp, + tests/TpicSpecialTest.cpp: + unified handling of "point" attributes + + * src/EmSpecialHandler.cpp, src/SVGCharHandler.cpp, + src/SVGCharPathHandler.cpp, src/SVGElement.cpp, src/SVGTree.cpp, + src/TpicSpecialHandler.cpp: + removed redundant casts to XMLString + +2021-03-05 Martin Gieseking <martin.gieseking@uos.de> + + * .github/workflows/c-cpp.yml: + added GitHub CI configuration + + * .github/workflows/c-cpp.yml: + removed distcheck from CI + + * README.md: + added GitHub CI badge; removed Copr badge + +2021-03-04 Martin Gieseking <martin.gieseking@uos.de> + + * src/BgColorSpecialHandler.cpp, src/BoundingBox.cpp, + src/DvisvgmSpecialHandler.cpp, src/EllipticalArc.cpp, + src/EmSpecialHandler.cpp, src/FontCache.cpp, src/FontEngine.cpp, + src/FontManager.cpp, src/FontWriter.cpp, src/PSInterpreter.cpp, + src/PapersizeSpecialHandler.cpp, src/RangeMap.cpp, src/Subfont.cpp, + src/TpicSpecialHandler.cpp, src/TrueTypeFont.cpp, src/XMLDocument.cpp, + src/XMLNode.cpp, src/dvisvgm.cpp, src/utility.cpp: + avoid copying objects in emplace methods + +2021-02-15 Martin Gieseking <martin.gieseking@uos.de> + + * .gitignore: + added .pyc to ignored file suffixes + +2021-02-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/FilePath.cpp, src/FileSystem.cpp, src/FileSystem.hpp: + improved handling of differing drive letters in Windows file paths + +2021-01-27 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in: + fixed typo in manual + +2021-01-26 Martin Gieseking <martin.gieseking@uos.de> + + * doc/tweak-dblatex-tex.py: + updated tweak-dblatex-tex to Python 3 + +2021-01-21 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, doc/dvisvgm.1, src/Doxyfile, + src/version.hpp: + set version to 2.11.1 + + * NEWS: + updated NEWS + +2021-01-03 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile.am, README, README.md, configure.ac, doc/Makefile.am, + doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, + doc/dvisvgm.1, doc/dvisvgm.txt.in, doc/tweak-db-article.xsl, + doc/tweak-db-refentry.xsl, doc/tweak-dblatex-pdf.xsl, libs/Makefile.am, + libs/ff-woff/fontforge/tmpfile2.cpp, src/AGLTable.hpp, + src/BasicDVIReader.cpp, src/BasicDVIReader.hpp, src/Bezier.cpp, + src/Bezier.hpp, src/BgColorSpecialHandler.cpp, + src/BgColorSpecialHandler.hpp, src/Bitmap.cpp, src/Bitmap.hpp, + src/BoundingBox.cpp, src/BoundingBox.hpp, src/CLCommandLine.cpp, + src/CLCommandLine.hpp, src/CLOption.hpp, src/CMap.cpp, src/CMap.hpp, + src/CMapManager.cpp, src/CMapManager.hpp, src/CMapReader.cpp, + src/CMapReader.hpp, src/Calculator.cpp, src/Calculator.hpp, + src/CharMapID.cpp, src/CharMapID.hpp, src/Character.hpp, src/Color.cpp, + src/Color.hpp, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, + src/CommandLine.hpp, src/DLLoader.cpp, src/DLLoader.hpp, + src/DVIActions.hpp, src/DVIReader.cpp, src/DVIReader.hpp, + src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.hpp, src/Directory.cpp, src/Directory.hpp, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, + src/EPSFile.cpp, src/EPSFile.hpp, src/EPSToSVG.hpp, + src/EllipticalArc.cpp, src/EllipticalArc.hpp, src/EmSpecialHandler.cpp, + src/EmSpecialHandler.hpp, src/EncFile.cpp, src/EncFile.hpp, + src/FileFinder.cpp, src/FileFinder.hpp, src/FilePath.cpp, + src/FilePath.hpp, src/FileSystem.cpp, src/FileSystem.hpp, + src/FixWord.hpp, src/Font.cpp, src/Font.hpp, src/FontCache.cpp, + src/FontCache.hpp, src/FontEncoding.cpp, src/FontEncoding.hpp, + src/FontEngine.cpp, src/FontEngine.hpp, src/FontManager.cpp, + src/FontManager.hpp, src/FontMap.cpp, src/FontMap.hpp, + src/FontMetrics.cpp, src/FontMetrics.hpp, src/FontStyle.hpp, + src/FontWriter.cpp, src/FontWriter.hpp, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.hpp, src/GFReader.cpp, src/GFReader.hpp, + src/GFTracer.cpp, src/GFTracer.hpp, src/Ghostscript.cpp, + src/Ghostscript.hpp, src/Glyph.hpp, src/GlyphTracerMessages.hpp, + src/GraphicsPath.hpp, src/HashFunction.cpp, src/HashFunction.hpp, + src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, + src/HyperlinkManager.cpp, src/HyperlinkManager.hpp, src/ImageToSVG.cpp, + src/ImageToSVG.hpp, src/InputBuffer.cpp, src/InputBuffer.hpp, + src/InputReader.cpp, src/InputReader.hpp, src/JFM.cpp, src/JFM.hpp, + src/Length.cpp, src/Length.hpp, src/MD5HashFunction.hpp, src/Makefile.am, + src/MapLine.cpp, src/MapLine.hpp, src/Matrix.cpp, src/Matrix.hpp, + src/Message.cpp, src/Message.hpp, src/MessageException.hpp, + src/MetafontWrapper.cpp, src/MetafontWrapper.hpp, src/MiKTeXCom.cpp, + src/MiKTeXCom.hpp, src/NoPsSpecialHandler.cpp, + src/NoPsSpecialHandler.hpp, src/NumericRanges.hpp, src/PDFParser.cpp, + src/PDFParser.hpp, src/PDFToSVG.hpp, src/PSFilter.hpp, + src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PSPattern.cpp, + src/PSPattern.hpp, src/PSPreviewFilter.cpp, src/PSPreviewFilter.hpp, + src/PageRanges.cpp, src/PageRanges.hpp, src/PageSize.cpp, + src/PageSize.hpp, src/Pair.hpp, src/PapersizeSpecialHandler.cpp, + src/PapersizeSpecialHandler.hpp, src/PathClipper.cpp, + src/PathClipper.hpp, src/PdfSpecialHandler.cpp, + src/PdfSpecialHandler.hpp, src/PreScanDVIReader.cpp, + src/PreScanDVIReader.hpp, src/Process.cpp, src/Process.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/RangeMap.cpp, + src/RangeMap.hpp, src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, + src/SVGCharHandlerFactory.cpp, src/SVGCharHandlerFactory.hpp, + src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.hpp, + src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.hpp, + src/SVGOutput.cpp, src/SVGOutput.hpp, src/SVGSingleCharTextHandler.cpp, + src/SVGSingleCharTextHandler.hpp, src/SVGTree.cpp, src/SVGTree.hpp, + src/ShadingPatch.cpp, src/ShadingPatch.hpp, src/SignalHandler.cpp, + src/SignalHandler.hpp, src/SourceInput.cpp, src/SourceInput.hpp, + src/SpecialActions.hpp, src/SpecialHandler.hpp, src/SpecialManager.cpp, + src/SpecialManager.hpp, src/StreamReader.cpp, src/StreamReader.hpp, + src/StreamWriter.cpp, src/StreamWriter.hpp, src/Subfont.cpp, + src/Subfont.hpp, src/System.cpp, src/System.hpp, src/TFM.cpp, + src/TFM.hpp, src/TTFAutohint.cpp, src/TTFAutohint.hpp, + src/TensorProductPatch.cpp, src/TensorProductPatch.hpp, src/Terminal.cpp, + src/Terminal.hpp, src/ToUnicodeMap.cpp, src/ToUnicodeMap.hpp, + src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp, + src/TriangularPatch.cpp, src/TriangularPatch.hpp, src/TrueTypeFont.cpp, + src/TrueTypeFont.hpp, src/Unicode.cpp, src/Unicode.hpp, + src/VFActions.hpp, src/VFReader.cpp, src/VFReader.hpp, + src/VectorIterator.hpp, src/VectorStream.hpp, src/XMLDocument.cpp, + src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.hpp, src/XMLString.cpp, + src/XMLString.hpp, src/XXHashFunction.hpp, src/ZLibOutputStream.hpp, + src/dvisvgm.cpp, src/ffwrapper.c, src/ffwrapper.h, src/macros.hpp, + src/optimizer/AttributeExtractor.cpp, + src/optimizer/AttributeExtractor.hpp, src/optimizer/DependencyGraph.hpp, + src/optimizer/GroupCollapser.cpp, src/optimizer/GroupCollapser.hpp, + src/optimizer/OptimizerModule.hpp, + src/optimizer/RedundantElementRemover.cpp, + src/optimizer/RedundantElementRemover.hpp, + src/optimizer/SVGOptimizer.cpp, src/optimizer/SVGOptimizer.hpp, + src/optimizer/TextSimplifier.cpp, src/optimizer/TextSimplifier.hpp, + src/optimizer/TransformSimplifier.cpp, + src/optimizer/TransformSimplifier.hpp, src/optimizer/WSNodeRemover.cpp, + src/optimizer/WSNodeRemover.hpp, src/options.dtd, src/options.xml, + src/psdefs.cpp, src/utility.cpp, src/utility.hpp, src/version.hpp, + src/version.hpp.in, src/windows.hpp, tests/BezierTest.cpp, + tests/BitmapTest.cpp, tests/BoundingBoxTest.cpp, + tests/CMapManagerTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, + tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, + tests/ColorTest.cpp, tests/CommandLineTest.cpp, tests/DVIReaderTest.cpp, + tests/DependencyGraphTest.cpp, tests/DirectoryTest.cpp, + tests/DvisvgmSpecialTest.cpp, tests/EllipticalArcTest.cpp, + tests/EmSpecialTest.cpp, tests/FileFinderTest.cpp, + tests/FilePathTest.cpp, tests/FileSystemTest.cpp, + tests/FontCacheTest.cpp, tests/FontManagerTest.cpp, + tests/FontMapTest.cpp, tests/GFGlyphTracerTest.cpp, + tests/GFReaderTest.cpp, tests/GhostscriptTest.cpp, + tests/GraphicsPathTest.cpp, tests/HashFunctionTest.cpp, + tests/JFMReaderTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, + tests/MapLineTest.cpp, tests/MatrixTest.cpp, + tests/MessageExceptionTest.cpp, tests/PDFParserTest.cpp, + tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, + tests/PageSizeTest.cpp, tests/PairTest.cpp, + tests/PapersizeSpecialTest.cpp, tests/RangeMapTest.cpp, + tests/SVGOutputTest.cpp, tests/ShadingPatchTest.cpp, + tests/SpecialManagerTest.cpp, tests/SplittedCharInputBufferTest.cpp, + tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, + tests/StreamWriterTest.cpp, tests/StringMatcherTest.cpp, + tests/SubfontTest.cpp, tests/TFMReaderTest.cpp, + tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, + tests/TpicSpecialTest.cpp, tests/TriangularPatchTest.cpp, + tests/UnicodeTest.cpp, tests/UtilityTest.cpp, + tests/VectorIteratorTest.cpp, tests/VectorStreamTest.cpp, + tests/XMLNodeTest.cpp, tests/XMLStringTest.cpp, tests/check-conv, + tests/create-makefile, tests/data/Makefile.am, tests/genhashcheck.py, + tests/normalize.xsl, tests/testmain.cpp: + updated year in copyright statements to 2021 + +2020-12-30 Martin Gieseking <martin.gieseking@uos.de> + + * src/Calculator.cpp, tests/CalculatorTest.cpp: + fixed a comment and added minor calculator tests + + * src/Calculator.cpp, src/Calculator.hpp, tests/CalculatorTest.cpp: + use variant type for token objects in class Calculator + +2020-12-29 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontEngine.cpp: + renamed some local variables + +2020-12-21 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontEngine.cpp: + ensure unambiguity of GID to charcode mappings +(fixes #147) + + * src/Font.cpp, src/FontEngine.cpp, src/FontEngine.hpp: + Renamed FontEngine::buildCharMap() + +2020-11-28 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, doc/dvisvgm.1, src/Doxyfile, + src/version.hpp: + set version to 2.11 + + * NEWS: + updated NEWS + +2020-11-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/BasicDVIReader.cpp, src/BasicDVIReader.hpp, src/DVIReader.cpp, + src/DVIReader.hpp: + moved low-level DVIReader functions to BasicDVIReader +and some code + cleanup + + * src/BasicDVIReader.cpp, src/BasicDVIReader.hpp, src/DVIReader.cpp, + src/DVIToSVG.cpp, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.hpp: + process mapline specials before fontdefs +to ensure all mapline + definitions are present when registering fonts + +2020-11-19 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontMap.cpp, src/Subfont.cpp, src/Subfont.hpp, + tests/SubfontTest.cpp: + SubfontDefinition: replaced reference parameter with return value + +2020-11-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/CMap.cpp, src/CMap.hpp, src/Font.cpp, src/FontEncoding.cpp, + src/FontEncoding.hpp: + keep selected Unicode fontmap if assigned CMap maps to Unicode + + * src/DVIReader.cpp, src/FontManager.cpp, src/FontManager.hpp: + added fallback for missing characters in JFM-based virtual fonts +(closes + #144) + +2020-11-17 Martin Gieseking <martin.gieseking@uos.de> + + * src/Unicode.cpp, src/Unicode.hpp, tests/UnicodeTest.cpp: + added functions to convert surrogate pairs + + * src/CMap.cpp, src/CMap.hpp, src/CMapReader.cpp: + consider surrogates when reading CMap files + +2020-10-21 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml: + updated FreeType to version 2.10.4 + +2020-10-10 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml: + updated FreeType to version 2.10.3 + +2020-09-22 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, doc/dvisvgm.1, src/Doxyfile, + src/version.hpp: + set version to 2.10.1 + + * NEWS: + updated NEWS + +2020-09-11 Martin Gieseking <martin.gieseking@uos.de> + + * src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: + added support for new GS transparency operators +.setfillconstantalpha + and .setstrokeconstantalpha + +2020-09-04 Martin Gieseking <martin.gieseking@uos.de> + + * src/XMLNode.cpp: + renamed local variable + +2020-08-27 Martin Gieseking <martin.gieseking@uos.de> + + * libs/brotli/common/version.h: + updated brotli to version 1.0.9 +the encoder is not affected by this + update so the bundled subset +only bumps the version number. + +2020-08-26 Martin Gieseking <martin.gieseking@uos.de> + + * libs/brotli/Makefile.am, libs/brotli/common/constants.c, + libs/brotli/common/constants.h, libs/brotli/common/context.c, + libs/brotli/common/context.h, libs/brotli/common/dictionary.c, + libs/brotli/common/platform.c, libs/brotli/common/platform.h, + libs/brotli/common/transform.c, libs/brotli/common/transform.h, + libs/brotli/common/version.h, libs/brotli/enc/backward_references.c, + libs/brotli/enc/backward_references.h, + libs/brotli/enc/backward_references_hq.c, + libs/brotli/enc/backward_references_hq.h, + libs/brotli/enc/backward_references_inc.h, + libs/brotli/enc/block_splitter.c, libs/brotli/enc/block_splitter_inc.h, + libs/brotli/enc/brotli_bit_stream.c, libs/brotli/enc/cluster_inc.h, + libs/brotli/enc/command.c, libs/brotli/enc/command.h, + libs/brotli/enc/compress_fragment_two_pass.c, + libs/brotli/enc/dictionary_hash.c, libs/brotli/enc/dictionary_hash.h, + libs/brotli/enc/encode.c, libs/brotli/enc/encoder_dict.c, + libs/brotli/enc/encoder_dict.h, libs/brotli/enc/entropy_encode.c, + libs/brotli/enc/entropy_encode.h, libs/brotli/enc/fast_log.c, + libs/brotli/enc/fast_log.h, libs/brotli/enc/find_match_length.h, + libs/brotli/enc/hash.h, libs/brotli/enc/hash_composite_inc.h, + libs/brotli/enc/hash_forgetful_chain_inc.h, + libs/brotli/enc/hash_longest_match64_inc.h, + libs/brotli/enc/hash_longest_match_inc.h, + libs/brotli/enc/hash_longest_match_quickly_inc.h, + libs/brotli/enc/hash_rolling_inc.h, + libs/brotli/enc/hash_to_binary_tree_inc.h, libs/brotli/enc/memory.h, + libs/brotli/enc/metablock.c, libs/brotli/enc/metablock_inc.h, + libs/brotli/enc/params.h, libs/brotli/enc/ringbuffer.h, + libs/brotli/enc/utf8_util.c, libs/brotli/enc/write_bits.h, + libs/brotli/include/brotli/encode.h, libs/brotli/include/brotli/port.h: + updated brotli to version 1.0.8 + +2020-08-23 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.1, doc/dvisvgm.txt.in: + manpage: few additions to --bbox and --font-format + +2020-08-22 Martin Gieseking <martin.gieseking@uos.de> + + * .mailmap: + removed redundant file + +2020-08-21 Martin Gieseking <martin.gieseking@uos.de> + + * src/Ghostscript.cpp: + updated GS versioning scheme introduced with GS + 9.53.0 +http://git.ghostscript.com/?p=ghostpdl.git;a=commit;h=0e98e2a27ed19fcc138215afe17ab1a173aeed7b + +2020-08-12 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, doc/dvisvgm.1, src/Doxyfile, + src/version.hpp: + set version to 2.10 + + * NEWS: + updated NEWS + +2020-07-27 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.1, doc/dvisvgm.txt.in, libs/xxHash/xxh3.h, + libs/xxHash/xxhash.h: + updated xxHash to version 0.8 + +2020-07-24 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + redefine internal GS operators .fillstroke and .eofillstroke +They are + used to implement PDF operators B and B*. +(closes #139) + +2020-07-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/optimizer/TransformSimplifier.cpp: + don't unwind transform attributes of image elements + + * src/optimizer/GroupCollapser.cpp: + collapse groups w/o attributes first +in order to recurse into their + descendants. + + * src/optimizer/TransformSimplifier.cpp: + optimizer: unwind transform attributes of image elements +if it consists + only of scaling and translations. Merge the scaled translation +into x and + y, and simplify the remaining matrix(...) expression to scale(...) + +2020-07-15 Martin Gieseking <martin.gieseking@uos.de> + + * src/XMLNode.cpp, src/XMLNode.hpp, src/optimizer/GroupCollapser.cpp, + src/optimizer/RedundantElementRemover.cpp, + src/optimizer/WSNodeRemover.cpp: + renamed XMLNode::remove to XMLNode::detach + +2020-07-14 Martin Gieseking <martin.gieseking@uos.de> + + * src/optimizer/GroupCollapser.cpp: + don't move inner transforms to outer clipping paths + + * src/XMLNode.cpp: + fixed XMLElement::unwrap + + * src/optimizer/GroupCollapser.cpp: + improved optimizer module GroupCollapser + +2020-07-13 Martin Gieseking <martin.gieseking@uos.de> + + * src/optimizer/SVGOptimizer.cpp: + simplify transforms before optimizing groups + + * src/DvisvgmSpecialHandler.cpp: + fixed error message about invalid closing tags + + * src/DVIToSVGActions.cpp: + handle XML parser errors thrown in EOP + + * src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp: + reduced number of successive XML error messages + + * src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp: + renamed XMLParser::flush to XMLParser::finish + +2020-07-07 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontCache.cpp, src/HashFunction.cpp, src/HashFunction.hpp, + src/MD5HashFunction.hpp, src/XXHashFunction.hpp, + tests/HashFunctionTest.cpp: + renamed HashFunction::digestValue() to HashFunction::digestBytes() + + * src/XXHashFunction.hpp: + added XXHashFunction::digestValue() to get the value as encoded by + xxhash + + * src/FileSystem.cpp, src/FileSystem.hpp: + create dedicated temp folders with each call of dvisvgm + +2020-06-25 Martin Gieseking <martin.gieseking@uos.de> + + * libs/xxHash/xxh3.h, libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: + updated xxHash to version 0.7.4 + +2020-06-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/DvisvgmSpecialHandler.cpp, tests/DvisvgmSpecialTest.cpp: + fixed computation of string boundaries after expanding {?(...)} +(closes + #136) + +2020-05-09 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml: + updated FreeType to version 2.10.2 + +2020-05-03 Martin Gieseking <martin.gieseking@uos.de> + + * src/dvisvgm.cpp: + fixed indentation + +2020-04-24 John Bowman <bowman@ualberta.ca> + + * src/dvisvgm.cpp: + Fix indentation. + +2020-04-23 John Bowman <bowman@ualberta.ca> + + * src/dvisvgm.cpp: + Return error codes to shell. + +2020-04-13 Martin Gieseking <martin.gieseking@uos.de> + + * src/PathClipper.cpp, src/PathClipper.hpp, src/PsSpecialHandler.cpp: + changed signature of PathClipper::intersect() + + * src/PathClipper.cpp, src/PathClipper.hpp: + added unite operation to PathClipper + + * src/GraphicsPath.hpp, src/PsSpecialHandler.cpp: + fixed handling of clippath/eoclip combinations + +2020-04-11 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVGActions.cpp: + fixed bbox debug rectangles + + * src/Font.cpp, src/Font.hpp: + added italic correction for fake slant + + * src/DVIReader.cpp, src/DVIReader.hpp, src/FontManager.cpp: + added evaluation of LuaTeX native font definitions + + * src/DVIReader.cpp: + minor code improvements + +2020-04-10 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + fixed PS operator 'eoclip' + +2020-03-30 Martin Gieseking <martin.gieseking@uos.de> + + * src/optimizer/TransformSimplifier.cpp: + optimizer: fixed omission of second scale() parameter + +2020-03-21 Martin Gieseking <martin.gieseking@uos.de> + + * src/Matrix.cpp: + fixed parsing of "scale(s)" +fixes #131 + + * .appveyor.yml, .travis.yml, configure.ac, doc/dvisvgm.1, src/Doxyfile, + src/version.hpp: + set version to 2.9.1 + + * NEWS: + updated NEWS + +2020-03-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/Calculator.cpp, tests/CalculatorTest.cpp: + calculator: allow to omit '*' before '(' + +2020-03-19 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.1, doc/dvisvgm.txt.in, src/DvisvgmSpecialHandler.cpp, + tests/DvisvgmSpecialTest.cpp: + added macro {?(expr)} to enable math expressions in raw specials +closes + #130 + +2020-03-17 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am, doc/conf-dblatex-pdf.xsl, doc/dvisvgm.txt.in, + doc/generate-dvisvgm-sty.xsl, doc/tweak-dblatex-tex.py: + optimize line breaks and code blocks in pdf manpage + +2020-03-16 Martin Gieseking <martin.gieseking@uos.de> + + * doc/conf-dblatex-pdf.xsl: + small font changes in pdf version of manual page +- changed body font to + Source Serif Pro +- scaled monospace font by 0.9 + + * src/PageRanges.cpp, src/PageRanges.hpp: + removed redundant #includes + + * src/NumericRanges.hpp: + replaced explicit iterator type with auto + +2020-03-13 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS: + updated NEWS and vc/README + +2020-03-12 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.1: + added generated man page to repo + +2020-03-11 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + fixed xshow, yshow, and xyshow for multi-byte characters + +2020-03-10 Martin Gieseking <martin.gieseking@uos.de> + + * src/Matrix.cpp: + replaced istream::ignore() with istream::get() +to make gcc on NetBSD + happy + + * .travis.yml: + travis: added packages required to build man page + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.9 + +2020-03-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + create image files in tmpdir instead of cwd + + * src/PsSpecialHandler.cpp: + fixed mime type of JPEG images + + * src/utility.hpp: + base64_copy: added parameter to set line length + + * src/XMLNode.cpp: + wrap lines with base64 image data (200 chars/line) + + * doc/Makefile.am: + make install: use existing dvisvgm.1 if it can't be rebuilt +However, + "make dist" and "make distcheck" should still fail if the man page +can't + be built in order to ensure the tarball always contains a recent version. + + * src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp: + some code cleanup + +2020-03-08 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/PSInterpreter.cpp: + added bitmap format 'none' to disable image processing + +2020-03-07 Martin Gieseking <martin.gieseking@uos.de> + + * src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.hpp, src/psdefs.cpp: + added image support for various JPEG and PNG variants + + * doc/dvisvgm.txt.in, src/CommandLine.hpp, src/dvisvgm.cpp, + src/options.xml: + added command-line option --bitmap-format + + * doc/generate-dvisvgm-sty.xsl: + manual page: reduce distance of table rows + +2020-03-05 Martin Gieseking <martin.gieseking@uos.de> + + * libs/xxHash/xxh3.h, libs/xxHash/xxhash.c, libs/xxHash/xxhash.h, + tests/HashFunctionTest.cpp: + updated xxhash to version 0.7.3 + +2020-03-02 Martin Gieseking <martin.gieseking@uos.de> + + * src/GlyphTracerMessages.hpp: + suppress tracer messages if no font info available + + * src/MetafontWrapper.cpp, src/MetafontWrapper.hpp: + added fallback method to get GF resolution applied by Metafont + +2020-02-29 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + fixed potential segfault + + * src/Bezier.cpp, src/BoundingBox.cpp, src/Font.cpp, src/FontWriter.cpp, + src/Matrix.cpp, src/TensorProductPatch.cpp, src/TriangularPatch.cpp: + replaced fabs() with std::abs() + +2020-02-26 Martin Gieseking <martin.gieseking@uos.de> + + * src/XMLNode.cpp: + fixed copy constructor of XMLElement + + * src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: + fixed broken handling of PS tiling patterns + + * src/PSPattern.cpp: + simplified loop expression + + * src/XMLNode.cpp, src/optimizer/RedundantElementRemover.cpp: + don't remove clipPath elements if referenced in patterns + + * src/PsSpecialHandler.cpp: + don't add clip path to path elements in pattern definitions + +2020-02-25 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + store image counter in globaldict + + * src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/XMLNode.cpp, + src/XMLNode.hpp, src/dvisvgm.cpp: + don't keep encoded image data in memory +To prevent memory issues, add + the base64-encoded image data when serializing +the XML tree. + + * src/PsSpecialHandler.cpp: + prevent access to invalid vector component + + * src/XMLNode.cpp, src/XMLNode.hpp: + prevent deep destructor recursion of XML nodes + + * src/psdefs.cpp: + PS handler: prevent write access to protected pattern dictionary + +2020-02-21 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + don't access DataSource for shading types < 4 + +2020-02-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + apply clip path to image if present + + * src/optimizer/TransformSimplifier.cpp: + TransformSimplifier: prevent width/height from getting negative + + * src/Font.cpp, src/GraphicsPath.hpp, src/PsSpecialHandler.cpp, + tests/GraphicsPathTest.cpp: + changed signature of GraphicsPath::computeBBox() + +2020-02-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + image operator: reset output device correctly + +2020-02-17 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp, src/psdefs.cpp: + stop image processing if PNG devices are unavailable +Handling of PS + operator 'image' relies on the GS output devices 'png16m' and +'pnggray' + (depending on the current color space). If they are unavailable, + the +image processing is stopped now instead of leaving GS with an + internal error. + + * src/PsSpecialHandler.cpp: + adapt bounding box to enclose embedded bitmaps + +2020-02-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/EPSToSVG.hpp, src/ImageToSVG.cpp, src/ImageToSVG.hpp, + src/PDFToSVG.hpp: + fixed getCurrentPageNumber() for EPS and PDF files + + * src/FilePath.cpp, src/FilePath.hpp, tests/FilePathTest.cpp: + FilePath::suffix("") now removes the suffix if present + + * src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/psdefs.cpp: + sync location and base name of temporary PNG files with SVG file + + * src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/dvisvgm.cpp, + src/psdefs.cpp: + remove temporary PNG files if --keep is not given + +2020-02-15 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + added evaluation of PS Level 1 image operators + +2020-02-14 Martin Gieseking <martin.gieseking@uos.de> + + * src/Matrix.cpp, tests/MatrixTest.cpp: + fixed row/column issue in Matrix::invert() + + * src/FontWriter.cpp, src/utility.hpp: + added wrapper function for util::base64_copy() + + * src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: + added processing of PS image operator + +2020-02-12 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in: + manpage: added info on default values listed by --help + +2020-01-17 Martin Gieseking <martin.gieseking@uos.de> + + * src/GraphicsPath.hpp: + arcto: use template type for rx and ry instead of double + +2020-01-14 Martin Gieseking <martin.gieseking@uos.de> + + * src/PageSize.cpp: + replaced floor(x+0.5) with round(x) + +2020-01-06 Martin Gieseking <martin.gieseking@uos.de> + + * src/Ghostscript.cpp: + added check for libgs.dylib.N (Mac only) + +2020-01-02 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile.am, README, README.md, configure.ac, doc/Makefile.am, + doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, + doc/dvisvgm.txt.in, doc/tweak-db-article.xsl, doc/tweak-db-refentry.xsl, + doc/tweak-dblatex-pdf.xsl, libs/Makefile.am, + libs/ff-woff/fontforge/tmpfile2.cpp, src/AGLTable.hpp, + src/BasicDVIReader.cpp, src/BasicDVIReader.hpp, src/Bezier.cpp, + src/Bezier.hpp, src/BgColorSpecialHandler.cpp, + src/BgColorSpecialHandler.hpp, src/Bitmap.cpp, src/Bitmap.hpp, + src/BoundingBox.cpp, src/BoundingBox.hpp, src/CLCommandLine.cpp, + src/CLCommandLine.hpp, src/CLOption.hpp, src/CMap.cpp, src/CMap.hpp, + src/CMapManager.cpp, src/CMapManager.hpp, src/CMapReader.cpp, + src/CMapReader.hpp, src/Calculator.cpp, src/Calculator.hpp, + src/CharMapID.cpp, src/CharMapID.hpp, src/Character.hpp, src/Color.cpp, + src/Color.hpp, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, + src/CommandLine.hpp, src/DLLoader.cpp, src/DLLoader.hpp, + src/DVIActions.hpp, src/DVIReader.cpp, src/DVIReader.hpp, + src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.hpp, src/Directory.cpp, src/Directory.hpp, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, + src/EPSFile.cpp, src/EPSFile.hpp, src/EPSToSVG.hpp, + src/EllipticalArc.cpp, src/EllipticalArc.hpp, src/EmSpecialHandler.cpp, + src/EmSpecialHandler.hpp, src/EncFile.cpp, src/EncFile.hpp, + src/FileFinder.cpp, src/FileFinder.hpp, src/FilePath.cpp, + src/FilePath.hpp, src/FileSystem.cpp, src/FileSystem.hpp, + src/FixWord.hpp, src/Font.cpp, src/Font.hpp, src/FontCache.cpp, + src/FontCache.hpp, src/FontEncoding.cpp, src/FontEncoding.hpp, + src/FontEngine.cpp, src/FontEngine.hpp, src/FontManager.cpp, + src/FontManager.hpp, src/FontMap.cpp, src/FontMap.hpp, + src/FontMetrics.cpp, src/FontMetrics.hpp, src/FontStyle.hpp, + src/FontWriter.cpp, src/FontWriter.hpp, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.hpp, src/GFReader.cpp, src/GFReader.hpp, + src/GFTracer.cpp, src/GFTracer.hpp, src/Ghostscript.cpp, + src/Ghostscript.hpp, src/Glyph.hpp, src/GlyphTracerMessages.hpp, + src/GraphicsPath.hpp, src/HashFunction.cpp, src/HashFunction.hpp, + src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, + src/HyperlinkManager.cpp, src/HyperlinkManager.hpp, src/ImageToSVG.cpp, + src/ImageToSVG.hpp, src/InputBuffer.cpp, src/InputBuffer.hpp, + src/InputReader.cpp, src/InputReader.hpp, src/JFM.cpp, src/JFM.hpp, + src/Length.cpp, src/Length.hpp, src/MD5HashFunction.hpp, src/Makefile.am, + src/MapLine.cpp, src/MapLine.hpp, src/Matrix.cpp, src/Matrix.hpp, + src/Message.cpp, src/Message.hpp, src/MessageException.hpp, + src/MetafontWrapper.cpp, src/MetafontWrapper.hpp, src/MiKTeXCom.cpp, + src/MiKTeXCom.hpp, src/NoPsSpecialHandler.cpp, + src/NoPsSpecialHandler.hpp, src/NumericRanges.hpp, src/PDFParser.cpp, + src/PDFParser.hpp, src/PDFToSVG.hpp, src/PSFilter.hpp, + src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PSPattern.cpp, + src/PSPattern.hpp, src/PSPreviewFilter.cpp, src/PSPreviewFilter.hpp, + src/PageRanges.cpp, src/PageRanges.hpp, src/PageSize.cpp, + src/PageSize.hpp, src/Pair.hpp, src/PapersizeSpecialHandler.cpp, + src/PapersizeSpecialHandler.hpp, src/PathClipper.cpp, + src/PathClipper.hpp, src/PdfSpecialHandler.cpp, + src/PdfSpecialHandler.hpp, src/PreScanDVIReader.cpp, + src/PreScanDVIReader.hpp, src/Process.cpp, src/Process.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/RangeMap.cpp, + src/RangeMap.hpp, src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, + src/SVGCharHandlerFactory.cpp, src/SVGCharHandlerFactory.hpp, + src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.hpp, + src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.hpp, + src/SVGOutput.cpp, src/SVGOutput.hpp, src/SVGSingleCharTextHandler.cpp, + src/SVGSingleCharTextHandler.hpp, src/SVGTree.cpp, src/SVGTree.hpp, + src/ShadingPatch.cpp, src/ShadingPatch.hpp, src/SignalHandler.cpp, + src/SignalHandler.hpp, src/SourceInput.cpp, src/SourceInput.hpp, + src/SpecialActions.hpp, src/SpecialHandler.hpp, src/SpecialManager.cpp, + src/SpecialManager.hpp, src/StreamReader.cpp, src/StreamReader.hpp, + src/StreamWriter.cpp, src/StreamWriter.hpp, src/Subfont.cpp, + src/Subfont.hpp, src/System.cpp, src/System.hpp, src/TFM.cpp, + src/TFM.hpp, src/TTFAutohint.cpp, src/TTFAutohint.hpp, + src/TensorProductPatch.cpp, src/TensorProductPatch.hpp, src/Terminal.cpp, + src/Terminal.hpp, src/ToUnicodeMap.cpp, src/ToUnicodeMap.hpp, + src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp, + src/TriangularPatch.cpp, src/TriangularPatch.hpp, src/TrueTypeFont.cpp, + src/TrueTypeFont.hpp, src/Unicode.cpp, src/Unicode.hpp, + src/VFActions.hpp, src/VFReader.cpp, src/VFReader.hpp, + src/VectorIterator.hpp, src/VectorStream.hpp, src/XMLDocument.cpp, + src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.hpp, src/XMLString.cpp, + src/XMLString.hpp, src/XXHashFunction.hpp, src/ZLibOutputStream.hpp, + src/dvisvgm.cpp, src/ffwrapper.c, src/ffwrapper.h, src/macros.hpp, + src/optimizer/AttributeExtractor.cpp, + src/optimizer/AttributeExtractor.hpp, src/optimizer/DependencyGraph.hpp, + src/optimizer/GroupCollapser.cpp, src/optimizer/GroupCollapser.hpp, + src/optimizer/OptimizerModule.hpp, + src/optimizer/RedundantElementRemover.cpp, + src/optimizer/RedundantElementRemover.hpp, + src/optimizer/SVGOptimizer.cpp, src/optimizer/SVGOptimizer.hpp, + src/optimizer/TextSimplifier.cpp, src/optimizer/TextSimplifier.hpp, + src/optimizer/TransformSimplifier.cpp, + src/optimizer/TransformSimplifier.hpp, src/optimizer/WSNodeRemover.cpp, + src/optimizer/WSNodeRemover.hpp, src/options.dtd, src/options.xml, + src/psdefs.cpp, src/utility.cpp, src/utility.hpp, src/version.hpp, + src/version.hpp.in, src/windows.hpp, tests/BezierTest.cpp, + tests/BitmapTest.cpp, tests/BoundingBoxTest.cpp, + tests/CMapManagerTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, + tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, + tests/ColorTest.cpp, tests/CommandLineTest.cpp, tests/DVIReaderTest.cpp, + tests/DependencyGraphTest.cpp, tests/DirectoryTest.cpp, + tests/DvisvgmSpecialTest.cpp, tests/EllipticalArcTest.cpp, + tests/EmSpecialTest.cpp, tests/FileFinderTest.cpp, + tests/FilePathTest.cpp, tests/FileSystemTest.cpp, + tests/FontCacheTest.cpp, tests/FontManagerTest.cpp, + tests/FontMapTest.cpp, tests/GFGlyphTracerTest.cpp, + tests/GFReaderTest.cpp, tests/GhostscriptTest.cpp, + tests/GraphicsPathTest.cpp, tests/HashFunctionTest.cpp, + tests/JFMReaderTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, + tests/MapLineTest.cpp, tests/MatrixTest.cpp, + tests/MessageExceptionTest.cpp, tests/PDFParserTest.cpp, + tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, + tests/PageSizeTest.cpp, tests/PairTest.cpp, + tests/PapersizeSpecialTest.cpp, tests/RangeMapTest.cpp, + tests/SVGOutputTest.cpp, tests/ShadingPatchTest.cpp, + tests/SpecialManagerTest.cpp, tests/SplittedCharInputBufferTest.cpp, + tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, + tests/StreamWriterTest.cpp, tests/StringMatcherTest.cpp, + tests/SubfontTest.cpp, tests/TFMReaderTest.cpp, + tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, + tests/TpicSpecialTest.cpp, tests/TriangularPatchTest.cpp, + tests/UnicodeTest.cpp, tests/UtilityTest.cpp, + tests/VectorIteratorTest.cpp, tests/VectorStreamTest.cpp, + tests/XMLNodeTest.cpp, tests/XMLStringTest.cpp, tests/check-conv, + tests/create-makefile, tests/data/Makefile.am, tests/genhashcheck.py, + tests/normalize.xsl, tests/testmain.cpp: + updated year in copyright statements to 2020 + +2019-12-23 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in: + few additions to the manual page + +2019-12-07 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS: + updated NEWS + +2019-12-06 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.8.2 + +2019-12-05 Martin Gieseking <martin.gieseking@uos.de> + + * src/FileSystem.cpp: + convert path separators only in Windows binaries + + * src/Process.cpp: + Subprocess: handle absolute path to executable correctly + + * src/FileFinder.cpp, src/FileFinder.hpp: + added FileFinder::lookupExecutable() + + * src/MetafontWrapper.cpp: + call 'mf-nowin' instead of 'mf' if available (closes #121) + +2019-12-04 Martin Gieseking <martin.gieseking@uos.de> + + * src/PSInterpreter.cpp: + adapt path separators before passing them to Ghostscript +closes #123 + + * src/FilePath.cpp, src/FileSystem.cpp, src/FileSystem.hpp, + src/PSInterpreter.cpp, src/PsSpecialHandler.cpp, src/dvisvgm.cpp: + renamed adaptPathSeperators() to ensureForwardSlashes() + + * src/Calculator.hpp, src/CharMapID.hpp, src/Color.hpp, src/Directory.cpp, + src/Directory.hpp, src/FixWord.hpp, src/FontStyle.hpp, + src/GFGlyphTracer.cpp, src/GFGlyphTracer.hpp, src/GFReader.cpp, + src/GFReader.hpp, src/GFTracer.cpp, src/GFTracer.hpp, + src/GlyphTracerMessages.hpp, src/HtmlSpecialHandler.hpp, + src/HyperlinkManager.hpp, src/Length.hpp, src/NoPsSpecialHandler.hpp, + src/PSPreviewFilter.cpp, src/PSPreviewFilter.hpp, src/PathClipper.hpp, + src/PreScanDVIReader.cpp, src/PreScanDVIReader.hpp, src/Process.cpp, + src/PsSpecialHandler.hpp, src/RangeMap.hpp, src/SVGOutput.cpp, + src/SVGOutput.hpp, src/SignalHandler.cpp, src/SignalHandler.hpp, + src/TFM.hpp, src/VFReader.cpp, src/VFReader.hpp, src/VectorStream.hpp: + simplified constructors, avoid constant initializers + + * src/FileSystem.cpp, src/FileSystem.hpp: + removed redundant class variable + + * src/MiKTeXCom.cpp: + fixed type mismatch of FindFile expression + +2019-12-03 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + fixed handling of 'nulldevice' in PS operator 'restore' +closes #122 + +2019-11-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/GraphicsPath.hpp: + added missing namespace prefix to pow() + +2019-11-14 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, README.md: + updated NEWS and README + +2019-11-12 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.8.1 + + * doc/dvisvgm.txt.in: + some minor changes of the manual page + +2019-11-11 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + added newline at end of file + +2019-11-08 Martin Gieseking <martin.gieseking@uos.de> + + * src/optimizer/GroupCollapser.hpp: + made GroupCollapser::moveAttributes() static + + * doc/dvisvgm.txt.in, src/optimizer/Makefile.am, + src/optimizer/SVGOptimizer.cpp, src/optimizer/TextSimplifier.cpp, + src/optimizer/TextSimplifier.hpp: + added optimizer module TextSimplifier + + * doc/dvisvgm.txt.in, src/XMLNode.hpp, + src/optimizer/AttributeExtractor.hpp, src/optimizer/TextSimplifier.cpp: + extended functionality of optimizer module 'simplify-text' +- common + attributes of tspans are moved to the enclosing text element +- tspans + without attributes are unwrapped + +2019-11-05 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.hpp: + removed some constant initializers from constructors + + * src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, + src/EmSpecialHandler.cpp, src/PSInterpreter.cpp, src/PSInterpreter.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, + src/SpecialActions.hpp, src/TpicSpecialHandler.cpp, src/psdefs.cpp, + tests/PSInterpreterTest.cpp: + added support for PS operator 'nulldevice' + +2019-10-30 Martin Gieseking <martin.gieseking@uos.de> + + * src/FileFinder.cpp: + added PNG, JPEG, and SVG to supported formats of FileFinder + + * src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp: + psfile: create absolute or relative paths to reference images +depending + on the file location and the file path given by the user + +2019-10-29 Martin Gieseking <martin.gieseking@uos.de> + + * src/FilePath.cpp, src/FilePath.hpp: + added method to check if a path is absolute or relative + +2019-10-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/CMapReader.cpp, src/CMapReader.hpp, tests/CMapReaderTest.cpp: + CMapReader: extracted common code; added test for 'begincidchar' + +2019-10-25 Martin Gieseking <martin.gieseking@uos.de> + + * tests/Makefile.am, tests/create-makefile: + added missing gtest file to distribution + + * tests/FontCacheTest.cpp: + remove temporary files created by FontCacheTest + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.8 + + * NEWS: + updated NEWS + +2019-10-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/CMapReader.cpp, src/CMapReader.hpp: + CMapReader: added support for operator 'begincidchar' (patch by Akira + Kakuto) + +2019-10-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.hpp, src/FilePath.cpp, src/FilePath.hpp, + src/HyperlinkManager.cpp, src/ImageToSVG.cpp, src/ImageToSVG.hpp, + src/PDFToSVG.hpp, src/SVGOutput.cpp, src/SVGOutput.hpp, + src/SpecialActions.hpp, tests/FilePathTest.cpp, tests/SVGOutputTest.cpp: + SVGOutput: renamed 'filename' to 'filepath'; changed return type to + FilePath + +2019-10-18 Martin Gieseking <martin.gieseking@uos.de> + + * tests/gtest/include/gtest/gtest-death-test.h, + tests/gtest/include/gtest/gtest-matchers.h, + tests/gtest/include/gtest/gtest-message.h, + tests/gtest/include/gtest/gtest-param-test.h, + tests/gtest/include/gtest/gtest-printers.h, + tests/gtest/include/gtest/gtest-spi.h, + tests/gtest/include/gtest/gtest-test-part.h, + tests/gtest/include/gtest/gtest-typed-test.h, + tests/gtest/include/gtest/gtest.h, + tests/gtest/include/gtest/gtest_pred_impl.h, + tests/gtest/include/gtest/internal/gtest-death-test-internal.h, + tests/gtest/include/gtest/internal/gtest-filepath.h, + tests/gtest/include/gtest/internal/gtest-internal.h, + tests/gtest/include/gtest/internal/gtest-param-util.h, + tests/gtest/include/gtest/internal/gtest-port-arch.h, + tests/gtest/include/gtest/internal/gtest-port.h, + tests/gtest/include/gtest/internal/gtest-string.h, + tests/gtest/include/gtest/internal/gtest-type-util.h, + tests/gtest/src/gtest-all.cc, tests/gtest/src/gtest-death-test.cc, + tests/gtest/src/gtest-filepath.cc, tests/gtest/src/gtest-internal-inl.h, + tests/gtest/src/gtest-matchers.cc, tests/gtest/src/gtest-port.cc, + tests/gtest/src/gtest-printers.cc, tests/gtest/src/gtest-test-part.cc, + tests/gtest/src/gtest-typed-test.cc, tests/gtest/src/gtest.cc, + tests/gtest/src/gtest_main.cc, tests/testutil.hpp: + updated gtest to version 1.10 + + * src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp: + psfile: added support for PDF, JPG, PNG, and SVG files + + * src/optimizer/TransformSimplifier.cpp, + src/optimizer/TransformSimplifier.hpp: + try to incorporate transformations into positional and size attributes + + * src/PsSpecialHandler.cpp: + PS handler: minor code enhancements + +2019-10-17 Martin Gieseking <martin.gieseking@uos.de> + + * src/PSInterpreter.cpp: + call GS with -dDELAYSAFER if GS version >= 9.50 +Ghostscript 9.50 + introduced incompatible changes regarding SAFER which is now +active by + default. This conflicts with DELAYBIND and WRITESYSTEMDICT, which + are +necessary for dvisvgm to work + correctly. +https://www.ghostscript.com/doc/9.50/Use.htm#Safer + + * tests/HashFunctionTest.cpp: + adapted XXH128 tests to changes in xxhash 0.7.2 + +2019-10-08 Martin Gieseking <martin.gieseking@uos.de> + + * libs/xxHash/xxh3.h, libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: + updated xxhash to version 0.7.2 + +2019-10-06 Martin Gieseking <martin.gieseking@uos.de> + + * src/EllipticalArc.cpp: + minor changes in EllipticalArc.cpp + +2019-09-19 Martin Gieseking <martin.gieseking@uos.de> + + * src/PathClipper.cpp: + prevent warnings about uninitialized variables + +2019-09-17 Martin Gieseking <martin.gieseking@uos.de> + + * libs/potrace/auxiliary.h, libs/potrace/bitmap.h, libs/potrace/config.h, + libs/potrace/curve.c, libs/potrace/curve.h, libs/potrace/decompose.c, + libs/potrace/decompose.h, libs/potrace/lists.h, + libs/potrace/potracelib.c, libs/potrace/potracelib.h, + libs/potrace/progress.h, libs/potrace/trace.c, libs/potrace/trace.h: + updated potrace to version 1.16 + + * src/Bitmap.cpp, src/Bitmap.hpp: + minor code cleanup of Bitmap class + +2019-09-12 Martin Gieseking <martin.gieseking@uos.de> + + * src/GraphicsPath.hpp: + renamed misspelled variables 'largeArgFlag' to 'largeArcFlag' + + * src/EllipticalArc.cpp: + removed #include "debug.h" + +2019-09-03 Martin Gieseking <martin.gieseking@uos.de> + + * libs/woff2/src/glyph.cc, libs/woff2/src/normalize.cc: + fixed two compiler warnings in libwoff2 +regarding signed/unsigned + comparison + +2019-08-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/XXHashFunction.hpp, tests/HashFunctionTest.cpp: + simplified implementation of XXHashFunction::digestValue() and tests + +2019-08-26 Martin Gieseking <martin.gieseking@uos.de> + + * src/StreamReader.cpp, src/StreamReader.hpp, src/VFReader.cpp, + tests/StreamReaderTest.cpp: + removed vector reference from StreamReader::readBytes() + + * src/CRC32.cpp, src/CRC32.hpp, src/FontCache.cpp, src/FontCache.hpp, + src/HashFunction.cpp, src/HashFunction.hpp, src/Makefile.am, + src/StreamReader.cpp, src/StreamReader.hpp, src/StreamWriter.cpp, + src/StreamWriter.hpp, src/XXHashFunction.hpp, src/utility.hpp, + tests/CRC32Test.cpp, tests/FontCacheTest.cpp, tests/Makefile.am, + tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp: + replaced CRC32 cache checksums with XXH32 hashes + +2019-08-25 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, libs/xxHash/xxhash.h, src/HashFunction.cpp, + src/XXHashFunction.hpp, tests/HashFunctionTest.cpp: + added support for the experimental 128-bit XXH3 algorithm + +2019-08-24 Martin Gieseking <martin.gieseking@uos.de> + + * src/GraphicsPath.hpp: + avoid redundant sequences of closepath (z/Z) commands + +2019-08-19 Martin Gieseking <martin.gieseking@uos.de> + + * src/GraphicsPath.hpp, tests/GraphicsPathTest.cpp: + added short versions of 'quadto' and 'cubicto' to GraphicsPath + +2019-08-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/TpicSpecialHandler.cpp, tests/TpicSpecialTest.cpp: + use class EllipticalArc to process arcs in tpic handler + +2019-08-15 Martin Gieseking <martin.gieseking@uos.de> + + * libs/xxHash/Makefile.am, libs/xxHash/xxh3.h, libs/xxHash/xxhash.c, + libs/xxHash/xxhash.h: + updated xxhash to version 0.7.1 + + * src/DVIToSVG.cpp: + print error message on wrong page hash arguments + +2019-08-14 Martin Gieseking <martin.gieseking@uos.de> + + * src/EllipticalArc.cpp, src/EllipticalArc.hpp, src/GraphicsPath.hpp, + tests/EllipticalArcTest.cpp, tests/GraphicsPathTest.cpp: + added GraphicsPath::approximateArcs() + +2019-08-13 Martin Gieseking <martin.gieseking@uos.de> + + * src/Bezier.cpp, src/Bezier.hpp, src/EllipticalArc.cpp, + src/EllipticalArc.hpp, src/GraphicsPath.hpp, src/Makefile.am, + src/Pair.hpp, src/utility.cpp, src/utility.hpp, + tests/EllipticalArcTest.cpp, tests/Makefile.am: + added support of 'arcto' command to class GraphicsPath + +2019-08-08 Martin Gieseking <martin.gieseking@uos.de> + + * src/Bezier.cpp, src/Bezier.hpp, src/PsSpecialHandler.cpp, + src/ShadingPatch.hpp, src/TensorProductPatch.cpp, + src/TensorProductPatch.hpp, src/TriangularPatch.cpp, + src/TriangularPatch.hpp, tests/BezierTest.cpp, + tests/TensorProductPatchTest.cpp, tests/TriangularPatchTest.cpp: + getBBox(): replaced reference parameter with return value + + * src/PsSpecialHandler.cpp, src/ShadingPatch.hpp, + src/TensorProductPatch.cpp, src/TensorProductPatch.hpp, + src/TriangularPatch.cpp, src/TriangularPatch.hpp, + tests/TensorProductPatchTest.cpp, tests/TriangularPatchTest.cpp: + getBoundaryPath(): replaced reference parameter with return value + +2019-08-04 Martin Gieseking <martin.gieseking@uos.de> + + * src/Color.cpp, src/Pair.hpp: + use std::hypot() to compute length of vector + +2019-08-01 Martin Gieseking <martin.gieseking@uos.de> + + * src/MD5HashFunction.hpp: + removed 'explicit' from default constructor +Work around for C++11 bug in + GCC 4.8: +https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58255 + + * src/FontCache.cpp, src/FontEngine.cpp, src/FontWriter.cpp, + src/GraphicsPath.hpp, src/Pair.hpp, src/PathClipper.cpp, + src/TpicSpecialHandler.cpp, src/optimizer/CMakeLists.txt, + src/optimizer/Makefile.am, tests/FontCacheTest.cpp, + tests/GraphicsPathTest.cpp: + redesigned implementation of class GraphicsPath +- use variant instances + to store path commands instead of plain structs +- process commands in + visitor objects +- removed GraphicsPath::Actions::draw() that exposed + implemenation details +- simplify iterate() method + +2019-07-29 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontCache.cpp: + use direct string concatenation instead of temporary string stream + +2019-07-28 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am: + added missing dependency to Makefile rule + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.7.4 + + * NEWS: + updated NEWS + +2019-07-27 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am: + moved generation of dvisvgm.sty to separate rule + +2019-07-26 Martin Gieseking <martin.gieseking@uos.de> + + * src/Color.cpp: + use std::round to round color value (fixes #116) + + * doc/Makefile.am, doc/dvisvgm.sty, doc/dvisvgm.txt.in, + doc/generate-dvisvgm-sty.xsl, doc/tweak-db-article.xsl, + doc/tweak-db-refentry.xsl: + show revision date given in doc/dvisvgm.txt on manual page +rather than + the build date + +2019-07-25 Martin Gieseking <martin.gieseking@uos.de> + + * src/TrueTypeFont.cpp: + call ofstream constructor with std::string instead of C string + +2019-07-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/MetafontWrapper.cpp: + replaced atoi() with stoi() + +2019-07-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/MetafontWrapper.cpp: + don't access moved string + + * doc/dvisvgm.txt.in, src/dvisvgm.cpp: + changed cache location to $XDG_CACHE_HOME/dvisvgm +or ~/.cache/dvisvgm if + $XDG_CACHE_HOME is not set (closes #112) + +2019-07-12 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.7.3 + + * NEWS: + updated NEWS + +2019-07-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/XMLString.cpp, src/utility.cpp, src/utility.hpp, + tests/UtilityTest.cpp: + added util::to_string(double) that strips trailing zeros +(in contrast to + std::to_string) + + * src/CMapManager.cpp, src/CMapReader.cpp, src/DVIReader.cpp, + src/GFReader.cpp, src/JFM.cpp, src/Length.cpp, src/MapLine.cpp, + src/Matrix.cpp, src/PDFParser.cpp, src/SVGOutput.cpp, src/VFReader.cpp: + replaced some string streams with plain strings + +2019-07-08 Martin Gieseking <martin.gieseking@uos.de> + + * README.md: + updated badges in README + + * src/Font.cpp, src/Font.hpp, src/dvisvgm.cpp: + changed type of CACHE_PATH to std::string + +2019-07-07 Martin Gieseking <martin.gieseking@uos.de> + + * .github/FUNDING.yml: + added funding.yml + +2019-07-06 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVG.cpp: + properly assign collected chars to unique fonts (fixes #110) + +2019-06-18 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in: + manpage: updated \special example + +2019-06-17 Martin Gieseking <martin.gieseking@uos.de> + + * src/BasicDVIReader.cpp: + replaced string streams with plain strings + +2019-06-11 Martin Gieseking <martin.gieseking@uos.de> + + * tests/genhashcheck.py: + use range-based loop to iterate over C array + +2019-06-07 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.7.2 + + * NEWS: + updated NEWS + +2019-05-29 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + 'GS_PDF_ProcSet' and 'pdfdict' are private as of GS 9.27 +As a workaround + 'runpdfbegin' and 'runpdfend' can be used to enter/leave the + dictionaries. + +2019-05-20 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.7.1 + + * NEWS: + updated NEWS + +2019-05-10 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .gitignore, src/MiKTeXCom.hpp: + added files required to access the MiKTeX session object + +2019-05-06 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + pop unused operand in PS operator 'setmatrix' (closes #106) + +2019-04-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/optimizer/AttributeExtractor.cpp, src/optimizer/GroupCollapser.cpp, + src/utility.hpp: + removed util::make_array() due to compatibility + issues +https://trac.macports.org/ticket/58347 + +2019-04-17 Martin Gieseking <martin.gieseking@uos.de> + + * README, README.md: + updated URL of FontForge website + +2019-04-15 Martin Gieseking <martin.gieseking@uos.de> + + * README.md: + removed Coverity badge as the service seems to be dead + +2019-04-14 Martin Gieseking <martin.gieseking@uos.de> + + * src/Makefile.am: + add file windows.hpp to source tarball + +2019-04-13 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.7 + + * NEWS: + updated NEWS + +2019-04-12 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/DvisvgmSpecialHandler.cpp: + added specials "bbox lock" and "bbox unlock" to lock/unlock the page + bbox +(closes #105) + + * doc/dvisvgm.txt.in, src/DvisvgmSpecialHandler.cpp: + added optional modifier 'transform' to the dvisvgm:bbox specials + + * doc/dvisvgm.txt.in, src/DvisvgmSpecialHandler.cpp: + added macro {?matrix} to raw specials + +2019-04-11 Martin Gieseking <martin.gieseking@uos.de> + + * src/Bezier.cpp, src/BoundingBox.hpp, src/CMap.hpp, src/CMapReader.hpp, + src/Character.hpp, src/Color.hpp, src/DLLoader.hpp, src/Directory.cpp, + src/Directory.hpp, src/DvisvgmSpecialHandler.cpp, src/EPSFile.hpp, + src/EncFile.hpp, src/FilePath.hpp, src/Font.hpp, src/FontEncoding.hpp, + src/FontMap.hpp, src/FontWriter.cpp, src/FontWriter.hpp, + src/GFTracer.hpp, src/GlyphTracerMessages.hpp, src/GraphicsPath.hpp, + src/InputBuffer.hpp, src/InputReader.hpp, src/JFM.hpp, src/Length.hpp, + src/MD5HashFunction.hpp, src/MapLine.hpp, src/Matrix.cpp, src/Matrix.hpp, + src/Message.hpp, src/PDFParser.cpp, src/PDFParser.hpp, src/PSPattern.hpp, + src/PSPreviewFilter.hpp, src/PageSize.hpp, src/Pair.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, + src/SVGCharHandler.hpp, src/SVGCharTspanTextHandler.hpp, + src/SVGOutput.hpp, src/SVGSingleCharTextHandler.hpp, + src/ShadingPatch.hpp, src/SourceInput.hpp, src/StreamReader.hpp, + src/StreamWriter.hpp, src/TFM.hpp, src/TensorProductPatch.hpp, + src/TriangularPatch.hpp, src/TrueTypeFont.hpp, src/VFReader.cpp, + src/VFReader.hpp, src/VectorIterator.hpp, src/VectorStream.hpp, + src/XMLDocument.hpp, src/XMLString.hpp, src/XXHashFunction.hpp, + src/optimizer/DependencyGraph.hpp: + marked most constructors 'explicit' if they may be called with a single + parameter + + * src/DVIReader.cpp, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, + src/Font.cpp, src/FontEngine.cpp, src/FontManager.cpp, + src/HyperlinkManager.cpp, src/ImageToSVG.cpp, src/PDFParser.hpp, + src/PSInterpreter.cpp, src/PdfSpecialHandler.cpp, + src/PsSpecialHandler.cpp, src/SVGCharHandler.cpp, + src/SVGCharPathHandler.cpp, src/SVGCharTspanTextHandler.cpp, + src/SVGTree.cpp, src/TensorProductPatch.cpp, src/TriangularPatch.cpp, + src/TrueTypeFont.cpp: + use automatic type deduction in conjunction with casts + + * src/EPSFile.cpp, src/EmSpecialHandler.cpp, src/EncFile.cpp, + src/InputReader.cpp, src/PSInterpreter.cpp, src/PsSpecialHandler.cpp, + src/SpecialManager.cpp, src/StreamReader.cpp, src/Subfont.cpp, + src/Unicode.cpp, src/dvisvgm.cpp: + explicitly cast integers representing characeters to char + + * src/CLCommandLine.hpp, src/DvisvgmSpecialHandler.cpp, + src/DvisvgmSpecialHandler.hpp, src/EncFile.cpp, src/Font.cpp, + src/Font.hpp, src/MetafontWrapper.cpp, src/MetafontWrapper.hpp, + src/Process.cpp, src/Process.hpp, src/SVGOutput.cpp, src/SVGOutput.hpp, + src/Subfont.cpp, src/Subfont.hpp: + if possible, move string parameters instead of copying them + + * src/Color.cpp, src/FontEngine.cpp, src/PathClipper.cpp: + use std::lround() rather than truncation + + * src/DVIActions.hpp, src/DVIToSVGActions.hpp, src/Font.hpp, + src/PSInterpreter.cpp, src/SignalHandler.cpp, src/System.cpp: + replaced 0 and NULL with nullptr + + * src/Message.cpp, src/Message.hpp: + drop 'const' from char parameter + + * src/EPSFile.cpp: + replaced C array with std::array + + * src/SpecialManager.hpp, src/ZLibOutputStream.hpp: + made deleted constructor public; use 'default' with default constructor + + * src/PageSize.cpp: + removed redundant semicolons + +2019-04-10 Martin Gieseking <martin.gieseking@uos.de> + + * src/RangeMap.cpp, tests/RangeMapTest.cpp: + use std::accumulate() to compute the number of values mapped by a + RangeMap + +2019-04-09 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in: + reworded some paragraphs on the manpage + +2019-04-05 Martin Gieseking <martin.gieseking@uos.de> + + * src/DvisvgmSpecialHandler.cpp, src/HtmlSpecialHandler.cpp, + src/InputReader.cpp, src/InputReader.hpp, src/PsSpecialHandler.cpp, + tests/StreamInputBufferTest.cpp: + optionally allow 'flags' (attributes w/o values) in attribute lists + + * src/PsSpecialHandler.cpp: + psfile/pdffile: evaluate boolean attribute 'clip' +If given, the drawing + region is clipped to the bounding box of the +EPS/PDF page being + processed. +(closes #104) + + * .appveyor.yml: + AppVeyor: switched build image to VS 2019 Preview + +2019-04-04 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml: + AppVeyor: updated release number of ttfautohint-dll + + * m4/ax_cxx_compile_stdcxx.m4: + updated ax_cxx_compile_stdcxx.m4 to version 11 + +2019-04-03 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml: + AppVeyor: set freetype version to 2.10.0; use current image of VS 2017 + again + + * src/SVGTree.cpp: + fixed gcc 5 failure regarding initializer lists + + * src/FileFinder.cpp: + pdffile special: look for pdf files in texmf tree too (closes #103) + +2019-04-01 Martin Gieseking <martin.gieseking@uos.de> + + * src/optimizer/GroupCollapser.cpp: + group collapser: unwrap groups without attributes + + * src/DVIToSVGActions.hpp, src/DvisvgmSpecialHandler.cpp, + src/DvisvgmSpecialHandler.hpp, src/EmSpecialHandler.cpp, + src/HyperlinkManager.cpp, src/ImageToSVG.hpp, src/PSPattern.cpp, + src/PsSpecialHandler.cpp, src/SpecialActions.hpp, + src/TpicSpecialHandler.cpp, tests/DvisvgmSpecialTest.cpp, + tests/EmSpecialTest.cpp, tests/TpicSpecialTest.cpp: + reduced interface of SpecialActions +- removed append/prepend and context + functions +- added direct access to the SVGTree object + +2019-03-31 Martin Gieseking <martin.gieseking@uos.de> + + * src/XMLNode.cpp, src/XMLNode.hpp, src/optimizer/AttributeExtractor.cpp, + src/optimizer/AttributeExtractor.hpp, src/optimizer/GroupCollapser.cpp, + src/optimizer/RedundantElementRemover.cpp, + src/optimizer/TransformSimplifier.cpp, src/optimizer/WSNodeRemover.cpp, + tests/BoundingBoxTest.cpp, tests/TpicSpecialTest.cpp, + tests/XMLNodeTest.cpp: + refactored the implementation of the XML node classes +for easier + modifications of the XML tree + +2019-03-30 Martin Gieseking <martin.gieseking@uos.de> + + * libs/ff-woff/Makefile.am: + added missing zlib include path to ff-woff + + * src/CMapReader.cpp: + properly release memory if CMap throws an exception + +2019-03-28 Martin Gieseking <martin.gieseking@uos.de> + + * src/GraphicsPath.hpp: + skip redundant line drawing commands in path elements + +2019-03-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/XMLString.cpp, tests/DVIReaderTest.cpp, tests/GFGlyphTracerTest.cpp, + tests/MatrixTest.cpp: + replace "0." by "." in floating point numbers |x| < 1 + + * src/GraphicsPath.hpp, tests/GFGlyphTracerTest.cpp: + avoid redundant space characters in SVG paths + + * src/GraphicsPath.hpp, tests/TpicSpecialTest.cpp: + take precision into account when checking for reflection points + +2019-03-25 Martin Gieseking <martin.gieseking@uos.de> + + * src/Matrix.cpp, src/Matrix.hpp, tests/MatrixTest.cpp: + made Matrix::parse() a static member + + * configure.ac, doc/dvisvgm.txt.in, src/CommandLine.hpp, src/DVIToSVG.cpp, + src/DependencyGraph.hpp, src/ImageToSVG.cpp, src/Makefile.am, + src/SVGOptimizer.cpp, src/SVGOptimizer.hpp, src/SVGTree.cpp, + src/XMLNode.cpp, src/dvisvgm.cpp, src/optimizer/AttributeExtractor.cpp, + src/optimizer/AttributeExtractor.hpp, src/optimizer/CMakeLists.txt, + src/optimizer/DependencyGraph.hpp, src/optimizer/GroupCollapser.cpp, + src/optimizer/GroupCollapser.hpp, src/optimizer/Makefile.am, + src/optimizer/OptimizerModule.hpp, + src/optimizer/RedundantElementRemover.cpp, + src/optimizer/RedundantElementRemover.hpp, + src/optimizer/SVGOptimizer.cpp, src/optimizer/SVGOptimizer.hpp, + src/optimizer/TransformSimplifier.cpp, + src/optimizer/TransformSimplifier.hpp, src/optimizer/WSNodeRemover.cpp, + src/optimizer/WSNodeRemover.hpp, src/options.xml, + tests/DependencyGraphTest.cpp, tests/Makefile.am, tests/create-makefile: + moved optimizer classes to subdirectory + +2019-03-24 Martin Gieseking <martin.gieseking@uos.de> + + * src/Matrix.cpp, src/Matrix.hpp, src/PsSpecialHandler.cpp, + tests/MatrixTest.cpp: + swapped Matrix::lmultiply and Matrix::rmultiply + + * src/Matrix.cpp, src/Matrix.hpp, src/SVGOptimizer.cpp, + src/SVGOptimizer.hpp, src/utility.hpp, tests/MatrixTest.cpp: + added optimizer to simplify 'transform' attributes + +2019-03-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/SVGOptimizer.cpp, src/SVGOptimizer.hpp, src/XMLNode.cpp, + src/XMLNode.hpp: + remove whitespace nodes before collapsing group elements + +2019-03-22 Martin Gieseking <martin.gieseking@uos.de> + + * src/InputBuffer.hpp: + added StringInputBuffer::assign() to assign a different string + + * src/InputReader.cpp, tests/StreamInputBufferTest.cpp: + replaced constraints for attribute names +- must start with a letter +- + may contain selected non-alphanumeric characters, like '-', '_', and '.' + + * doc/dvisvgm.txt.in, src/DvisvgmSpecialHandler.cpp, + src/DvisvgmSpecialHandler.hpp, src/SVGTree.cpp, src/XMLNode.cpp, + tests/DvisvgmSpecialTest.cpp: + allow split tags distributed over several dvisvgm:raw specials + +2019-03-21 Martin Gieseking <martin.gieseking@uos.de> + + * src/BgColorSpecialHandler.cpp, src/PSPattern.cpp, src/PageRanges.cpp, + src/PathClipper.cpp, src/RangeMap.cpp: + use type 'auto' for local iterator variables + + * src/FilePath.hpp, src/Font.hpp, src/ImageToSVG.hpp, src/PDFParser.hpp, + src/SVGOutput.hpp, src/Subfont.hpp, src/XMLNode.cpp, src/XMLNode.hpp: + use move semantics to initialize string members + +2019-03-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/BasicDVIReader.hpp, src/DVIToSVG.hpp, src/Subfont.hpp: + deleted constructors should be public + + * src/Bezier.cpp, src/Bezier.hpp, src/CMap.hpp, src/CMapReader.cpp, + src/Color.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, + src/EmSpecialHandler.cpp, src/EncFile.cpp, src/FileFinder.cpp, + src/FileFinder.hpp, src/FileSystem.cpp, src/Font.cpp, src/FontCache.cpp, + src/FontEncoding.cpp, src/FontEncoding.hpp, src/FontEngine.cpp, + src/FontEngine.hpp, src/FontManager.cpp, src/FontManager.hpp, + src/FontWriter.hpp, src/GFGlyphTracer.cpp, src/GFGlyphTracer.hpp, + src/Ghostscript.cpp, src/Ghostscript.hpp, src/ImageToSVG.cpp, + src/MapLine.cpp, src/MapLine.hpp, src/Message.cpp, src/Message.hpp, + src/NoPsSpecialHandler.hpp, src/PDFParser.cpp, src/PSInterpreter.cpp, + src/PSInterpreter.hpp, src/PathClipper.cpp, src/Process.hpp, + src/SVGCharHandler.hpp, src/SVGCharPathHandler.cpp, + src/SVGCharPathHandler.hpp, src/SVGCharTspanTextHandler.cpp, + src/SVGTree.hpp, src/VFReader.cpp, src/VFReader.hpp, src/XMLNode.cpp, + src/dvisvgm.cpp: + use nullptr instead of 0 + + * src/BoundingBox.hpp, src/CLCommandLine.hpp, src/CMapReader.hpp, + src/Calculator.hpp, src/Font.hpp, src/FontMetrics.hpp, + src/FontWriter.hpp, src/GFReader.hpp, src/Length.hpp, src/MapLine.hpp, + src/Matrix.hpp, src/MessageException.hpp, src/PDFParser.hpp, + src/PSInterpreter.hpp, src/PageSize.hpp, src/ShadingPatch.hpp, + src/SpecialHandler.hpp, src/StreamReader.hpp, src/TrueTypeFont.hpp, + src/VFReader.hpp, src/VectorIterator.hpp, src/ZLibOutputStream.hpp: + made constructors of exception classes explicit + + * src/ZLibOutputStream.hpp: + few modifications of class ZLibOutputStream + + * src/CharMapID.hpp, src/Color.hpp, src/FontCache.hpp, src/Message.cpp, + src/Message.hpp: + ensure initializations of static members don't throw exceptions + + * src/BoundingBox.cpp, src/CMapManager.cpp, src/ColorSpecialHandler.cpp, + src/DvisvgmSpecialHandler.cpp, src/PathClipper.cpp, src/RangeMap.cpp: + replaced some index-based loops with range-based ones + + * src/FilePath.cpp, src/FilePath.hpp: + fixed type used to store directories in class FilePath + + * src/CLCommandLine.cpp: + use emplace_back() instead of push_back() + + * src/FileFinder.cpp, src/Font.hpp, src/TensorProductPatch.hpp, + src/dvisvgm.cpp: + removed redundant 'virtual' modifiers and calls of c_str() + + * src/FontManager.cpp, src/HyperlinkManager.cpp, src/PageSize.cpp: + use spezialized string::find() to look for single characters + + * doc/dvisvgm.txt.in, src/CommandLine.hpp, src/dvisvgm.cpp, + src/options.xml, tests/CommandLineTest.cpp: + renamed option --exact to --exact-bbox +This change is downward + compatible due to partial matching of long options. + + * src/DVIToSVGActions.cpp, src/DvisvgmSpecialHandler.cpp, src/Matrix.cpp, + src/Matrix.hpp, src/PSPattern.cpp, src/PsSpecialHandler.cpp, + src/SVGCharHandler.cpp, src/SVGCharPathHandler.cpp, src/SVGTree.cpp, + tests/MatrixTest.cpp: + renamed and slightly refactored Matrix::getSVG() + +2019-03-19 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/DVIToSVGActions.hpp, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, + src/HyperlinkManager.cpp, src/ImageToSVG.hpp, src/SVGTree.cpp, + src/SVGTree.hpp, src/SpecialActions.hpp, tests/DvisvgmSpecialTest.cpp: + added context stack for SVG defs section + + * src/DVIToSVG.cpp, src/ImageToSVG.cpp, src/SVGOptimizer.cpp, + src/SVGOptimizer.hpp, src/SVGTree.cpp, src/SVGTree.hpp: + moved removal of redundant clipPath elements to SVGOptimizer + + * doc/dvisvgm.txt.in, src/CommandLine.hpp, src/SVGOptimizer.cpp, + src/SVGOptimizer.hpp, src/dvisvgm.cpp, src/options.xml: + added command-line option --group-attributes + +2019-03-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/Makefile.am: + reformatted file list in Makefile + +2019-03-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + added processing of PS operators xshow, yshow, and xyshow + +2019-03-15 Martin Gieseking <martin.gieseking@uos.de> + + * libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: + updated xxhash to version 0.7.0 + +2019-03-14 Martin Gieseking <martin.gieseking@uos.de> + + * src/Makefile.am, src/SVGOptimizer.cpp, src/SVGOptimizer.hpp, + src/SVGTree.cpp, src/XMLNode.cpp, src/XMLNode.hpp, src/utility.hpp: + added algorithms to move common attributes to group elements + +2019-03-13 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVGActions.hpp, src/ImageToSVG.hpp, src/PSPattern.cpp, + src/PSPattern.hpp, src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, + src/SVGTree.cpp, src/SVGTree.hpp, src/SpecialActions.hpp, + src/SpecialManager.cpp, src/SpecialManager.hpp, src/XMLDocument.cpp, + src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.hpp, + tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, + tests/TpicSpecialTest.cpp: + take unique_ptrs by value instead of rvalue reference + +2019-03-12 Martin Gieseking <martin.gieseking@uos.de> + + * src/BoundingBox.cpp, src/BoundingBox.hpp, src/DVIToSVG.cpp, + src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, + src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, + src/HyperlinkManager.cpp, src/ImageToSVG.cpp, src/ImageToSVG.hpp, + src/PSPattern.cpp, src/PSPattern.hpp, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.hpp, src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, + src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.hpp, + src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.hpp, + src/SVGTree.cpp, src/SVGTree.hpp, src/SpecialActions.hpp, + src/TpicSpecialHandler.cpp, src/XMLDocument.cpp, src/XMLDocument.hpp, + src/XMLNode.cpp, src/XMLNode.hpp, tests/DvisvgmSpecialTest.cpp, + tests/EmSpecialTest.cpp, tests/TpicSpecialTest.cpp, + tests/XMLNodeTest.cpp: + renamed XML node classes + + * src/XMLDocument.cpp, src/XMLNode.cpp, src/XMLNode.hpp, + tests/XMLNodeTest.cpp: + replaced dynamic casts of XML nodes with dedicated cast methods + +2019-03-11 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am: + rebuild manpage if configure.ac was updated +A potential change of the + version number should be propagated to the manpage. + + * doc/dvisvgm.txt.in: + manpage: added link to SVG color names + +2019-03-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + imgfile: improved and simplifed code +- compute transformation matrix + only once (for image and bbox) +- compute and update bbox only if + necessary + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.6.3 + + * NEWS: + updated NEWS + +2019-03-07 Martin Gieseking <martin.gieseking@uos.de> + + * src/dvisvgm.cpp: + option --bbox: check validity of paper format arguments corretcly + + * src/PsSpecialHandler.cpp: + ensure forward slashes in file paths passed to PS oparator 'run' + + * src/PsSpecialHandler.cpp, src/psdefs.cpp: + psfile/pdffile: adapt opposite orientation of y-coordinates properly + +2019-02-28 Martin Gieseking <martin.gieseking@uos.de> + + * src/InputReader.cpp, src/InputReader.hpp, + tests/StreamInputBufferTest.cpp, tests/StringMatcherTest.cpp: + added StringMatcher::read() + + * src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, + src/InputReader.cpp, tests/DvisvgmSpecialTest.cpp: + parse raw specials and create proper XML nodes + +2019-02-26 Martin Gieseking <martin.gieseking@uos.de> + + * src/DvisvgmSpecialHandler.cpp, src/FontWriter.cpp: + replaced lookup loops with std::find_if + +2019-02-25 Martin Gieseking <martin.gieseking@uos.de> + + * m4/Makefile.am: + add ax_check_compile_flag.m4 to distributed source archives + +2019-02-24 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, m4/ax_check_compile_flag.m4, src/Makefile.am: + add -Wno-mismatched-tags only if compiler supports + -Wmismatched-tags +(closes #101) + +2019-02-17 Martin Gieseking <martin.gieseking@uos.de> + + * src/Calculator.hpp, src/HtmlSpecialHandler.cpp, + src/HtmlSpecialHandler.hpp, src/InputReader.cpp, src/InputReader.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, + tests/StreamInputBufferTest.cpp: + replaced some unordered maps with ordered ones + + * src/HtmlSpecialHandler.cpp, src/InputReader.cpp, src/InputReader.hpp, + src/MapLine.cpp, src/PsSpecialHandler.cpp, + tests/StreamInputBufferTest.cpp: + accept alternative bounding chars in getQuotedString() + +2019-02-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/XMLNode.cpp, src/XMLNode.hpp, tests/DvisvgmSpecialTest.cpp, + tests/EmSpecialTest.cpp, tests/TpicSpecialTest.cpp: + store attributes in vectors instead of maps + +2019-02-15 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/Color.cpp, tests/ColorSpecialTest.cpp, + tests/ColorTest.cpp, tests/EmSpecialTest.cpp, tests/ShadingPatchTest.cpp, + tests/TensorProductPatchTest.cpp, tests/TpicSpecialTest.cpp, + tests/TriangularPatchTest.cpp: + use short RGB hex values if possible + +2019-02-12 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontEngine.cpp, src/Ghostscript.cpp: + replaced C casts with const_cast + +2019-02-07 Martin Gieseking <martin.gieseking@uos.de> + + * README.md: + added some links to README + +2019-01-31 Martin Gieseking <martin.gieseking@uos.de> + + * tests/gtest/include/gtest/gtest-death-test.h, + tests/gtest/include/gtest/gtest-message.h, + tests/gtest/include/gtest/gtest-param-test.h, + tests/gtest/include/gtest/gtest-printers.h, + tests/gtest/include/gtest/gtest-spi.h, + tests/gtest/include/gtest/gtest-test-part.h, + tests/gtest/include/gtest/gtest-typed-test.h, + tests/gtest/include/gtest/gtest.h, + tests/gtest/include/gtest/gtest_pred_impl.h, + tests/gtest/include/gtest/gtest_prod.h, + tests/gtest/include/gtest/internal/custom/gtest-port.h, + tests/gtest/include/gtest/internal/custom/gtest-printers.h, + tests/gtest/include/gtest/internal/custom/gtest.h, + tests/gtest/include/gtest/internal/gtest-death-test-internal.h, + tests/gtest/include/gtest/internal/gtest-filepath.h, + tests/gtest/include/gtest/internal/gtest-internal.h, + tests/gtest/include/gtest/internal/gtest-linked_ptr.h, + tests/gtest/include/gtest/internal/gtest-param-util-generated.h, + tests/gtest/include/gtest/internal/gtest-param-util.h, + tests/gtest/include/gtest/internal/gtest-port-arch.h, + tests/gtest/include/gtest/internal/gtest-port.h, + tests/gtest/include/gtest/internal/gtest-string.h, + tests/gtest/include/gtest/internal/gtest-tuple.h, + tests/gtest/include/gtest/internal/gtest-type-util.h, + tests/gtest/src/gtest-all.cc, tests/gtest/src/gtest-death-test.cc, + tests/gtest/src/gtest-filepath.cc, tests/gtest/src/gtest-internal-inl.h, + tests/gtest/src/gtest-port.cc, tests/gtest/src/gtest-printers.cc, + tests/gtest/src/gtest-test-part.cc, tests/gtest/src/gtest-typed-test.cc, + tests/gtest/src/gtest.cc, tests/gtest/src/gtest_main.cc: + updated gtest to version 1.8.1 + +2019-01-28 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + put struct PatchVertex in corresponding method + +2019-01-24 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile.am, configure.ac, m4/Makefile.am: + add m4 files to source tarball + +2019-01-22 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, README, README.md: + updated NEWS and README + + * .travis.yml: + Travis: switched to xenial environment + +2019-01-19 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/psdefs.cpp: + ensure a path loaded by 'clippath' is considered by clip/eoclip + + * src/PsSpecialHandler.cpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: + changed semantics of operand of 'newpath' +It now denotes whether method + 'newpath' was triggered by PS operator 'newpath' +or one of the + drawing/clipping operators. + + * src/GraphicsPath.hpp, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.hpp, tests/FontCacheTest.cpp, + tests/GraphicsPathTest.cpp: + only create new clipPath element if the new clip path differs + +2019-01-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/Ghostscript.cpp: + fixed formatting of GS version number + + * src/PsSpecialHandler.cpp: + use nullptr instead of 0 + +2019-01-15 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + execute 'show' if called internally by another PS operator (e.g. + charpath) + + * src/psdefs.cpp: + don't propagate local transformations to the PS handler +PS operators + like 'charpath' may perform local transformations, e.g. by +calling + 'scale'. These must not be forwarded to the PS handler. + + * libs/variant/Makefile.am, libs/variant/include/mpark/config.hpp, + libs/variant/include/mpark/in_place.hpp, + libs/variant/include/mpark/lib.hpp, + libs/variant/include/mpark/variant.hpp: + updated mpark::variant to version 1.4.0 + + * src/psdefs.cpp: + PS handler: draw glyph paths with 'fill' rather than 'eofill' + + * .appveyor.yml: + AppVeyor: updated ttfautohint revision to 1.8.2-2 + +2019-01-14 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.6.2 + +2019-01-11 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp, tests/PSInterpreterTest.cpp: + properly apply current scale values to line properties + + * src/psdefs.cpp: + prevent visible side-effects of PS operator 'stringwidth' +According to + the PS manual, p. 699, stringwidth may execute the path operators +of the + glyph descriptions. This led to visible fragments in the SVG graphics. + +2019-01-08 Martin Gieseking <martin.gieseking@uos.de> + + * doc/db2html.xsl: + manpage: fixed wrongly nested list elements + + * Makefile.am, README, README.md, configure.ac, doc/Makefile.am, + doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, + doc/dvisvgm.txt.in, doc/tweak-db-article.xsl, doc/tweak-db-refentry.xsl, + doc/tweak-dblatex-pdf.xsl, libs/Makefile.am, + libs/ff-woff/fontforge/tmpfile2.cpp, src/AGLTable.hpp, + src/BasicDVIReader.cpp, src/BasicDVIReader.hpp, src/Bezier.cpp, + src/Bezier.hpp, src/BgColorSpecialHandler.cpp, + src/BgColorSpecialHandler.hpp, src/Bitmap.cpp, src/Bitmap.hpp, + src/BoundingBox.cpp, src/BoundingBox.hpp, src/CLCommandLine.cpp, + src/CLCommandLine.hpp, src/CLOption.hpp, src/CMap.cpp, src/CMap.hpp, + src/CMapManager.cpp, src/CMapManager.hpp, src/CMapReader.cpp, + src/CMapReader.hpp, src/CRC32.cpp, src/CRC32.hpp, src/Calculator.cpp, + src/Calculator.hpp, src/CharMapID.cpp, src/CharMapID.hpp, + src/Character.hpp, src/Color.cpp, src/Color.hpp, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, + src/CommandLine.hpp, src/DLLoader.cpp, src/DLLoader.hpp, + src/DVIActions.hpp, src/DVIReader.cpp, src/DVIReader.hpp, + src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.hpp, src/DependencyGraph.hpp, src/Directory.cpp, + src/Directory.hpp, src/DvisvgmSpecialHandler.cpp, + src/DvisvgmSpecialHandler.hpp, src/EPSFile.cpp, src/EPSFile.hpp, + src/EPSToSVG.hpp, src/EmSpecialHandler.cpp, src/EmSpecialHandler.hpp, + src/EncFile.cpp, src/EncFile.hpp, src/FileFinder.cpp, src/FileFinder.hpp, + src/FilePath.cpp, src/FilePath.hpp, src/FileSystem.cpp, + src/FileSystem.hpp, src/FixWord.hpp, src/Font.cpp, src/Font.hpp, + src/FontCache.cpp, src/FontCache.hpp, src/FontEncoding.cpp, + src/FontEncoding.hpp, src/FontEngine.cpp, src/FontEngine.hpp, + src/FontManager.cpp, src/FontManager.hpp, src/FontMap.cpp, + src/FontMap.hpp, src/FontMetrics.cpp, src/FontMetrics.hpp, + src/FontStyle.hpp, src/FontWriter.cpp, src/FontWriter.hpp, + src/GFGlyphTracer.cpp, src/GFGlyphTracer.hpp, src/GFReader.cpp, + src/GFReader.hpp, src/GFTracer.cpp, src/GFTracer.hpp, + src/Ghostscript.cpp, src/Ghostscript.hpp, src/Glyph.hpp, + src/GlyphTracerMessages.hpp, src/GraphicsPath.hpp, src/HashFunction.cpp, + src/HashFunction.hpp, src/HtmlSpecialHandler.cpp, + src/HtmlSpecialHandler.hpp, src/HyperlinkManager.cpp, + src/HyperlinkManager.hpp, src/ImageToSVG.cpp, src/ImageToSVG.hpp, + src/InputBuffer.cpp, src/InputBuffer.hpp, src/InputReader.cpp, + src/InputReader.hpp, src/JFM.cpp, src/JFM.hpp, src/Length.cpp, + src/Length.hpp, src/MD5HashFunction.hpp, src/Makefile.am, + src/MapLine.cpp, src/MapLine.hpp, src/Matrix.cpp, src/Matrix.hpp, + src/Message.cpp, src/Message.hpp, src/MessageException.hpp, + src/MetafontWrapper.cpp, src/MetafontWrapper.hpp, src/MiKTeXCom.cpp, + src/MiKTeXCom.hpp, src/NoPsSpecialHandler.cpp, + src/NoPsSpecialHandler.hpp, src/NumericRanges.hpp, src/PDFParser.cpp, + src/PDFParser.hpp, src/PDFToSVG.hpp, src/PSFilter.hpp, + src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PSPattern.cpp, + src/PSPattern.hpp, src/PSPreviewFilter.cpp, src/PSPreviewFilter.hpp, + src/PageRanges.cpp, src/PageRanges.hpp, src/PageSize.cpp, + src/PageSize.hpp, src/Pair.hpp, src/PapersizeSpecialHandler.cpp, + src/PapersizeSpecialHandler.hpp, src/PathClipper.cpp, + src/PathClipper.hpp, src/PdfSpecialHandler.cpp, + src/PdfSpecialHandler.hpp, src/PreScanDVIReader.cpp, + src/PreScanDVIReader.hpp, src/Process.cpp, src/Process.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/RangeMap.cpp, + src/RangeMap.hpp, src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, + src/SVGCharHandlerFactory.cpp, src/SVGCharHandlerFactory.hpp, + src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.hpp, + src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.hpp, + src/SVGOutput.cpp, src/SVGOutput.hpp, src/SVGSingleCharTextHandler.cpp, + src/SVGSingleCharTextHandler.hpp, src/SVGTree.cpp, src/SVGTree.hpp, + src/ShadingPatch.cpp, src/ShadingPatch.hpp, src/SignalHandler.cpp, + src/SignalHandler.hpp, src/SourceInput.cpp, src/SourceInput.hpp, + src/SpecialActions.hpp, src/SpecialHandler.hpp, src/SpecialManager.cpp, + src/SpecialManager.hpp, src/StreamReader.cpp, src/StreamReader.hpp, + src/StreamWriter.cpp, src/StreamWriter.hpp, src/Subfont.cpp, + src/Subfont.hpp, src/System.cpp, src/System.hpp, src/TFM.cpp, + src/TFM.hpp, src/TTFAutohint.cpp, src/TTFAutohint.hpp, + src/TensorProductPatch.cpp, src/TensorProductPatch.hpp, src/Terminal.cpp, + src/Terminal.hpp, src/ToUnicodeMap.cpp, src/ToUnicodeMap.hpp, + src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp, + src/TriangularPatch.cpp, src/TriangularPatch.hpp, src/TrueTypeFont.cpp, + src/TrueTypeFont.hpp, src/Unicode.cpp, src/Unicode.hpp, + src/VFActions.hpp, src/VFReader.cpp, src/VFReader.hpp, + src/VectorIterator.hpp, src/VectorStream.hpp, src/XMLDocument.cpp, + src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.hpp, src/XMLString.cpp, + src/XMLString.hpp, src/XXHashFunction.hpp, src/ZLibOutputStream.hpp, + src/dvisvgm.cpp, src/ffwrapper.c, src/ffwrapper.h, src/macros.hpp, + src/options.dtd, src/options.xml, src/psdefs.cpp, src/utility.cpp, + src/utility.hpp, src/version.hpp, src/version.hpp.in, src/windows.hpp, + tests/BezierTest.cpp, tests/BitmapTest.cpp, tests/BoundingBoxTest.cpp, + tests/CMapManagerTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, + tests/CRC32Test.cpp, tests/CalculatorTest.cpp, + tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, + tests/CommandLineTest.cpp, tests/DVIReaderTest.cpp, + tests/DependencyGraphTest.cpp, tests/DirectoryTest.cpp, + tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, + tests/FileFinderTest.cpp, tests/FilePathTest.cpp, + tests/FileSystemTest.cpp, tests/FontCacheTest.cpp, + tests/FontManagerTest.cpp, tests/FontMapTest.cpp, + tests/GFGlyphTracerTest.cpp, tests/GFReaderTest.cpp, + tests/GhostscriptTest.cpp, tests/GraphicsPathTest.cpp, + tests/HashFunctionTest.cpp, tests/JFMReaderTest.cpp, + tests/LengthTest.cpp, tests/Makefile.am, tests/MapLineTest.cpp, + tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, + tests/PDFParserTest.cpp, tests/PSInterpreterTest.cpp, + tests/PageRagesTest.cpp, tests/PageSizeTest.cpp, tests/PairTest.cpp, + tests/PapersizeSpecialTest.cpp, tests/RangeMapTest.cpp, + tests/SVGOutputTest.cpp, tests/ShadingPatchTest.cpp, + tests/SpecialManagerTest.cpp, tests/SplittedCharInputBufferTest.cpp, + tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, + tests/StreamWriterTest.cpp, tests/StringMatcherTest.cpp, + tests/SubfontTest.cpp, tests/TFMReaderTest.cpp, + tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, + tests/TpicSpecialTest.cpp, tests/TriangularPatchTest.cpp, + tests/UnicodeTest.cpp, tests/UtilityTest.cpp, + tests/VectorIteratorTest.cpp, tests/VectorStreamTest.cpp, + tests/XMLNodeTest.cpp, tests/XMLStringTest.cpp, tests/check-conv, + tests/create-makefile, tests/data/Makefile.am, tests/genhashcheck.py, + tests/normalize.xsl, tests/testmain.cpp: + updated year in copyright statements to 2019 + +2018-12-13 Martin Gieseking <martin.gieseking@uos.de> + + * libs/potrace/CMakeLists.txt, libs/variant/CMakeLists.txt: + removed redundant files + +2018-11-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/CommandLine.hpp, src/options.xml: + updated description in --help output + +2018-11-06 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, doc/Makefile.am, libs/defs.am, src/Makefile.am, + tests/Makefile.am, tests/create-makefile: + Makefiles: replaced $(top_srcdir) with $(dvisvgm_srcdir) +to simplify + maintenance of dvisvgm in TeX Live + +2018-11-03 Martin Gieseking <martin.gieseking@uos.de> + + * m4/ax_cxx_compile_stdcxx.m4: + updated ax_cxx_compile_stdcxx.m4 to version 10 + +2018-10-30 Martin Gieseking <martin.gieseking@uos.de> + + * libs/brotli/Makefile.am, libs/defs.am, libs/potrace/Makefile.am, + libs/woff2/Makefile.am, libs/xxHash/Makefile.am: + use negation in Makefile conditionals + +2018-10-23 Martin Gieseking <martin.gieseking@uos.de> + + * libs/brotli/common/platform.h, libs/brotli/common/transform.c, + libs/brotli/common/version.h, libs/brotli/enc/backward_references_hq.c, + libs/brotli/enc/backward_references_hq.h, + libs/brotli/enc/backward_references_inc.h, libs/brotli/enc/encode.c, + libs/brotli/enc/hash.h, libs/brotli/enc/hash_composite_inc.h, + libs/brotli/enc/hash_longest_match64_inc.h, + libs/brotli/enc/hash_longest_match_inc.h, + libs/brotli/enc/hash_rolling_inc.h, + libs/brotli/enc/hash_to_binary_tree_inc.h: + updated brotli to version 1.0.7 + +2018-10-11 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS: + updated NEWS + +2018-10-10 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am: + only create intermediate XML files if dvisvgm.txt.1 has changed + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.6.1 + +2018-10-09 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am: + ensure dvisvgm.txt.in is distributed with the tarball + + * configure.ac, libs/brotli/Makefile.am, libs/defs.am, + libs/potrace/Makefile.am, libs/woff2/Makefile.am, + libs/xxHash/Makefile.am, src/Makefile.am, tests/Makefile.am, + tests/create-makefile: + relaxed semantics of config option --disable-bundled-libs +If some of the + system libraries brotli, potrace, woff2, and xxhash can't be +found, the + bundled libraries are used as a fallback, even if + option +--disable-bundled-libs is given. (closes #94) + +2018-10-04 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac: + added configuration option --disable-manpage (closes #93) + +2018-10-02 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, doc/Makefile.am: + don't update man page if asciidoc file hasn't changed + +2018-09-20 Martin Gieseking <martin.gieseking@uos.de> + + * libs/brotli/common/platform.h, libs/brotli/common/version.h, + libs/brotli/enc/metablock.c: + updated brotli to version 1.0.6 + +2018-09-13 Martin Gieseking <martin.gieseking@uos.de> + + * src/XXHashFunction.hpp: + fixed constexpr issue occured with gcc 4.8 + +2018-09-09 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am: + add dvisvgm.sty to distributed files + +2018-09-07 Martin Gieseking <martin.gieseking@uos.de> + + * src/Ghostscript.cpp: + call RegGetValueA() with correct buffer size + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.6 + + * NEWS: + updated NEWS + +2018-09-05 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/dvisvgm.cpp: + use enums for hash parameters rather than strings + + * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/DVIToSVG.hpp: + added optional parameter 'replace' to --page-hashes + +2018-09-04 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp, src/DVIToSVG.cpp: + reset hash function before computing a page hash + +2018-09-03 Martin Gieseking <martin.gieseking@uos.de> + + * libs/clipper/clipper.cpp: + clipper: initialize TEdge by constructor instead of memset() + +2018-09-01 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac: + removed redundant check for potrace from configure + +2018-08-31 Martin Gieseking <martin.gieseking@uos.de> + + * libs/variant/include/mpark/config.hpp: + VC: fixed failing compilation of + mpark::variant +https://github.com/mpark/variant/commit/4e3e7f88f03f513622daa973 + +2018-08-30 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml: + AppVeyor: use VS 2017 version 15.7 instead of 15.8 +Version 15.8 of + Visual Studio 2017 introduced a compiler bug that prevents +compiling + mpark::variant (https://github.com/mpark/variant/issues/48). + +2018-08-28 Martin Gieseking <martin.gieseking@uos.de> + + * src/XXHashFunction.hpp, src/dvisvgm.cpp: + use wrapper class to get the xxhash version number + + * src/HashFunction.cpp, src/HashFunction.hpp, src/MD5HashFunction.hpp, + src/XXHashFunction.hpp, tests/HashFunctionTest.cpp: + added extended create functions to hash classes + + * doc/dvisvgm.txt.in, src/CommandLine.hpp, src/DVIToSVG.cpp, + src/DVIToSVG.hpp, src/SVGOutput.cpp, src/SVGOutput.hpp, src/dvisvgm.cpp, + src/options.xml, tests/SVGOutputTest.cpp: + replaced pattern variable %h with %hd; added %ho and %hc +In order to + recognize changes in the command-line options that may affect the +SVG + output, %ho and %hc have been introduced. The former expands to a + 32-bit +hash reflecting the command-line options, the latter combines this + information +with the hash computed from the DVI page data. + +2018-08-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/dvisvgm.cpp: + option --page-hashes accepts multiple modifiers now + +2018-08-24 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/DVIToSVG.hpp, + src/HashFunction.cpp, src/HashFunction.hpp, src/SVGOutput.hpp, + src/dvisvgm.cpp, tests/CommandLineTest.cpp: + added optional parameter 'list' to option --page-hashes + + * src/dvisvgm.cpp: + fixed wrong directory separators shown in output of --cache + +2018-08-22 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/CommandLine.hpp, src/DVIToSVG.hpp, + src/dvisvgm.cpp, src/options.xml: + added command-line option --page-hashes to enable hashing functionality + +2018-08-21 Martin Gieseking <martin.gieseking@uos.de> + + * AUTHORS, README, README.md, configure.ac, libs/Makefile.am, + libs/md5/Makefile.am, libs/md5/md5.c, libs/md5/md5.h, + src/HashFunction.cpp, src/HashFunction.hpp, src/MD5HashFunction.hpp, + src/Makefile.am, src/XXHashFunction.hpp, tests/HashFunctionTest.cpp, + tests/Makefile.am, tests/create-makefile: + added classes to compute MD5, XXH32, and XXH64 hash values + + * src/BasicDVIReader.hpp, src/DVIReader.cpp: + added validity checks for bop offsets + + * src/DVIReader.cpp, src/DVIReader.hpp, src/DVIToSVG.cpp, + src/DVIToSVG.hpp, src/HashFunction.cpp, src/HashFunction.hpp, + src/SVGOutput.cpp, src/SVGOutput.hpp: + added optional computation and evaluation of page hashes +If this + functionality is enabled, a hash value based on the contents of + the +corresponding DVI page is added to the SVG file names. Furthermore, + dvisvgm +skips the conversion of these pages in subsequent calls if the + resulting SVG +files already exist. + +2018-08-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp: + DVI postamble: relaxed plausibility check of the total page count + +2018-08-08 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac: + correctly evaluate config option --disable-bundled-libs (closes #91) + +2018-08-07 Martin Gieseking <martin.gieseking@uos.de> + + * src/BasicDVIReader.hpp, src/DVIToSVG.cpp, src/DVIToSVG.hpp, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, + src/PsSpecialHandler.cpp: + getPageTransformation: replaced reference parameter with return value + + * src/DVIToSVGActions.hpp, src/ImageToSVG.hpp, src/PsSpecialHandler.cpp, + src/SpecialActions.hpp: + renamed getPageTransform; return unity matrix by default + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.5 + + * NEWS: + updated NEWS + +2018-08-02 Martin Gieseking <martin.gieseking@uos.de> + + * src/FileFinder.cpp, src/FilePath.cpp, src/FilePath.hpp, + src/Ghostscript.cpp: + TL32: also look for gsdll32.dll in the corresponding TL bin folder +The + changes are based on a patch sent by Akira Kakuto. + +2018-08-01 Martin Gieseking <martin.gieseking@uos.de> + + * README: + updated README + + * .appveyor.yml, .travis.yml: + updated CI configurations; dropped potrace as an external dependency + + * configure.ac, src/SourceInput.cpp: + set umask before calling mkstemp() +Coverity complains about calling + mkstemp() without securely setting umask first. +If umask() is available, + it's now called so that the permissions of temporary +files result to + 0600. + + * src/BoundingBox.cpp: + show lock state when printing a bounding box object + + * src/DVIToSVG.cpp: + apply user transformations even if the bounding box is locked + +2018-07-30 Martin Gieseking <martin.gieseking@uos.de> + + * src/ImageToSVG.cpp, src/ImageToSVG.hpp, src/dvisvgm.cpp: + apply --transform commands in --eps and --pdf mode too + + * src/DVIToSVG.cpp, src/Length.cpp, src/Length.hpp, tests/LengthTest.cpp: + added function to retrieve all units supported by the Length class + + * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/ImageToSVG.cpp, + tests/CalculatorTest.cpp: + allow to use all supported units in --transform commands + + * Makefile.am: + propagate --enable-bundled-libs to "distcheck" + + * AUTHORS, README.md, configure.ac, libs/Makefile.am, + libs/potrace/CMakeLists.txt, libs/potrace/Makefile.am, + libs/potrace/auxiliary.h, libs/potrace/bitmap.h, libs/potrace/config.h, + libs/potrace/curve.c, libs/potrace/curve.h, libs/potrace/decompose.c, + libs/potrace/decompose.h, libs/potrace/lists.h, + libs/potrace/potracelib.c, libs/potrace/potracelib.h, + libs/potrace/progress.h, libs/potrace/trace.c, libs/potrace/trace.h, + src/Makefile.am: + added potrace to the bundled libraries again + + * tests/Makefile.am, tests/create-makefile: + link tests only against bundled libs if configured with + --enable-bundled-libs + + * src/ImageToSVG.cpp: + changed type of exception thrown in case of invalid EPS/PDF files + +2018-07-29 Martin Gieseking <martin.gieseking@uos.de> + + * src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: + replaced internal PS operator @getpdfpagebox with PSInterpreter method + +2018-07-28 Martin Gieseking <martin.gieseking@uos.de> + + * src/dvisvgm.cpp: + removed redundant code from main() + + * README.md, doc/dvisvgm.txt.in, src/EPSToSVG.hpp, src/ImageToSVG.cpp, + src/ImageToSVG.hpp, src/PDFToSVG.hpp, src/PSInterpreter.cpp, + src/PSInterpreter.hpp, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.hpp, src/dvisvgm.cpp, src/psdefs.cpp: + PDF conversion: allow to specify the pages to process + +2018-07-25 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml, README.md, configure.ac, libs/brotli/Makefile.am, + libs/woff2/Makefile.am, libs/xxHash/Makefile.am, src/Makefile.am, + src/dvisvgm.cpp: + added config option --enable-bundled-libs +If this option is given, the + bundled libraries brotli, woff2, and xxhash are +built and statically + linked. Otherwise, the configure script looks for the +corresponing system + libraries and links dvisvgm against those. (closes #90) + +2018-07-19 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS: + fixed date in NEWS + +2018-07-18 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, doc/Makefile.am: + don't try to build manpage if required tools are missing + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.4.2 + + * NEWS: + updated NEWS + +2018-07-17 Martin Gieseking <martin.gieseking@uos.de> + + * src/HyperlinkManager.cpp: + reduced extent of hyperlinked areas to get a tight bbox + +2018-07-15 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + use unique_ptr in bbox debug code + + * src/PSPreviewFilter.cpp, src/PSPreviewFilter.hpp: + removed redundant method PSPreviewFilter::getBorders() + + * src/PSPreviewFilter.cpp, src/PsSpecialHandler.cpp: + fixed computation of preview extents (closes #89) + + * src/PsSpecialHandler.cpp: + prevent warning about missing psfile "/dev/null" + +2018-07-07 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS: + updated NEWS + + * .gitattributes: + added linguist settings to + .gitattributes + +https://github.com/github/linguist + +2018-07-06 Martin Gieseking <martin.gieseking@uos.de> + + * libs/brotli/Makefile.am, libs/brotli/common/dictionary.c, + libs/brotli/common/platform.h, libs/brotli/common/transform.c, + libs/brotli/common/version.h, libs/brotli/enc/backward_references.c, + libs/brotli/enc/brotli_bit_stream.h, libs/brotli/enc/command.h, + libs/brotli/enc/compress_fragment.c, + libs/brotli/enc/compress_fragment_two_pass.c, libs/brotli/enc/encode.c, + libs/brotli/enc/encoder_dict.h, libs/brotli/enc/fast_log.h, + libs/brotli/enc/hash.h, libs/brotli/enc/hash_composite_inc.h, + libs/brotli/enc/hash_rolling_inc.h, libs/brotli/enc/quality.h, + libs/brotli/enc/static_dict.c, libs/brotli/enc/write_bits.h, + libs/brotli/include/brotli/port.h, libs/brotli/include/brotli/types.h: + updated brotli to version 1.0.5 + + * README, README.md, doc/dvisvgm.txt.in, libs/ff-woff/README.md: + updated links to new project website dvisvgm.de + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.4.1 + +2018-07-04 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in: + manpage: updated external links + +2018-06-23 Martin Gieseking <martin.gieseking@uos.de> + + * libs/woff2/include/woff2/version.h, libs/woff2/src/font.cc, + libs/woff2/src/normalize.cc, libs/woff2/src/woff2_enc.cc: + updated woff2 to 1.0.2 + +2018-06-08 Martin Gieseking <martin.gieseking@uos.de> + + * src/SourceInput.cpp, src/SourceInput.hpp: + moved handling of temporary files to separate class + +2018-05-30 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVGActions.cpp, src/ImageToSVG.cpp: + fixed evaluation of progress delay + +2018-05-09 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in: + minor fixes in manpage + +2018-05-04 Martin Gieseking <martin.gieseking@uos.de> + + * doc/conf-dblatex-pdf.xsl: + list options and specials in PDF bookmarks of manpage + + * doc/dvisvgm.txt.in: + manpage: ordered options alphabetically according to long name + +2018-05-03 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, README, README.md: + updated NEWS and README + +2018-05-02 Martin Gieseking <martin.gieseking@uos.de> + + * src/Calculator.cpp: + catch exception by reference rather than by value + +2018-04-30 Martin Gieseking <martin.gieseking@uos.de> + + * src/EPSFile.cpp, src/EPSFile.hpp, src/EPSToSVG.cpp: + changed signature of EPSFile::bbox() + + * src/CLCommandLine.cpp: + cmdline: fixed handling of 'usage' section + + * src/EPSToSVG.cpp, src/EPSToSVG.hpp, src/ImageToSVG.cpp, + src/ImageToSVG.hpp, src/Makefile.am: + derive EPSToSVG from abstract class ImageToSVG + + * doc/dvisvgm.txt.in, src/CommandLine.hpp, src/Makefile.am, + src/PDFToSVG.hpp, src/PSInterpreter.cpp, src/PSInterpreter.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/dvisvgm.cpp, + src/options.xml, src/psdefs.cpp, tests/CommandLineTest.cpp, + tests/PSInterpreterTest.cpp: + added option --pdf to convert PDF files to SVG + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.4 + +2018-04-28 Martin Gieseking <martin.gieseking@uos.de> + + * src/BoundingBox.cpp: + swap wrongly assigned variables (doesn't affect behavior) + +2018-04-26 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + psfile: use operator 'run' to simplify execution of (E)PS files + + * src/PSInterpreter.cpp, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: + added special pdffile to embed PDF graphics + + * src/PsSpecialHandler.cpp: + apply outer transformations to psfile/pdffile graphics + +2018-04-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/Ghostscript.cpp, src/Ghostscript.hpp, src/dvisvgm.cpp, + tests/GhostscriptTest.cpp: + added function to get numeric GS revision + + * src/PSInterpreter.cpp, src/PSInterpreter.hpp: + moved GS init options to init method + + * src/PsSpecialHandler.cpp: + replaced str2double() with stod(); added check for zero bbox + + * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.hpp, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.hpp, + src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, + src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.hpp, + src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, + src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, + src/SpecialHandler.hpp, src/SpecialManager.cpp, + src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp, + tests/ColorSpecialTest.cpp, tests/DvisvgmSpecialTest.cpp, + tests/PapersizeSpecialTest.cpp, tests/TpicSpecialTest.cpp: + changed type of \special prefix from const char* to string + + * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.hpp, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.hpp, + src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, + src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.hpp, + src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, + src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, + src/SpecialHandler.hpp, src/TpicSpecialHandler.cpp, + src/TpicSpecialHandler.hpp: + removed const from result vector of SpecialHandler::prefixes() + +2018-04-19 Martin Gieseking <martin.gieseking@uos.de> + + * libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: + updated xxHash to version 0.6.5 + + * src/psdefs.cpp: + fixed handling of PS operator 'setgstate' + +2018-04-16 Martin Gieseking <martin.gieseking@uos.de> + + * m4/ax_cxx_compile_stdcxx.m4: + updated ax_cxx_compile_stdcxx.m4 to version 8 + +2018-04-13 Martin Gieseking <martin.gieseking@uos.de> + + * src/BgColorSpecialHandler.hpp, src/DvisvgmSpecialHandler.hpp, + src/EmSpecialHandler.hpp, src/HtmlSpecialHandler.hpp, + src/NoPsSpecialHandler.hpp, src/PapersizeSpecialHandler.hpp, + src/PdfSpecialHandler.hpp, src/PsSpecialHandler.hpp, + src/SpecialHandler.hpp, src/SpecialManager.cpp, src/SpecialManager.hpp, + src/TpicSpecialHandler.hpp: + merged listener methods into SpecialHandler class + + * src/CommandLine.hpp: + made opt2cpp compatible with Python 3 + +2018-04-11 Martin Gieseking <martin.gieseking@uos.de> + + * libs/brotli/Makefile.am, libs/brotli/common/constants.h, + libs/brotli/common/platform.h, libs/brotli/common/version.h, + libs/brotli/enc/backward_references.c, + libs/brotli/enc/backward_references_hq.c, libs/brotli/enc/command.h, + libs/brotli/enc/context.h, libs/brotli/enc/encode.c, + libs/brotli/enc/memory.h, libs/brotli/enc/metablock.c, + libs/brotli/enc/metablock.h, libs/brotli/enc/params.h, + libs/brotli/enc/port.h, libs/brotli/enc/quality.h, + libs/brotli/enc/write_bits.h, libs/brotli/include/brotli/decode.h, + libs/brotli/include/brotli/encode.h: + updated brotli to version 1.0.4 + +2018-03-29 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/SVGOutput.cpp, src/ZLibOutputStream.hpp, + src/dvisvgm.cpp: + enabled to output compressed SVG data to stdout + + * src/dvisvgm.cpp: + renamed SourceInput variable + +2018-03-28 Martin Gieseking <martin.gieseking@uos.de> + + * src/dvisvgm.cpp: + simplified main() function + +2018-03-27 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/CLCommandLine.cpp, src/CLCommandLine.hpp, + src/CommandLine.hpp, src/EPSFile.cpp, src/EPSFile.hpp, src/EPSToSVG.cpp, + src/EPSToSVG.hpp, src/FileSystem.cpp, src/Makefile.am, + src/PsSpecialHandler.cpp, src/SVGOutput.cpp, src/SVGOutput.hpp, + src/SourceInput.cpp, src/SourceInput.hpp, src/dvisvgm.cpp, + src/options.xml, tests/CommandLineTest.cpp, tests/SVGOutputTest.cpp: + added option to read DVI/EPS input from stdin (closes #86) + +2018-03-26 Martin Gieseking <martin.gieseking@uos.de> + + * src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: + PS handler: added processing of .setshapealpha and .setblendmode + +2018-03-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/Matrix.cpp, src/Matrix.hpp, tests/MatrixTest.cpp: + added initlist constructor to class Matrix + + * src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: + psfile special: added evaluation of operator 'setpagedevice' + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.3.5 + + * NEWS: + updated NEWS + +2018-03-21 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + added missing PS header required to evaluate color names + + * src/PSInterpreter.cpp, src/psdefs.cpp: + drop GS option -dSAFER to stay compatible with GS 9.23 + +2018-03-13 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.3.4 + + * NEWS: + updated NEWS + +2018-03-12 Martin Gieseking <martin.gieseking@uos.de> + + * tests/data/Makefile.am: + add required test file cmr10.pfb to source tarballs (closes #87) + +2018-03-07 Martin Gieseking <martin.gieseking@uos.de> + + * src/EmSpecialHandler.hpp, src/XMLDocument.hpp, src/dvisvgm.cpp: + replaced memory-inefficient lists with vectors + + * src/XMLNode.cpp, src/XMLNode.hpp: + replaced lists of XML element pointers with deques + + * src/CLCommandLine.cpp: + fixed message printed if command-line contains an isolated '-' + +2018-03-03 Martin Gieseking <martin.gieseking@uos.de> + + * libs/brotli/Makefile.am, libs/brotli/common/constants.h, + libs/brotli/common/context.h, libs/brotli/common/dictionary.h, + libs/brotli/common/platform.h, libs/brotli/common/transform.h, + libs/brotli/common/version.h, libs/brotli/enc/backward_references.c, + libs/brotli/enc/backward_references.h, + libs/brotli/enc/backward_references_hq.c, + libs/brotli/enc/backward_references_hq.h, + libs/brotli/enc/backward_references_inc.h, libs/brotli/enc/bit_cost.c, + libs/brotli/enc/bit_cost.h, libs/brotli/enc/block_encoder_inc.h, + libs/brotli/enc/block_splitter.c, libs/brotli/enc/block_splitter.h, + libs/brotli/enc/block_splitter_inc.h, + libs/brotli/enc/brotli_bit_stream.c, libs/brotli/enc/brotli_bit_stream.h, + libs/brotli/enc/cluster.c, libs/brotli/enc/cluster.h, + libs/brotli/enc/command.h, libs/brotli/enc/compress_fragment.c, + libs/brotli/enc/compress_fragment.h, + libs/brotli/enc/compress_fragment_two_pass.c, + libs/brotli/enc/compress_fragment_two_pass.h, + libs/brotli/enc/dictionary_hash.c, libs/brotli/enc/encode.c, + libs/brotli/enc/encoder_dict.c, libs/brotli/enc/encoder_dict.h, + libs/brotli/enc/entropy_encode.c, libs/brotli/enc/entropy_encode.h, + libs/brotli/enc/entropy_encode_static.h, libs/brotli/enc/fast_log.h, + libs/brotli/enc/find_match_length.h, libs/brotli/enc/hash.h, + libs/brotli/enc/hash_forgetful_chain_inc.h, + libs/brotli/enc/hash_longest_match64_inc.h, + libs/brotli/enc/hash_longest_match_inc.h, + libs/brotli/enc/hash_longest_match_quickly_inc.h, + libs/brotli/enc/hash_to_binary_tree_inc.h, libs/brotli/enc/histogram.c, + libs/brotli/enc/histogram.h, libs/brotli/enc/histogram_inc.h, + libs/brotli/enc/literal_cost.c, libs/brotli/enc/literal_cost.h, + libs/brotli/enc/memory.c, libs/brotli/enc/memory.h, + libs/brotli/enc/metablock.c, libs/brotli/enc/metablock.h, + libs/brotli/enc/metablock_inc.h, libs/brotli/enc/params.h, + libs/brotli/enc/prefix.h, libs/brotli/enc/quality.h, + libs/brotli/enc/ringbuffer.h, libs/brotli/enc/static_dict.c, + libs/brotli/enc/static_dict.h, libs/brotli/enc/static_dict_lut.h, + libs/brotli/enc/utf8_util.c, libs/brotli/enc/utf8_util.h, + libs/brotli/enc/write_bits.h, libs/brotli/include/brotli/decode.h, + libs/brotli/include/brotli/encode.h, libs/brotli/include/brotli/port.h: + updated brotli to version 1.0.3 + +2018-02-20 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in: + minor changes of the manpage + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.3.3 + + * NEWS: + updated NEWS + +2018-02-19 Martin Gieseking <martin.gieseking@uos.de> + + * src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.hpp: + don't remove fontmap definitions before processing pdf:mapXXX specials + + * src/FontEngine.cpp: + prevent creating string from nullptr + +2018-02-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/FileSystem.cpp, src/FontCache.cpp, src/FontMap.cpp, + src/GFGlyphTracer.cpp, src/MetafontWrapper.cpp, src/PsSpecialHandler.cpp, + src/utility.cpp, tests/DVIReaderTest.cpp, tests/GFReaderTest.cpp, + tests/JFMReaderTest.cpp, tests/TFMReaderTest.cpp: + removed calls of c_str() redundant since C++11 + + * src/StreamReader.cpp: + replaced c_str() with data() in StreamReader + +2018-02-08 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.3.2 + + * src/TpicSpecialHandler.cpp: + prevent potential division by 0 + + * src/dvisvgm.cpp: + prevent dereferencing nullptr (CACHE_PATH) + + * NEWS: + updated NEWS + +2018-02-05 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIActions.hpp, src/DVIReader.cpp, src/DVIReader.hpp, + src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.hpp: + don't update the SVG position after DVIActions::setChar() +Otherwise, all + characters get an explicit x position assigned even if it's +already + reached by applying the character's advance width. + +2018-01-27 Hironobu Yamashita <h.y.acetaminophen@gmail.com> + + * src/JFM.cpp: + JFM.cpp: support new JFM spec introduced in TeX Live r46452 + + * src/JFM.cpp, src/JFM.hpp, tests/JFMReaderTest.cpp: + adapted types to conform new JFM format + + * src/options.xml: + updated year in options.xml + + * src/FileFinder.cpp, src/Process.cpp: + relaxed reading from process pipe; fixed getting output of kpsewhich + (Win only) + +2018-01-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/CMap.hpp, src/RangeMap.hpp, src/ToUnicodeMap.cpp, + tests/RangeMapTest.cpp, tests/ToUnicodeMapTest.cpp: + renamed RangeMap::size() to RangeMap::numRanges() + +2018-01-14 Martin Gieseking <martin.gieseking@uos.de> + + * src/RangeMap.cpp, src/RangeMap.hpp: + added iterator and some getters to RangeMap + +2018-01-12 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml: + AppVeyor: updated to FreeType 2.9 and ttfautohint 1.8.1 + + * .appveyor.yml: + AppVeyor: fixed download link of ttfautohint-dll + + * NEWS: + updated NEWS + +2018-01-11 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in: + manpage: reworded info about option --bbox=preview (closes #83) + +2018-01-09 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.3.1 + +2018-01-03 Martin Gieseking <martin.gieseking@uos.de> + + * src/CMapReader.cpp, src/Directory.cpp, src/Directory.hpp, + src/DvisvgmSpecialHandler.cpp, src/FileFinder.cpp, src/FileFinder.hpp, + src/FilePath.cpp, src/FilePath.hpp, src/FileSystem.cpp, + src/FileSystem.hpp, src/Font.cpp, src/FontCache.cpp, src/FontCache.hpp, + src/FontMap.cpp, src/FontMetrics.cpp, src/FontMetrics.hpp, + src/MetafontWrapper.cpp: + replaced some C string parameters with C++ strings + +2018-01-02 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile.am, README, README.md, configure.ac, doc/Makefile.am, + doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, + doc/dvisvgm.txt.in, doc/tweak-db-article.xsl, doc/tweak-db-refentry.xsl, + doc/tweak-dblatex-pdf.xsl, libs/Makefile.am, + libs/ff-woff/fontforge/tmpfile2.cpp, src/AGLTable.hpp, + src/BasicDVIReader.cpp, src/BasicDVIReader.hpp, src/Bezier.cpp, + src/Bezier.hpp, src/BgColorSpecialHandler.cpp, + src/BgColorSpecialHandler.hpp, src/Bitmap.cpp, src/Bitmap.hpp, + src/BoundingBox.cpp, src/BoundingBox.hpp, src/CLCommandLine.cpp, + src/CLCommandLine.hpp, src/CLOption.hpp, src/CMap.cpp, src/CMap.hpp, + src/CMapManager.cpp, src/CMapManager.hpp, src/CMapReader.cpp, + src/CMapReader.hpp, src/CRC32.cpp, src/CRC32.hpp, src/Calculator.cpp, + src/Calculator.hpp, src/CharMapID.cpp, src/CharMapID.hpp, + src/Character.hpp, src/Color.cpp, src/Color.hpp, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, + src/CommandLine.hpp, src/DLLoader.cpp, src/DLLoader.hpp, + src/DVIActions.hpp, src/DVIReader.cpp, src/DVIReader.hpp, + src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.hpp, src/DependencyGraph.hpp, src/Directory.cpp, + src/Directory.hpp, src/DvisvgmSpecialHandler.cpp, + src/DvisvgmSpecialHandler.hpp, src/EPSFile.cpp, src/EPSFile.hpp, + src/EPSToSVG.cpp, src/EPSToSVG.hpp, src/EmSpecialHandler.cpp, + src/EmSpecialHandler.hpp, src/EncFile.cpp, src/EncFile.hpp, + src/FileFinder.cpp, src/FileFinder.hpp, src/FilePath.cpp, + src/FilePath.hpp, src/FileSystem.cpp, src/FileSystem.hpp, + src/FixWord.hpp, src/Font.cpp, src/Font.hpp, src/FontCache.cpp, + src/FontCache.hpp, src/FontEncoding.cpp, src/FontEncoding.hpp, + src/FontEngine.cpp, src/FontEngine.hpp, src/FontManager.cpp, + src/FontManager.hpp, src/FontMap.cpp, src/FontMap.hpp, + src/FontMetrics.cpp, src/FontMetrics.hpp, src/FontStyle.hpp, + src/FontWriter.cpp, src/FontWriter.hpp, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.hpp, src/GFReader.cpp, src/GFReader.hpp, + src/GFTracer.cpp, src/GFTracer.hpp, src/Ghostscript.cpp, + src/Ghostscript.hpp, src/Glyph.hpp, src/GlyphTracerMessages.hpp, + src/GraphicsPath.hpp, src/HtmlSpecialHandler.cpp, + src/HtmlSpecialHandler.hpp, src/HyperlinkManager.cpp, + src/HyperlinkManager.hpp, src/InputBuffer.cpp, src/InputBuffer.hpp, + src/InputReader.cpp, src/InputReader.hpp, src/JFM.cpp, src/JFM.hpp, + src/Length.cpp, src/Length.hpp, src/Makefile.am, src/MapLine.cpp, + src/MapLine.hpp, src/Matrix.cpp, src/Matrix.hpp, src/Message.cpp, + src/Message.hpp, src/MessageException.hpp, src/MetafontWrapper.cpp, + src/MetafontWrapper.hpp, src/MiKTeXCom.cpp, src/MiKTeXCom.hpp, + src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.hpp, + src/NumericRanges.hpp, src/PDFParser.cpp, src/PDFParser.hpp, + src/PSFilter.hpp, src/PSInterpreter.cpp, src/PSInterpreter.hpp, + src/PSPattern.cpp, src/PSPattern.hpp, src/PSPreviewFilter.cpp, + src/PSPreviewFilter.hpp, src/PageRanges.cpp, src/PageRanges.hpp, + src/PageSize.cpp, src/PageSize.hpp, src/Pair.hpp, + src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, + src/PathClipper.cpp, src/PathClipper.hpp, src/PdfSpecialHandler.cpp, + src/PdfSpecialHandler.hpp, src/PreScanDVIReader.cpp, + src/PreScanDVIReader.hpp, src/Process.cpp, src/Process.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/RangeMap.cpp, + src/RangeMap.hpp, src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, + src/SVGCharHandlerFactory.cpp, src/SVGCharHandlerFactory.hpp, + src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.hpp, + src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.hpp, + src/SVGOutput.cpp, src/SVGOutput.hpp, src/SVGSingleCharTextHandler.cpp, + src/SVGSingleCharTextHandler.hpp, src/SVGTree.cpp, src/SVGTree.hpp, + src/ShadingPatch.cpp, src/ShadingPatch.hpp, src/SignalHandler.cpp, + src/SignalHandler.hpp, src/SpecialActions.hpp, src/SpecialHandler.hpp, + src/SpecialManager.cpp, src/SpecialManager.hpp, src/StreamReader.cpp, + src/StreamReader.hpp, src/StreamWriter.cpp, src/StreamWriter.hpp, + src/Subfont.cpp, src/Subfont.hpp, src/System.cpp, src/System.hpp, + src/TFM.cpp, src/TFM.hpp, src/TTFAutohint.cpp, src/TTFAutohint.hpp, + src/TensorProductPatch.cpp, src/TensorProductPatch.hpp, src/Terminal.cpp, + src/Terminal.hpp, src/ToUnicodeMap.cpp, src/ToUnicodeMap.hpp, + src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp, + src/TriangularPatch.cpp, src/TriangularPatch.hpp, src/TrueTypeFont.cpp, + src/TrueTypeFont.hpp, src/Unicode.cpp, src/Unicode.hpp, + src/VFActions.hpp, src/VFReader.cpp, src/VFReader.hpp, + src/VectorIterator.hpp, src/VectorStream.hpp, src/XMLDocument.cpp, + src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.hpp, src/XMLString.cpp, + src/XMLString.hpp, src/ZLibOutputStream.hpp, src/dvisvgm.cpp, + src/ffwrapper.c, src/ffwrapper.h, src/macros.hpp, src/options.dtd, + src/options.xml, src/psdefs.cpp, src/utility.cpp, src/utility.hpp, + src/version.hpp, src/version.hpp.in, src/windows.hpp, + tests/BezierTest.cpp, tests/BitmapTest.cpp, tests/BoundingBoxTest.cpp, + tests/CMapManagerTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, + tests/CRC32Test.cpp, tests/CalculatorTest.cpp, + tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, + tests/CommandLineTest.cpp, tests/DVIReaderTest.cpp, + tests/DependencyGraphTest.cpp, tests/DirectoryTest.cpp, + tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, + tests/FileFinderTest.cpp, tests/FilePathTest.cpp, + tests/FileSystemTest.cpp, tests/FontCacheTest.cpp, + tests/FontManagerTest.cpp, tests/FontMapTest.cpp, + tests/GFGlyphTracerTest.cpp, tests/GFReaderTest.cpp, + tests/GhostscriptTest.cpp, tests/GraphicsPathTest.cpp, + tests/JFMReaderTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, + tests/MapLineTest.cpp, tests/MatrixTest.cpp, + tests/MessageExceptionTest.cpp, tests/PDFParserTest.cpp, + tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, + tests/PageSizeTest.cpp, tests/PairTest.cpp, + tests/PapersizeSpecialTest.cpp, tests/RangeMapTest.cpp, + tests/SVGOutputTest.cpp, tests/ShadingPatchTest.cpp, + tests/SpecialManagerTest.cpp, tests/SplittedCharInputBufferTest.cpp, + tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, + tests/StreamWriterTest.cpp, tests/StringMatcherTest.cpp, + tests/SubfontTest.cpp, tests/TFMReaderTest.cpp, + tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, + tests/TpicSpecialTest.cpp, tests/TriangularPatchTest.cpp, + tests/UnicodeTest.cpp, tests/UtilityTest.cpp, + tests/VectorIteratorTest.cpp, tests/VectorStreamTest.cpp, + tests/XMLNodeTest.cpp, tests/XMLStringTest.cpp, tests/check-conv, + tests/create-makefile, tests/data/Makefile.am, tests/genhashcheck.py, + tests/normalize.xsl, tests/testmain.cpp: + updated year in copyright statements to 2018 + + * src/dvisvgm.cpp: + avoid potential dangling string pointer to --fontmap argument + + * src/Font.cpp: + fixed char width of fonts slanted by style option (closes #82) + +2017-12-31 Martin Gieseking <martin.gieseking@uos.de> + + * src/TTFAutohint.hpp: + don't declare member variables of TTFAutohint if ttfautohint is not + available + + * src/FontWriter.cpp: + keep unhinted TTF if autohinting failed + +2017-12-28 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml: + AppVeyor: download and install ttfautohint headers + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.3 + + * NEWS, README, README.md: + updated README and NEWS + +2017-12-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/DLLoader.cpp, src/DLLoader.hpp, src/Ghostscript.cpp, + src/TTFAutohint.cpp: + simplify function to load a symbol from a dynamic library + +2017-12-23 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, src/DLLoader.cpp, src/DLLoader.hpp, src/FontWriter.cpp, + src/Makefile.am, src/TTFAutohint.cpp, src/TTFAutohint.hpp, + src/dvisvgm.cpp: + added code to load libttfautohint dynamically at runtime + +2017-12-22 Martin Gieseking <martin.gieseking@uos.de> + + * libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: + updated xxHash to version 0.6.4 + +2017-12-21 Martin Gieseking <martin.gieseking@uos.de> + + * tests/gtest/include/gtest/gtest-param-test.h, + tests/gtest/include/gtest/gtest-printers.h, + tests/gtest/include/gtest/gtest-spi.h, + tests/gtest/include/gtest/gtest-typed-test.h, + tests/gtest/include/gtest/gtest.h, + tests/gtest/include/gtest/internal/custom/gtest-port.h, + tests/gtest/include/gtest/internal/custom/gtest.h, + tests/gtest/include/gtest/internal/gtest-internal.h, + tests/gtest/include/gtest/internal/gtest-param-util-generated.h, + tests/gtest/include/gtest/internal/gtest-param-util.h, + tests/gtest/include/gtest/internal/gtest-port-arch.h, + tests/gtest/include/gtest/internal/gtest-port.h, + tests/gtest/src/gtest-death-test.cc, + tests/gtest/src/gtest-internal-inl.h, tests/gtest/src/gtest-port.cc, + tests/gtest/src/gtest-printers.cc, tests/gtest/src/gtest.cc: + updated gtest + +2017-12-19 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac: + configure: dropped check of outdated Ghostscript version + + * configure.ac, src/Makefile.am: + configure: added --with-kpathsea to set the path of the kpathsea devel + files +closes #71 + +2017-12-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + psdefs: replaced '6 array' with 'matrix' + +2017-12-17 Martin Gieseking <martin.gieseking@uos.de> + + * libs/woff2/Makefile.am, libs/woff2/include/woff2/file.h, + src/FontWriter.cpp, src/FontWriter.hpp, src/Makefile.am, + src/StreamReader.hpp, src/StreamWriter.cpp, src/StreamWriter.hpp, + src/TrueTypeFont.cpp, src/TrueTypeFont.hpp, src/ffwrapper.c, + src/ffwrapper.h, src/utility.cpp, src/utility.hpp: + replaced ff_sfd_to_woff() with TrueTypeFont::writeWOFF() + + * configure.ac, src/FontWriter.cpp, src/Makefile.am, src/dvisvgm.cpp: + added optional support for ttfautohint + +2017-12-14 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, libs/Makefile.am, libs/brotli/LICENSE, + libs/brotli/Makefile.am, libs/brotli/common/constants.h, + libs/brotli/common/dictionary.c, libs/brotli/common/dictionary.h, + libs/brotli/common/version.h, libs/brotli/enc/backward_references.c, + libs/brotli/enc/backward_references.h, + libs/brotli/enc/backward_references_hq.c, + libs/brotli/enc/backward_references_hq.h, + libs/brotli/enc/backward_references_inc.h, libs/brotli/enc/bit_cost.c, + libs/brotli/enc/bit_cost.h, libs/brotli/enc/bit_cost_inc.h, + libs/brotli/enc/block_encoder_inc.h, libs/brotli/enc/block_splitter.c, + libs/brotli/enc/block_splitter.h, libs/brotli/enc/block_splitter_inc.h, + libs/brotli/enc/brotli_bit_stream.c, libs/brotli/enc/brotli_bit_stream.h, + libs/brotli/enc/cluster.c, libs/brotli/enc/cluster.h, + libs/brotli/enc/cluster_inc.h, libs/brotli/enc/command.h, + libs/brotli/enc/compress_fragment.c, libs/brotli/enc/compress_fragment.h, + libs/brotli/enc/compress_fragment_two_pass.c, + libs/brotli/enc/compress_fragment_two_pass.h, libs/brotli/enc/context.h, + libs/brotli/enc/dictionary_hash.c, libs/brotli/enc/dictionary_hash.h, + libs/brotli/enc/encode.c, libs/brotli/enc/entropy_encode.c, + libs/brotli/enc/entropy_encode.h, + libs/brotli/enc/entropy_encode_static.h, libs/brotli/enc/fast_log.h, + libs/brotli/enc/find_match_length.h, libs/brotli/enc/hash.h, + libs/brotli/enc/hash_forgetful_chain_inc.h, + libs/brotli/enc/hash_longest_match64_inc.h, + libs/brotli/enc/hash_longest_match_inc.h, + libs/brotli/enc/hash_longest_match_quickly_inc.h, + libs/brotli/enc/hash_to_binary_tree_inc.h, libs/brotli/enc/histogram.c, + libs/brotli/enc/histogram.h, libs/brotli/enc/histogram_inc.h, + libs/brotli/enc/literal_cost.c, libs/brotli/enc/literal_cost.h, + libs/brotli/enc/memory.c, libs/brotli/enc/memory.h, + libs/brotli/enc/metablock.c, libs/brotli/enc/metablock.h, + libs/brotli/enc/metablock_inc.h, libs/brotli/enc/port.h, + libs/brotli/enc/prefix.h, libs/brotli/enc/quality.h, + libs/brotli/enc/ringbuffer.h, libs/brotli/enc/static_dict.c, + libs/brotli/enc/static_dict.h, libs/brotli/enc/static_dict_lut.h, + libs/brotli/enc/utf8_util.c, libs/brotli/enc/utf8_util.h, + libs/brotli/enc/write_bits.h, libs/brotli/include/brotli/decode.h, + libs/brotli/include/brotli/encode.h, libs/brotli/include/brotli/port.h, + libs/brotli/include/brotli/types.h, libs/woff2/Makefile.am, + libs/woff2/brotli/LICENSE, libs/woff2/brotli/Makefile.am, + libs/woff2/brotli/common/constants.h, + libs/woff2/brotli/common/dictionary.c, + libs/woff2/brotli/common/dictionary.h, + libs/woff2/brotli/common/version.h, + libs/woff2/brotli/enc/backward_references.c, + libs/woff2/brotli/enc/backward_references.h, + libs/woff2/brotli/enc/backward_references_hq.c, + libs/woff2/brotli/enc/backward_references_hq.h, + libs/woff2/brotli/enc/backward_references_inc.h, + libs/woff2/brotli/enc/bit_cost.c, libs/woff2/brotli/enc/bit_cost.h, + libs/woff2/brotli/enc/bit_cost_inc.h, + libs/woff2/brotli/enc/block_encoder_inc.h, + libs/woff2/brotli/enc/block_splitter.c, + libs/woff2/brotli/enc/block_splitter.h, + libs/woff2/brotli/enc/block_splitter_inc.h, + libs/woff2/brotli/enc/brotli_bit_stream.c, + libs/woff2/brotli/enc/brotli_bit_stream.h, + libs/woff2/brotli/enc/cluster.c, libs/woff2/brotli/enc/cluster.h, + libs/woff2/brotli/enc/cluster_inc.h, libs/woff2/brotli/enc/command.h, + libs/woff2/brotli/enc/compress_fragment.c, + libs/woff2/brotli/enc/compress_fragment.h, + libs/woff2/brotli/enc/compress_fragment_two_pass.c, + libs/woff2/brotli/enc/compress_fragment_two_pass.h, + libs/woff2/brotli/enc/context.h, libs/woff2/brotli/enc/dictionary_hash.c, + libs/woff2/brotli/enc/dictionary_hash.h, libs/woff2/brotli/enc/encode.c, + libs/woff2/brotli/enc/entropy_encode.c, + libs/woff2/brotli/enc/entropy_encode.h, + libs/woff2/brotli/enc/entropy_encode_static.h, + libs/woff2/brotli/enc/fast_log.h, + libs/woff2/brotli/enc/find_match_length.h, libs/woff2/brotli/enc/hash.h, + libs/woff2/brotli/enc/hash_forgetful_chain_inc.h, + libs/woff2/brotli/enc/hash_longest_match64_inc.h, + libs/woff2/brotli/enc/hash_longest_match_inc.h, + libs/woff2/brotli/enc/hash_longest_match_quickly_inc.h, + libs/woff2/brotli/enc/hash_to_binary_tree_inc.h, + libs/woff2/brotli/enc/histogram.c, libs/woff2/brotli/enc/histogram.h, + libs/woff2/brotli/enc/histogram_inc.h, + libs/woff2/brotli/enc/literal_cost.c, + libs/woff2/brotli/enc/literal_cost.h, libs/woff2/brotli/enc/memory.c, + libs/woff2/brotli/enc/memory.h, libs/woff2/brotli/enc/metablock.c, + libs/woff2/brotli/enc/metablock.h, libs/woff2/brotli/enc/metablock_inc.h, + libs/woff2/brotli/enc/port.h, libs/woff2/brotli/enc/prefix.h, + libs/woff2/brotli/enc/quality.h, libs/woff2/brotli/enc/ringbuffer.h, + libs/woff2/brotli/enc/static_dict.c, libs/woff2/brotli/enc/static_dict.h, + libs/woff2/brotli/enc/static_dict_lut.h, + libs/woff2/brotli/enc/utf8_util.c, libs/woff2/brotli/enc/utf8_util.h, + libs/woff2/brotli/enc/write_bits.h, + libs/woff2/brotli/include/brotli/decode.h, + libs/woff2/brotli/include/brotli/encode.h, + libs/woff2/brotli/include/brotli/port.h, + libs/woff2/brotli/include/brotli/types.h, src/Makefile.am, + tests/Makefile.am, tests/create-makefile: + moved brotli from woff2 to libs folder + +2017-12-12 Martin Gieseking <martin.gieseking@uos.de> + + * libs/variant/include/mpark/config.hpp, + libs/variant/include/mpark/lib.hpp, + libs/variant/include/mpark/variant.hpp: + updated mpark::variant to + https://github.com/mpark/variant/commit/382014b +fixes a build error + introduced with MSVC 19.12 + +2017-12-11 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.2.3 + + * NEWS: + updated NEWS + +2017-11-29 Martin Gieseking <martin.gieseking@uos.de> + + * libs/woff2/brotli/common/dictionary.h, + libs/woff2/brotli/common/version.h, + libs/woff2/brotli/enc/backward_references_hq.c, + libs/woff2/brotli/enc/backward_references_hq.h, + libs/woff2/brotli/enc/port.h, libs/woff2/brotli/enc/quality.h, + libs/woff2/brotli/include/brotli/decode.h, + libs/woff2/brotli/include/brotli/encode.h: + updated brotli to version 1.0.2 + +2017-11-24 Martin Gieseking <martin.gieseking@uos.de> + + * src/BgColorSpecialHandler.cpp, src/BoundingBox.cpp, src/BoundingBox.hpp, + src/Color.cpp, src/PathClipper.cpp, src/SVGTree.cpp, + tests/BoundingBoxTest.cpp: + minor code cleanup and improvements + + * src/DependencyGraph.hpp: + simplified DependencyGraph::GraphNode + +2017-11-23 Martin Gieseking <martin.gieseking@uos.de> + + * tests/TpicSpecialTest.cpp: + added missing initializers in TpicSpecialTest + + * tests/EmSpecialTest.cpp: + added missing initializers in EmSpecialTest + + * src/DependencyGraph.hpp: + fixed dangling pointer issue in DependencyGraph + + * src/Makefile.am, tests/Makefile.am, tests/create-makefile: + suppress warnings regarding 'mismatched tags' + (class/struct) +https://gcc.gnu.org/wiki/FAQ#Why_GCC_does_not_warn_for_mismatch_between_struct_and_class_.28-Wmismatched-tags.29_.3F + +2017-11-22 Martin Gieseking <martin.gieseking@uos.de> + + * src/PSPattern.cpp, src/SVGCharHandler.cpp, src/SVGTree.cpp, + src/TpicSpecialHandler.cpp: + removed redundant calls of std::move() + + * src/Subfont.cpp, src/Subfont.hpp, tests/CMapManagerTest.cpp, + tests/FileFinderTest.cpp, tests/FontManagerTest.cpp, tests/Makefile.am, + tests/MapLineTest.cpp, tests/SubfontTest.cpp, tests/create-makefile, + tests/testmain.cpp, tests/testutil.hpp: + tests: moved common initializations to testmain.cpp + + * src/DVIReader.hpp, tests/DVIReaderTest.cpp, tests/Makefile.am, + tests/data/Makefile.am, tests/data/cmr10.pfb, tests/data/sample_v2.dvi, + tests/data/sample_v3.dvi: + added test for DVIReader + +2017-11-21 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile.am: + removed redundant lcov statement from Makefile + +2017-11-20 Martin Gieseking <martin.gieseking@uos.de> + + * tests/CMapTest.cpp, tests/GFReaderTest.cpp, tests/JFMReaderTest.cpp, + tests/RangeMapTest.cpp, tests/TFMReaderTest.cpp, + tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, + tests/VectorStreamTest.cpp: + tests: few code improvements + + * README.md: + added donation badge to readme + +2017-11-17 Martin Gieseking <martin.gieseking@uos.de> + + * src/Font.cpp, src/Font.hpp: + prevent dangling pointers to font map entries (closes #79) + + * src/CMapManager.cpp, src/FileFinder.cpp, src/Font.cpp, src/Font.hpp, + src/FontEngine.cpp, src/FontManager.cpp, src/FontMap.cpp, + src/FontMap.hpp, src/Ghostscript.cpp, src/MiKTeXCom.cpp, src/XMLNode.cpp: + replaced null pointer constants with 'nullptr' + + * src/XMLString.cpp, tests/TensorProductPatchTest.cpp, + tests/XMLStringTest.cpp: + avoid scientific notation when printing floats/doubles + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.2.2 + + * NEWS: + updated NEWS + +2017-11-13 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am: + ensure tweak-db-refentry.xsl is put into the tarball + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.2.1 + + * NEWS, README.md: + updated NEWS and README + + * libs/variant/include/mpark/lib.hpp, + libs/variant/include/mpark/variant.hpp: + updated mpark::variant to commit + ea542a0 +https://github.com/mpark/variant/commit/ea542a0fef86fb8c1696238b95bdaddb8ff2337c + +2017-11-10 Martin Gieseking <martin.gieseking@uos.de> + + * README, README.md, doc/dvisvgm.txt.in: + minor additions/fixes of manpage and README + +2017-11-02 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am, doc/db2html.xsl, doc/tweak-db-refentry.xsl: + manpage: avoid using 'stats' to improve portability (closes #72) + +2017-10-31 Martin Gieseking <martin.gieseking@uos.de> + + * src/InputReader.cpp, src/InputReader.hpp, src/PSInterpreter.cpp: + simplified code to lookup PS operators + +2017-10-30 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: + properly apply CTM to linewidth (closes #77) + + * src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: + call applyscalevals on every change of the CTM + +2017-10-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, + src/DvisvgmSpecialHandler.cpp, src/EPSToSVG.cpp, src/EPSToSVG.hpp, + src/EmSpecialHandler.cpp, src/HyperlinkManager.cpp, src/PSPattern.cpp, + src/PSPattern.hpp, src/PsSpecialHandler.cpp, src/SVGCharHandler.cpp, + src/SVGCharHandler.hpp, src/SVGCharPathHandler.cpp, + src/SVGCharTspanTextHandler.cpp, src/SVGSingleCharTextHandler.cpp, + src/SVGTree.cpp, src/SVGTree.hpp, src/ShadingPatch.hpp, + src/SpecialActions.hpp, src/TpicSpecialHandler.cpp, src/XMLDocument.cpp, + src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.hpp, src/utility.hpp, + tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, + tests/TpicSpecialTest.cpp, tests/XMLNodeTest.cpp: + replaced raw XMLNode pointers with unique_ptrs +which helps to ensure + proper ownership and simplifies deleting the corresponding objects + + * src/DependencyGraph.hpp, src/SVGTree.cpp, tests/DependencyGraphTest.cpp: + manage heap memory in DependencyGraph with unique_ptrs + +2017-10-21 Martin Gieseking <martin.gieseking@uos.de> + + * libs/ff-woff/fontforge/macbinary.c: + updated link to CTAN:/tools/macutils/crc + +2017-10-20 Martin Gieseking <martin.gieseking@uos.de> + + * libs/woff2/include/woff2/version.h: + replaced CRLF line endings + +2017-10-17 Martin Gieseking <martin.gieseking@uos.de> + + * src/CMapManager.cpp, src/CMapReader.cpp, src/CMapReader.hpp, + src/DVIActions.hpp, src/DVIToSVG.cpp, src/DVIToSVG.hpp, + src/DVIToSVGActions.hpp, src/FileFinder.cpp, src/Font.cpp, src/Font.hpp, + src/FontEncoding.cpp, src/FontEncoding.hpp, src/FontEngine.cpp, + src/FontEngine.hpp, src/FontManager.cpp, src/FontMetrics.cpp, + src/FontMetrics.hpp, src/PSPattern.hpp, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.hpp, src/SVGCharHandlerFactory.cpp, + src/SVGCharHandlerFactory.hpp, src/SVGOutput.cpp, + src/SVGSingleCharTextHandler.hpp, src/SVGTree.cpp, src/ShadingPatch.cpp, + src/ShadingPatch.hpp, src/SignalHandler.cpp, src/Subfont.cpp, + src/Subfont.hpp, src/XMLNode.cpp, tests/CMapReaderTest.cpp, + tests/ShadingPatchTest.cpp: + replaced several bare new/delete statements with unique pointers + + * src/dvisvgm.cpp: + fixed output of option --version + + * src/Length.hpp, src/PageSize.cpp: + added user-defined literals for some length units + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.2 + + * NEWS, README, README.md: + updated NEWS and README + +2017-10-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontWriter.cpp: + added missing #include of config.h + + * src/Message.cpp: + check for '\0' at end of DVISVGM_COLORS + + * src/Subfont.cpp: + don't access unique_ptr after it has been moved + +2017-10-15 Martin Gieseking <martin.gieseking@uos.de> + + * src/PDFParser.cpp, src/PDFParser.hpp: + replaced shared_ptr with unique_ptr in PDFParser + +2017-10-13 Martin Gieseking <martin.gieseking@uos.de> + + * AUTHORS, configure.ac, doc/dvisvgm.txt.in, libs/Makefile.am, + libs/variant/CMakeLists.txt, libs/variant/LICENSE.md, + libs/variant/Makefile.am, libs/variant/include/mpark/in_place.hpp, + libs/variant/include/mpark/lib.hpp, + libs/variant/include/mpark/variant.hpp, src/HyperlinkManager.cpp, + src/HyperlinkManager.hpp, src/InputReader.hpp, src/Makefile.am, + src/PDFParser.cpp, src/PDFParser.hpp, src/PdfSpecialHandler.cpp, + src/PdfSpecialHandler.hpp, tests/Makefile.am, tests/PDFParserTest.cpp, + tests/SpecialManagerTest.cpp, tests/create-makefile: + added evaluation of PDF hyperlink specials (closes #74) + + * libs/variant/include/mpark/config.hpp: + added missing config file + + * .travis.yml: + Travis: use gcc 4.9 rather than 4.8 to compile mpark::variant correctly + + * tests/Makefile.am, tests/create-makefile, tests/testmain.cpp: + add custom testmain to gtest.a + +2017-10-11 Martin Gieseking <martin.gieseking@uos.de> + + * src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, + src/HyperlinkManager.cpp, src/HyperlinkManager.hpp, src/Makefile.am, + src/dvisvgm.cpp: + separated hyperlink functionality from HtmlSpecialHandler to + HyperlinkManager + +2017-10-09 Martin Gieseking <martin.gieseking@uos.de> + + * libs/woff2/src/font.cc, libs/woff2/src/normalize.cc, + libs/woff2/src/woff2_enc.cc: + woff2: removed unused variables to prevent compiler warnings + + * libs/woff2/src/font.cc, libs/woff2/src/normalize.cc, + libs/woff2/src/woff2_enc.cc: + woff2: removed unused variables to prevent compiler warnings + +2017-10-08 Martin Gieseking <martin.gieseking@uos.de> + + * libs/woff2/Makefile.am, libs/woff2/include/woff2/decode.h, + libs/woff2/include/woff2/encode.h, libs/woff2/include/woff2/file.h, + libs/woff2/include/woff2/output.h, libs/woff2/include/woff2/version.h, + libs/woff2/src/buffer.h, libs/woff2/src/file.h, libs/woff2/src/font.cc, + libs/woff2/src/font.h, libs/woff2/src/glyph.cc, libs/woff2/src/glyph.h, + libs/woff2/src/normalize.cc, libs/woff2/src/normalize.h, + libs/woff2/src/port.h, libs/woff2/src/round.h, + libs/woff2/src/store_bytes.h, libs/woff2/src/table_tags.cc, + libs/woff2/src/table_tags.h, libs/woff2/src/transform.cc, + libs/woff2/src/transform.h, libs/woff2/src/variable_length.cc, + libs/woff2/src/variable_length.h, libs/woff2/src/woff2_common.cc, + libs/woff2/src/woff2_common.h, libs/woff2/src/woff2_dec.h, + libs/woff2/src/woff2_enc.cc, libs/woff2/src/woff2_enc.h, + libs/woff2/src/woff2_out.cc, libs/woff2/src/woff2_out.h, + src/FontWriter.cpp, src/Makefile.am, src/dvisvgm.cpp: + updated woff2 to version 1.0.1 + +2017-10-06 Martin Gieseking <martin.gieseking@uos.de> + + * src/CRC32.hpp, src/SpecialManager.hpp, src/Subfont.hpp, src/XMLNode.hpp: + use delete/default to remove/implement constructors + + * src/XMLNode.cpp, src/XMLNode.hpp: + added move constructor to XMLElementNode + + * src/Subfont.cpp, src/Subfont.hpp, src/utility.hpp: + removed stream-based constructor of SubfontException + +2017-09-29 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/PapersizeSpecialHandler.cpp, + src/PapersizeSpecialHandler.hpp, src/PdfSpecialHandler.cpp, + src/PdfSpecialHandler.hpp, src/SpecialManager.cpp, + src/SpecialManager.hpp, tests/PapersizeSpecialTest.cpp: + added evaluation of pdf:pagesize specials + +2017-09-28 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVG.cpp, src/Length.hpp, src/PageSize.cpp, src/PageSize.hpp, + src/utility.hpp, tests/PageSizeTest.cpp: + use class Length in PageSize rather than plain numbers + + * src/BoundingBox.cpp, src/BoundingBox.hpp, src/DVIToSVG.cpp, + src/utility.cpp, src/utility.hpp, tests/BoundingBoxTest.cpp, + tests/UtilityTest.cpp: + rewrite of BoundingBox::extractLengths() + +2017-09-21 Martin Gieseking <martin.gieseking@uos.de> + + * src/TpicSpecialHandler.cpp: + use isxdigit() to check hex digits + + * src/InputReader.cpp, src/InputReader.hpp, tests/Makefile.am, + tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, + tests/StringMatcherTest.cpp: + use Knuth-Morris-Pratt algorithm to find a string in a stream + + * libs/woff2/brotli/common/constants.h, + libs/woff2/brotli/common/dictionary.c, + libs/woff2/brotli/common/dictionary.h, + libs/woff2/brotli/common/version.h, + libs/woff2/brotli/enc/backward_references.c, + libs/woff2/brotli/enc/backward_references_hq.c, + libs/woff2/brotli/enc/backward_references_hq.h, + libs/woff2/brotli/enc/backward_references_inc.h, + libs/woff2/brotli/enc/block_splitter.c, + libs/woff2/brotli/enc/block_splitter_inc.h, + libs/woff2/brotli/enc/brotli_bit_stream.c, + libs/woff2/brotli/enc/brotli_bit_stream.h, + libs/woff2/brotli/enc/cluster_inc.h, libs/woff2/brotli/enc/command.h, + libs/woff2/brotli/enc/compress_fragment.c, + libs/woff2/brotli/enc/compress_fragment_two_pass.c, + libs/woff2/brotli/enc/encode.c, + libs/woff2/brotli/enc/find_match_length.h, libs/woff2/brotli/enc/hash.h, + libs/woff2/brotli/enc/hash_forgetful_chain_inc.h, + libs/woff2/brotli/enc/hash_longest_match64_inc.h, + libs/woff2/brotli/enc/hash_longest_match_inc.h, + libs/woff2/brotli/enc/hash_longest_match_quickly_inc.h, + libs/woff2/brotli/enc/hash_to_binary_tree_inc.h, + libs/woff2/brotli/enc/memory.h, libs/woff2/brotli/enc/port.h, + libs/woff2/brotli/enc/write_bits.h, + libs/woff2/brotli/include/brotli/decode.h, + libs/woff2/brotli/include/brotli/encode.h: + updated Brotli to version 1.0.1 + +2017-09-15 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVG.cpp, src/SpecialManager.cpp, src/SpecialManager.hpp, + src/utility.hpp, tests/Makefile.am, tests/SpecialManagerTest.cpp: + use smart pointers to allocate/deallocate SpecialHandlers + + * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.hpp, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.hpp, + src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, + src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.hpp, + src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, + src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, + src/SpecialHandler.hpp, src/SpecialManager.cpp, + src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp, + tests/ColorSpecialTest.cpp, tests/PapersizeSpecialTest.cpp: + changed return value of SpecialHandler::prefixes() to std::vector + + * .appveyor.yml: + AppVeyor: updated FreeType to version 2.8.1 + +2017-09-13 Martin Gieseking <martin.gieseking@uos.de> + + * tests/FileSystemTest.cpp: + close streams before removing corresponding files + +2017-09-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/dvisvgm.cpp: + fixed number of dashes printed by option -V1 + +2017-09-08 Martin Gieseking <martin.gieseking@uos.de> + + * src/DependencyGraph.hpp, src/SVGTree.cpp, tests/DependencyGraphTest.cpp: + DependencyGraph::getKeys(): return result, don't use reference parameter + + * src/FileFinder.cpp, src/Makefile.am: + added missing #include; added windows.hpp to Makefile.am + + * tests/Makefile.am, tests/create-makefile, tests/testmain.cpp: + define variable TEST_ARGV0 to make argv[0] of main() available in + tests +this is required to initialize kpathsea properly, for example + + * src/FileFinder.cpp, src/FileFinder.hpp, tests/CMapManagerTest.cpp, + tests/FileFinderTest.cpp, tests/FontManagerTest.cpp, + tests/MapLineTest.cpp, tests/SubfontTest.cpp: + init libkpathsea correctly in tests to prevent assertion failures + + * libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: + updated xxHash to version 0.6.3 + +2017-09-07 Martin Gieseking <martin.gieseking@uos.de> + + * tests/FontCacheTest.cpp, tests/Makefile.am, tests/create-makefile: + fixed path issue in FontCacheTest + + * src/GFReader.cpp: + fixed incorrect integer type in GFReader; insert CharInfos with emplace + + * src/MapLine.cpp, tests/MapLineTest.cpp: + treat prefix "<<" in a mapline as "<[" (skip second char) + + * doc/dvisvgm.txt.in, src/dvisvgm.cpp: + added pdftex.map to default mapfiles + +2017-09-06 Martin Gieseking <martin.gieseking@uos.de> + + * src/BasicDVIReader.cpp, src/BgColorSpecialHandler.cpp, src/Bitmap.cpp, + src/BoundingBox.cpp, src/CMap.cpp, src/CMapReader.cpp, src/CRC32.cpp, + src/Calculator.cpp, src/ColorSpecialHandler.cpp, src/DLLoader.cpp, + src/DVIReader.cpp, src/Directory.cpp, src/EPSFile.cpp, src/EPSToSVG.cpp, + src/EmSpecialHandler.cpp, src/EncFile.cpp, src/FileFinder.cpp, + src/FilePath.cpp, src/Font.cpp, src/FontCache.cpp, src/FontEncoding.cpp, + src/FontEngine.cpp, src/FontManager.cpp, src/FontMap.cpp, + src/FontMap.hpp, src/FontMetrics.cpp, src/FontWriter.cpp, + src/GFGlyphTracer.cpp, src/GFTracer.cpp, src/HtmlSpecialHandler.cpp, + src/InputBuffer.cpp, src/InputReader.cpp, src/JFM.cpp, src/MapLine.cpp, + src/Message.cpp, src/MetafontWrapper.cpp, src/MiKTeXCom.cpp, + src/NoPsSpecialHandler.cpp, src/PSInterpreter.cpp, src/PSPattern.cpp, + src/PSPreviewFilter.cpp, src/PageRanges.cpp, src/PageSize.cpp, + src/PathClipper.cpp, src/PdfSpecialHandler.cpp, src/SVGTree.cpp, + src/SpecialManager.cpp, src/StreamWriter.cpp, src/TFM.cpp, + src/VFReader.cpp, src/XMLDocument.cpp, src/XMLNode.cpp, + src/XMLString.cpp, src/dvisvgm.cpp: + removed redundant #includes of config.h + + * src/DLLoader.hpp, src/Directory.cpp, src/Directory.hpp, + src/FileSystem.cpp, src/MiKTeXCom.hpp, src/Process.cpp, src/Terminal.cpp, + src/windows.hpp: + disable macros min/max defined in windows.h + + * src/CLCommandLine.cpp, src/CMapManager.cpp, src/CMapManager.hpp, + src/Calculator.cpp, src/Calculator.hpp, src/DVIToSVG.cpp, + src/DVIToSVGActions.hpp, src/DependencyGraph.hpp, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.hpp, src/FileFinder.cpp, + src/Font.cpp, src/Font.hpp, src/FontCache.hpp, src/FontEncoding.cpp, + src/FontManager.cpp, src/FontManager.hpp, src/FontMap.hpp, + src/GFReader.hpp, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, + src/InputReader.cpp, src/InputReader.hpp, src/Message.cpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/SVGTree.cpp, + src/SVGTree.hpp, src/SpecialManager.hpp, src/Subfont.cpp, + src/Subfont.hpp, tests/StreamInputBufferTest.cpp: + replaced std::map with std::unordered_map where possible to increase + performance + +2017-09-05 Martin Gieseking <martin.gieseking@uos.de> + + * tests/DvisvgmSpecialTest.cpp: + replaced constexpr with const to make clang happy + + * doc/dvisvgm.txt.in, src/DvisvgmSpecialHandler.cpp, + tests/DvisvgmSpecialTest.cpp: + allow all common length units in dvisvgm specials + +2017-08-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/AGLTable.hpp, src/CMapReader.cpp, src/Color.cpp, + src/CommandLine.hpp, src/FontWriter.cpp, tests/genhashcheck.py: + use list initialization on constant std::arrays + + * tests/MapLineTest.cpp: + added braces to prevent compiler warnings + +2017-08-25 Martin Gieseking <martin.gieseking@uos.de> + + * src/CMapManager.cpp, src/DvisvgmSpecialHandler.cpp, src/Font.cpp, + src/Ghostscript.cpp, src/PsSpecialHandler.cpp, src/dvisvgm.cpp, + tests/DvisvgmSpecialTest.cpp: + use range-based for to iterate over a fixed sequence of items + +2017-08-17 Martin Gieseking <martin.gieseking@uos.de> + + * m4/ax_code_coverage.m4: + updated ax_code_coverage.m4 to version 25 + +2017-08-06 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml: + AppVeyor: updated potrace to version 1.15 + +2017-08-01 Martin Gieseking <martin.gieseking@uos.de> + + * libs/woff2/src/font.cc, libs/woff2/src/normalize.cc, + libs/woff2/src/port.h, libs/woff2/src/store_bytes.h, + libs/woff2/src/woff2_common.cc, libs/woff2/src/woff2_enc.cc: + updated woff2 to https://github.com/google/woff2/commits/2e09253 + +2017-06-26 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml: + AppVeyor: changed build image to VS 2017; updated FreeType to 2.8 + +2017-06-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + psfile: fixed sign of y coordinates + +2017-06-12 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.hpp: + use bp units for line width and miter limit + +2017-06-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/EPSToSVG.cpp: + remove redundant clipPath elements also when converting EPS files + +2017-05-30 Martin Gieseking <martin.gieseking@uos.de> + + * src/GraphicsPath.hpp: + replaced vector with deque in class GraphicsPath +due to cheaper front + insertions/deletions + + * src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp: + manage memory of ClippingStack with shared pointers +- automatically + deletes unreferenced path objects +- avoids keeping popped (and no longer + required) paths in the pool vector + +2017-05-26 Martin Gieseking <martin.gieseking@uos.de> + + * src/Pair.hpp, tests/PairTest.cpp: + added abs() and negation operator to class Pair + + * src/Matrix.hpp, src/PsSpecialHandler.cpp: + respect transformation of PS state in computation of psfile position + (fixes #70) + + * src/FileFinder.cpp, src/PsSpecialHandler.cpp: + lookup psfile in texmf tree if it's not present in cwd (fixes #69) + +2017-05-16 Martin Gieseking <martin.gieseking@uos.de> + + * tests/FontCacheTest.cpp, tests/Makefile.am, tests/create-makefile: + FontCacheTest: write test output to $builddir/data +$srcdir/data may be + read-only so that the tests fail unintentionally + +2017-05-15 Martin Gieseking <martin.gieseking@uos.de> + + * libs/woff2/brotli/LICENSE, libs/woff2/brotli/Makefile.am, + libs/woff2/brotli/common/constants.h, + libs/woff2/brotli/common/dictionary.c, + libs/woff2/brotli/common/dictionary.h, + libs/woff2/brotli/common/version.h, + libs/woff2/brotli/enc/backward_references.c, + libs/woff2/brotli/enc/backward_references.h, + libs/woff2/brotli/enc/backward_references_hq.c, + libs/woff2/brotli/enc/backward_references_hq.h, + libs/woff2/brotli/enc/backward_references_inc.h, + libs/woff2/brotli/enc/block_splitter_inc.h, + libs/woff2/brotli/enc/command.h, + libs/woff2/brotli/enc/compress_fragment.c, + libs/woff2/brotli/enc/compress_fragment.h, + libs/woff2/brotli/enc/compress_fragment_two_pass.c, + libs/woff2/brotli/enc/compress_fragment_two_pass.h, + libs/woff2/brotli/enc/context.h, libs/woff2/brotli/enc/dictionary_hash.c, + libs/woff2/brotli/enc/dictionary_hash.h, libs/woff2/brotli/enc/encode.c, + libs/woff2/brotli/enc/fast_log.h, libs/woff2/brotli/enc/hash.h, + libs/woff2/brotli/enc/hash_forgetful_chain_inc.h, + libs/woff2/brotli/enc/hash_longest_match64_inc.h, + libs/woff2/brotli/enc/hash_longest_match_inc.h, + libs/woff2/brotli/enc/hash_longest_match_quickly_inc.h, + libs/woff2/brotli/enc/hash_to_binary_tree_inc.h, + libs/woff2/brotli/enc/histogram.c, libs/woff2/brotli/enc/literal_cost.c, + libs/woff2/brotli/enc/memory.h, libs/woff2/brotli/enc/metablock.c, + libs/woff2/brotli/enc/metablock.h, libs/woff2/brotli/enc/quality.h, + libs/woff2/brotli/enc/static_dict.c, libs/woff2/brotli/enc/static_dict.h, + libs/woff2/brotli/include/brotli/decode.h, + libs/woff2/brotli/include/brotli/encode.h, + libs/woff2/brotli/include/brotli/port.h, + libs/woff2/brotli/include/brotli/types.h: + updated brotli to version 0.6.0 + +2017-05-11 Martin Gieseking <martin.gieseking@uos.de> + + * src/Process.cpp: + close pipe if fork() fails + +2017-05-08 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, src/SignalHandler.cpp, src/SignalHandler.hpp: + use sigaction() rather than signal() if possible + + * src/Process.cpp, src/Process.hpp: + refactored Process class +- use separate class to encapsulate + system-dependent stuff and to ensure + proper termination in case of + signals or errors +- prevent blocking if subprocess doesn't write anything + to stdout/stderr + +2017-04-28 Martin Gieseking <martin.gieseking@uos.de> + + * src/Process.cpp: + quit Process::run() if child process terminated unexpectedly (fixes #68) + +2017-04-27 Martin Gieseking <martin.gieseking@uos.de> + + * tests/Makefile.am, tests/create-makefile: + added the FontWriter dependencies to the tests + +2017-04-24 Martin Gieseking <martin.gieseking@uos.de> + + * src/Color.cpp, src/Color.hpp, src/PSPattern.cpp, + tests/ColorSpecialTest.cpp: + avoid implicit conversion of Color object to RGB integer + + * src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp, + tests/Makefile.am, tests/TpicSpecialTest.cpp: + improved the TPIC special handler and added tests for it + + * src/TpicSpecialHandler.cpp, tests/TpicSpecialTest.cpp: + added evaluation of TPIC's 'tx' special command + +2017-04-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/BasicDVIReader.hpp, src/BgColorSpecialHandler.hpp, + src/CLCommandLine.hpp, src/CMapManager.hpp, src/DVIToSVGActions.hpp, + src/DependencyGraph.hpp, src/DvisvgmSpecialHandler.hpp, src/FilePath.hpp, + src/Font.hpp, src/FontCache.cpp, src/FontCache.hpp, src/FontEngine.cpp, + src/FontManager.hpp, src/Ghostscript.hpp, src/Glyph.hpp, + src/GraphicsPath.hpp, src/HtmlSpecialHandler.hpp, src/NumericRanges.hpp, + src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, + src/PathClipper.cpp, src/PathClipper.hpp, src/PsSpecialHandler.hpp, + src/RangeMap.hpp, src/SVGCharPathHandler.hpp, src/ShadingPatch.hpp, + src/SpecialManager.hpp, src/Subfont.hpp, src/VFReader.hpp, + src/XMLNode.cpp, src/XMLNode.hpp, src/dvisvgm.cpp: + replaced typedefs with 'using' statements + +2017-04-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/Ghostscript.cpp: + simplify code for looking up libgs (closes #66) + +2017-04-14 Martin Gieseking <martin.gieseking@uos.de> + + * src/DLLoader.cpp, src/DLLoader.hpp: + added DLLoader::loadLibrary() to assign a different library + + * src/DLLoader.cpp, src/DLLoader.hpp, src/Ghostscript.cpp: + replaced c-string parameters of DLLoader() and loadLibrary() with + std::string + +2017-04-13 Toby Fleming <tobywf@users.noreply.github.com> + + * src/Ghostscript.cpp: + Auto-detect ghostscript dynamic library on macOS + +2017-03-22 Martin Gieseking <martin.gieseking@uos.de> + + * m4/ax_code_coverage.m4, m4/ax_cxx_compile_stdcxx.m4: + updated m4 scripts + +2017-03-03 Martin Gieseking <martin.gieseking@uos.de> + + * src/FileFinder.cpp, tests/FileFinderTest.cpp: + fixed handling of absolute additional directories in FileFinder + + * tests/FilePathTest.cpp, tests/FontCacheTest.cpp, + tests/SVGOutputTest.cpp: + tests: minor path improvements + +2017-03-02 Martin Gieseking <martin.gieseking@uos.de> + + * libs/woff2/src/normalize.cc, libs/woff2/src/woff2_enc.cc: + woff2: removed unused variables + + * src/Makefile.am, src/dvisvgm.cpp: + improved generation of list showing the library versions + + * src/Color.cpp, src/FilePath.cpp, src/FontWriter.cpp, src/PageSize.cpp, + src/dvisvgm.cpp, src/utility.cpp, src/utility.hpp, tests/UtilityTest.cpp: + removed side-effect from util::to_lower(); returns new modified string + instead + +2017-03-01 Martin Gieseking <martin.gieseking@uos.de> + + * libs/ff-woff/fontforge/nowakowskittfinstr.c: + ff-woff: removed redundant variables + + * libs/woff2/Makefile.am, libs/woff2/brotli/Makefile.am, + libs/woff2/brotli/common/constants.h, + libs/woff2/brotli/common/dictionary.c, + libs/woff2/brotli/common/dictionary.h, + libs/woff2/brotli/common/version.h, + libs/woff2/brotli/enc/backward_references.c, + libs/woff2/brotli/enc/backward_references.cc, + libs/woff2/brotli/enc/backward_references.h, + libs/woff2/brotli/enc/backward_references_inc.h, + libs/woff2/brotli/enc/bit_cost.c, libs/woff2/brotli/enc/bit_cost.h, + libs/woff2/brotli/enc/bit_cost_inc.h, + libs/woff2/brotli/enc/block_encoder_inc.h, + libs/woff2/brotli/enc/block_splitter.c, + libs/woff2/brotli/enc/block_splitter.cc, + libs/woff2/brotli/enc/block_splitter.h, + libs/woff2/brotli/enc/block_splitter_inc.h, + libs/woff2/brotli/enc/brotli_bit_stream.c, + libs/woff2/brotli/enc/brotli_bit_stream.cc, + libs/woff2/brotli/enc/brotli_bit_stream.h, + libs/woff2/brotli/enc/cluster.c, libs/woff2/brotli/enc/cluster.h, + libs/woff2/brotli/enc/cluster_inc.h, libs/woff2/brotli/enc/command.h, + libs/woff2/brotli/enc/compress_fragment.c, + libs/woff2/brotli/enc/compress_fragment.cc, + libs/woff2/brotli/enc/compress_fragment.h, + libs/woff2/brotli/enc/compress_fragment_two_pass.c, + libs/woff2/brotli/enc/compress_fragment_two_pass.cc, + libs/woff2/brotli/enc/compress_fragment_two_pass.h, + libs/woff2/brotli/enc/compressor.h, libs/woff2/brotli/enc/context.h, + libs/woff2/brotli/enc/dictionary.cc, libs/woff2/brotli/enc/dictionary.h, + libs/woff2/brotli/enc/dictionary_hash.h, libs/woff2/brotli/enc/encode.c, + libs/woff2/brotli/enc/encode.cc, libs/woff2/brotli/enc/encode.h, + libs/woff2/brotli/enc/encode_parallel.cc, + libs/woff2/brotli/enc/encode_parallel.h, + libs/woff2/brotli/enc/entropy_encode.c, + libs/woff2/brotli/enc/entropy_encode.cc, + libs/woff2/brotli/enc/entropy_encode.h, + libs/woff2/brotli/enc/entropy_encode_static.h, + libs/woff2/brotli/enc/fast_log.h, + libs/woff2/brotli/enc/find_match_length.h, libs/woff2/brotli/enc/hash.h, + libs/woff2/brotli/enc/hash_forgetful_chain_inc.h, + libs/woff2/brotli/enc/hash_longest_match_inc.h, + libs/woff2/brotli/enc/hash_longest_match_quickly_inc.h, + libs/woff2/brotli/enc/histogram.c, libs/woff2/brotli/enc/histogram.cc, + libs/woff2/brotli/enc/histogram.h, libs/woff2/brotli/enc/histogram_inc.h, + libs/woff2/brotli/enc/literal_cost.c, + libs/woff2/brotli/enc/literal_cost.cc, + libs/woff2/brotli/enc/literal_cost.h, libs/woff2/brotli/enc/memory.c, + libs/woff2/brotli/enc/memory.h, libs/woff2/brotli/enc/metablock.c, + libs/woff2/brotli/enc/metablock.cc, libs/woff2/brotli/enc/metablock.h, + libs/woff2/brotli/enc/metablock_inc.h, libs/woff2/brotli/enc/port.h, + libs/woff2/brotli/enc/prefix.h, libs/woff2/brotli/enc/quality.h, + libs/woff2/brotli/enc/ringbuffer.h, libs/woff2/brotli/enc/static_dict.c, + libs/woff2/brotli/enc/static_dict.cc, + libs/woff2/brotli/enc/static_dict.h, + libs/woff2/brotli/enc/static_dict_lut.h, + libs/woff2/brotli/enc/streams.cc, libs/woff2/brotli/enc/streams.h, + libs/woff2/brotli/enc/transform.h, libs/woff2/brotli/enc/types.h, + libs/woff2/brotli/enc/utf8_util.c, libs/woff2/brotli/enc/utf8_util.cc, + libs/woff2/brotli/enc/utf8_util.h, libs/woff2/brotli/enc/write_bits.h, + libs/woff2/brotli/include/brotli/decode.h, + libs/woff2/brotli/include/brotli/encode.h, + libs/woff2/brotli/include/brotli/port.h, + libs/woff2/brotli/include/brotli/types.h, libs/woff2/src/buffer.h, + libs/woff2/src/font.cc, libs/woff2/src/glyph.cc, + libs/woff2/src/variable_length.cc, libs/woff2/src/woff2_dec.h, + libs/woff2/src/woff2_enc.cc, src/Makefile.am: + updated woff2 to https://github.com/google/woff2/commit/68e9ab5 + +2017-02-23 Martin Gieseking <martin.gieseking@uos.de> + + * tests/BezierTest.cpp, tests/BitmapTest.cpp, tests/BoundingBoxTest.cpp, + tests/CMapManagerTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, + tests/CRC32Test.cpp, tests/ColorTest.cpp, tests/CommandLineTest.cpp, + tests/DirectoryTest.cpp, tests/FileSystemTest.cpp, + tests/GraphicsPathTest.cpp, tests/JFMReaderTest.cpp, + tests/MatrixTest.cpp, tests/PageRagesTest.cpp, tests/RangeMapTest.cpp, + tests/SVGOutputTest.cpp, tests/SplittedCharInputBufferTest.cpp, + tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, + tests/StreamWriterTest.cpp, tests/SubfontTest.cpp, + tests/TFMReaderTest.cpp, tests/ToUnicodeMapTest.cpp, + tests/UnicodeTest.cpp, tests/VectorIteratorTest.cpp, + tests/XMLNodeTest.cpp: + fixed signed/unsigned warnings in tests + +2017-02-22 Martin Gieseking <martin.gieseking@uos.de> + + * libs/woff2/brotli/tools/bro.cc, libs/woff2/brotli/tools/rfc-format.py, + libs/woff2/brotli/tools/version.h: + removed redundant files + +2017-02-20 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.1.3 + + * NEWS: + updated NEWS + +2017-02-18 Martin Gieseking <martin.gieseking@uos.de> + + * libs/ff-woff/inc/ffintl.h: + ff-woff: removed redundant defines and prototypes to fix build failure + on Solaris + + * tests/genhashcheck.py: + reformatted genhashcheck + + * tests/BezierTest.cpp, tests/CRC32Test.cpp, tests/ToUnicodeMapTest.cpp, + tests/UnicodeTest.cpp, tests/VectorIteratorTest.cpp, + tests/XMLNodeTest.cpp: + minor additions to some tests + +2017-02-15 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, libs/ff-woff/Makefile.am, + libs/ff-woff/fontforge/fflocale.c, libs/ff-woff/fontforge/fflocale.h, + libs/ff-woff/fontforge/sfd.c, libs/ff-woff/fontforge/splinefont.h, + libs/ff-woff/fontforge/tottf.c: + ff-woff: only call uselocale() if present, use setlocale() otherwise + +2017-02-14 Martin Gieseking <martin.gieseking@uos.de> + + * README, README.md: + added information on required C++11 compiler to README + + * tests/genhashcheck.py: + made genhashcheck.py compatible with Python 3 (plus few minor changes) + +2017-02-13 Martin Gieseking <martin.gieseking@uos.de> + + * src/MapLine.cpp, src/MapLine.hpp, tests/ColorSpecialTest.cpp, + tests/FontMapTest.cpp, tests/LengthTest.cpp, tests/MapLineTest.cpp: + improved a couple of test cases + + * src/Color.cpp, src/Matrix.cpp, src/TpicSpecialHandler.cpp, + src/utility.hpp: + replaced non-standard constant M_PI with own definition + + * src/Color.cpp, src/Matrix.cpp, src/utility.hpp: + replaced local copies of deg2rad with global function + +2017-02-12 Martin Gieseking <martin.gieseking@uos.de> + + * .appveyor.yml, .travis.yml, appveyor.yml: + exclude branch 'tmp' from CI builds + +2017-02-11 Martin Gieseking <martin.gieseking@uos.de> + + * libs/ff-woff/Makefile.am, libs/ff-woff/fontforge/fontforge.h, + libs/ff-woff/inc/ffintl.h, libs/ff-woff/inc/intl.h: + don't try to #include libintl.h + + * .travis.yml: + Travis: enable clang builds again + + * NEWS: + updated NEWS + +2017-02-10 Martin Gieseking <martin.gieseking@uos.de> + + * src/Calculator.cpp: + fixed number parsing in Calculator class (failed on Mac) + + * tests/StreamReaderTest.cpp: + clear istream flags to prevent failure of StreamReaderTest + + * libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: + removed 'restrict' keyword from xxHash + + * .travis.yml, appveyor.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.1.2 + +2017-02-09 Martin Gieseking <martin.gieseking@uos.de> + + * .gitignore, .travis.yml, Makefile.am, configure.ac, tests/Makefile.am, + tests/create-makefile, tests/gtest/LICENSE, + tests/gtest/include/gtest/gtest-death-test.h, + tests/gtest/include/gtest/gtest-message.h, + tests/gtest/include/gtest/gtest-param-test.h, + tests/gtest/include/gtest/gtest-printers.h, + tests/gtest/include/gtest/gtest-spi.h, + tests/gtest/include/gtest/gtest-test-part.h, + tests/gtest/include/gtest/gtest-typed-test.h, + tests/gtest/include/gtest/gtest.h, + tests/gtest/include/gtest/gtest_pred_impl.h, + tests/gtest/include/gtest/gtest_prod.h, + tests/gtest/include/gtest/internal/custom/gtest-port.h, + tests/gtest/include/gtest/internal/custom/gtest-printers.h, + tests/gtest/include/gtest/internal/custom/gtest.h, + tests/gtest/include/gtest/internal/gtest-death-test-internal.h, + tests/gtest/include/gtest/internal/gtest-filepath.h, + tests/gtest/include/gtest/internal/gtest-internal.h, + tests/gtest/include/gtest/internal/gtest-linked_ptr.h, + tests/gtest/include/gtest/internal/gtest-param-util-generated.h, + tests/gtest/include/gtest/internal/gtest-param-util.h, + tests/gtest/include/gtest/internal/gtest-port-arch.h, + tests/gtest/include/gtest/internal/gtest-port.h, + tests/gtest/include/gtest/internal/gtest-string.h, + tests/gtest/include/gtest/internal/gtest-tuple.h, + tests/gtest/include/gtest/internal/gtest-type-util.h, + tests/gtest/src/gtest-all.cc, tests/gtest/src/gtest-death-test.cc, + tests/gtest/src/gtest-filepath.cc, tests/gtest/src/gtest-internal-inl.h, + tests/gtest/src/gtest-port.cc, tests/gtest/src/gtest-printers.cc, + tests/gtest/src/gtest-test-part.cc, tests/gtest/src/gtest-typed-test.cc, + tests/gtest/src/gtest.cc, tests/gtest/src/gtest_main.cc: + bundle gtest with the sources to simplify building and running the tests + + * src/Directory.cpp, tests/DirectoryTest.cpp: + prevent calling closedir() with null pointer argument + + * src/VectorStream.hpp: + don't access first vector component if the vector is empty + + * src/GFReader.cpp, src/StreamReader.cpp, tests/GFReaderTest.cpp, + tests/StreamReaderTest.cpp: + improved implementation of getString() + + * src/CLCommandLine.cpp: + reset status flags before changing the sstream source + +2017-02-08 Martin Gieseking <martin.gieseking@uos.de> + + * tests/CommandLineTest.cpp: + removed redundant function + + * src/XMLString.cpp, tests/EmSpecialTest.cpp, tests/GFGlyphTracerTest.cpp: + avoid negative zeros (-0) in SVG output + + * src/BoundingBox.cpp: + fixed memory issue in BoundingBox class + + * src/CMapReader.cpp, src/InputReader.cpp, src/InputReader.hpp, + tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp: + fixed potential number overflow issue + + * tests/CMapReaderTest.cpp: + fixed memory leak in CMapReaderTest + + * src/Subfont.cpp: + fixed memory leak in Subfont class + + * src/XMLNode.cpp: + fixed memory leak in class XMLElementNode + +2017-02-07 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac: + replaced deprecated AC_CONFIG_HEADER + + * NEWS: + updated NEWS + + * libs/clipper/License.txt: + fixed line endings of clipper/License.txt + +2017-02-06 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml, appveyor.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.1.1 + +2017-02-04 Martin Gieseking <martin.gieseking@uos.de> + + * tests/FontCacheTest.cpp: + fixed FontCacheTest ('make distcheck' failed) + +2017-02-03 Martin Gieseking <martin.gieseking@uos.de> + + * src/Color.cpp, src/Color.hpp, src/VectorIterator.hpp, + tests/ColorTest.cpp, tests/VectorIteratorTest.cpp: + increased coverage of ColorTest + + * configure.ac, libs/ff-woff/fontforge/splinefont.h: + include xlocale.h in ff-woff if available (fixes #65) + +2017-02-02 Martin Gieseking <martin.gieseking@uos.de> + + * src/Makefile.am: + removed spurious colon from src/Makefile.am + + * configure.ac: + allow C++11 language extensions if necessary + + * src/Font.cpp, src/Font.hpp: + report Metafont failures only once for each font + +2017-01-31 Martin Gieseking <martin.gieseking@uos.de> + + * README, README.md: + README: updated links, added release badge + +2017-01-30 Martin Gieseking <martin.gieseking@uos.de> + + * tests/FontManagerTest.cpp, tests/data/cmr10.pfb: + prevent FontManagerTest to fail due to missing font files + +2017-01-26 Martin Gieseking <martin.gieseking@uos.de> + + * src/Matrix.cpp, tests/MatrixTest.cpp: + minor changes of matrix class; improved MatrixTest + +2017-01-25 Martin Gieseking <martin.gieseking@uos.de> + + * src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, + tests/Makefile.am, tests/PapersizeSpecialTest.cpp, tests/create-makefile: + added PapersizeSpecialTest + + * tests/CMapManagerTest.cpp, tests/CMapReaderTest.cpp, + tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, + tests/FileFinderTest.cpp, tests/FontManagerTest.cpp, + tests/JFMReaderTest.cpp, tests/MapLineTest.cpp, tests/SubfontTest.cpp, + tests/TFMReaderTest.cpp, tests/TensorProductPatchTest.cpp: + added 'override' specifier to gtest methods + + * src/FontCache.cpp, src/FontCache.hpp, tests/FontCacheTest.cpp, + tests/Makefile.am: + added FontCacheTest + + * tests/Makefile.am, tests/create-makefile: + removed redundant linker flag from tests + + * m4/ax_code_coverage.m4, m4/ax_cxx_compile_stdcxx.m4: + updated m4 scripts to latest versions + +2017-01-23 Martin Gieseking <martin.gieseking@uos.de> + + * README.md, appveyor.yml: + added basic appveyor.yml + +2017-01-20 Martin Gieseking <martin.gieseking@uos.de> + + * libs/ff-woff/Makefile.am, libs/ff-woff/fontforge/fontforge.h, + libs/ff-woff/fontforge/tmpfile2.cpp, libs/ff-woff/fontforge/utils.c, + src/dvisvgm.cpp: + improved error handling of tmpfile2() in ff-woff +The FontForge library + doesn't check the return value of tmpfile() which may lead +to segfaults. + The replacement function tmpfile2() throws an exception or calls +exit() + so that dvisvgm can terminate more cleanly. + +2017-01-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/BoundingBox.cpp, src/Color.cpp, src/DVIToSVGActions.cpp, + src/FilePath.cpp, src/FileSystem.cpp, src/FontWriter.cpp, + src/Makefile.am, src/PageSize.cpp, src/SVGOutput.cpp, src/utility.cpp, + src/utility.hpp, tests/Makefile.am, tests/UtilityTest.cpp: + moved common utility functions to separate compilation unit and + namespace + + * src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/EPSToSVG.cpp: + get program name and version from version.hpp, avoid using macros from + config.h + + * .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.1 + + * NEWS: + updated NEWS + +2017-01-17 Martin Gieseking <martin.gieseking@uos.de> + + * libs/ff-woff/fontforge/utils.c, src/FileSystem.cpp, src/FileSystem.hpp, + src/Font.cpp, src/FontWriter.cpp, src/GlyphTracerMessages.hpp, + src/MetafontWrapper.cpp, src/MetafontWrapper.hpp, src/Process.cpp, + src/Process.hpp, src/SVGOutput.cpp, src/SVGOutput.hpp: + create temp files in the system's temp folder rather than in cwd (closes + #63) + + * doc/dvisvgm.txt.in, src/CommandLine.hpp, src/dvisvgm.cpp, + src/options.xml: + added option --tmpdir to select a different temp folder + + * src/FontWriter.cpp, src/FontWriter.hpp: + print error message if FontWriter can't write temporary files + +2017-01-12 Martin Gieseking <martin.gieseking@uos.de> + + * src/FilePath.cpp, src/FilePath.hpp, tests/FilePathTest.cpp, + tests/SVGOutputTest.cpp: + retain letter case of filenames (Windows) + + * src/DVIToSVG.cpp, src/EPSToSVG.cpp, src/SVGTree.hpp: + print warning message if output file could not be written + + * tests/GhostscriptTest.cpp: + disable GS banner in GhostscriptTest + +2017-01-10 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp, src/dvisvgm.cpp: + added missing newlines in messages; fixed typo + +2017-01-05 Martin Gieseking <martin.gieseking@uos.de> + + * src/AGLTable.hpp: + updated AGL table and removed colliding codepoints (closes #64) + +2017-01-03 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile.am, README, README.md, configure.ac, doc/Makefile.am, + doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, + doc/dvisvgm.txt.in, doc/tweak-db-article.xsl, doc/tweak-dblatex-pdf.xsl, + libs/Makefile.am, src/AGLTable.hpp, src/BasicDVIReader.cpp, + src/BasicDVIReader.hpp, src/Bezier.cpp, src/Bezier.hpp, + src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.hpp, + src/Bitmap.cpp, src/Bitmap.hpp, src/BoundingBox.cpp, src/BoundingBox.hpp, + src/CLCommandLine.cpp, src/CLCommandLine.hpp, src/CLOption.hpp, + src/CMap.cpp, src/CMap.hpp, src/CMapManager.cpp, src/CMapManager.hpp, + src/CMapReader.cpp, src/CMapReader.hpp, src/CRC32.cpp, src/CRC32.hpp, + src/Calculator.cpp, src/Calculator.hpp, src/CharMapID.cpp, + src/CharMapID.hpp, src/Character.hpp, src/Color.cpp, src/Color.hpp, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, + src/CommandLine.hpp, src/DLLoader.cpp, src/DLLoader.hpp, + src/DVIActions.hpp, src/DVIReader.cpp, src/DVIReader.hpp, + src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.hpp, src/DependencyGraph.hpp, src/Directory.cpp, + src/Directory.hpp, src/DvisvgmSpecialHandler.cpp, + src/DvisvgmSpecialHandler.hpp, src/EPSFile.cpp, src/EPSFile.hpp, + src/EPSToSVG.cpp, src/EPSToSVG.hpp, src/EmSpecialHandler.cpp, + src/EmSpecialHandler.hpp, src/EncFile.cpp, src/EncFile.hpp, + src/FileFinder.cpp, src/FileFinder.hpp, src/FilePath.cpp, + src/FilePath.hpp, src/FileSystem.cpp, src/FileSystem.hpp, + src/FixWord.hpp, src/Font.cpp, src/Font.hpp, src/FontCache.cpp, + src/FontCache.hpp, src/FontEncoding.cpp, src/FontEncoding.hpp, + src/FontEngine.cpp, src/FontEngine.hpp, src/FontManager.cpp, + src/FontManager.hpp, src/FontMap.cpp, src/FontMap.hpp, + src/FontMetrics.cpp, src/FontMetrics.hpp, src/FontStyle.hpp, + src/FontWriter.cpp, src/FontWriter.hpp, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.hpp, src/GFReader.cpp, src/GFReader.hpp, + src/GFTracer.cpp, src/GFTracer.hpp, src/Ghostscript.cpp, + src/Ghostscript.hpp, src/Glyph.hpp, src/GlyphTracerMessages.hpp, + src/GraphicsPath.hpp, src/HtmlSpecialHandler.cpp, + src/HtmlSpecialHandler.hpp, src/InputBuffer.cpp, src/InputBuffer.hpp, + src/InputReader.cpp, src/InputReader.hpp, src/JFM.cpp, src/JFM.hpp, + src/Length.cpp, src/Length.hpp, src/Makefile.am, src/MapLine.cpp, + src/MapLine.hpp, src/Matrix.cpp, src/Matrix.hpp, src/Message.cpp, + src/Message.hpp, src/MessageException.hpp, src/MetafontWrapper.cpp, + src/MetafontWrapper.hpp, src/MiKTeXCom.cpp, src/MiKTeXCom.hpp, + src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.hpp, + src/NumericRanges.hpp, src/PSFilter.hpp, src/PSInterpreter.cpp, + src/PSInterpreter.hpp, src/PSPattern.cpp, src/PSPattern.hpp, + src/PSPreviewFilter.cpp, src/PSPreviewFilter.hpp, src/PageRanges.cpp, + src/PageRanges.hpp, src/PageSize.cpp, src/PageSize.hpp, src/Pair.hpp, + src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, + src/PathClipper.cpp, src/PathClipper.hpp, src/PdfSpecialHandler.cpp, + src/PdfSpecialHandler.hpp, src/PreScanDVIReader.cpp, + src/PreScanDVIReader.hpp, src/Process.cpp, src/Process.hpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/RangeMap.cpp, + src/RangeMap.hpp, src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, + src/SVGCharHandlerFactory.cpp, src/SVGCharHandlerFactory.hpp, + src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.hpp, + src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.hpp, + src/SVGOutput.cpp, src/SVGOutput.hpp, src/SVGSingleCharTextHandler.cpp, + src/SVGSingleCharTextHandler.hpp, src/SVGTree.cpp, src/SVGTree.hpp, + src/ShadingPatch.cpp, src/ShadingPatch.hpp, src/SignalHandler.cpp, + src/SignalHandler.hpp, src/SpecialActions.hpp, src/SpecialHandler.hpp, + src/SpecialManager.cpp, src/SpecialManager.hpp, src/StreamReader.cpp, + src/StreamReader.hpp, src/StreamWriter.cpp, src/StreamWriter.hpp, + src/Subfont.cpp, src/Subfont.hpp, src/System.cpp, src/System.hpp, + src/TFM.cpp, src/TFM.hpp, src/TensorProductPatch.cpp, + src/TensorProductPatch.hpp, src/Terminal.cpp, src/Terminal.hpp, + src/ToUnicodeMap.cpp, src/ToUnicodeMap.hpp, src/TpicSpecialHandler.cpp, + src/TpicSpecialHandler.hpp, src/TriangularPatch.cpp, + src/TriangularPatch.hpp, src/Unicode.cpp, src/Unicode.hpp, + src/VFActions.hpp, src/VFReader.cpp, src/VFReader.hpp, + src/VectorIterator.hpp, src/VectorStream.hpp, src/XMLDocument.cpp, + src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.hpp, src/XMLString.cpp, + src/XMLString.hpp, src/ZLibOutputStream.hpp, src/dvisvgm.cpp, + src/ffwrapper.c, src/ffwrapper.h, src/macros.hpp, src/options.dtd, + src/options.xml, src/psdefs.cpp, src/version.hpp, src/version.hpp.in, + tests/BezierTest.cpp, tests/BitmapTest.cpp, tests/BoundingBoxTest.cpp, + tests/CMapManagerTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, + tests/CRC32Test.cpp, tests/CalculatorTest.cpp, + tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, + tests/CommandLineTest.cpp, tests/DependencyGraphTest.cpp, + tests/DirectoryTest.cpp, tests/DvisvgmSpecialTest.cpp, + tests/EmSpecialTest.cpp, tests/FileFinderTest.cpp, + tests/FilePathTest.cpp, tests/FileSystemTest.cpp, + tests/FontManagerTest.cpp, tests/FontMapTest.cpp, + tests/GFGlyphTracerTest.cpp, tests/GFReaderTest.cpp, + tests/GraphicsPathTest.cpp, tests/JFMReaderTest.cpp, + tests/LengthTest.cpp, tests/Makefile.am, tests/MapLineTest.cpp, + tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, + tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, + tests/PageSizeTest.cpp, tests/PairTest.cpp, tests/RangeMapTest.cpp, + tests/SVGOutputTest.cpp, tests/ShadingPatchTest.cpp, + tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, + tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, + tests/SubfontTest.cpp, tests/TFMReaderTest.cpp, + tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, + tests/TriangularPatchTest.cpp, tests/UnicodeTest.cpp, + tests/VectorIteratorTest.cpp, tests/VectorStreamTest.cpp, + tests/XMLNodeTest.cpp, tests/XMLStringTest.cpp, tests/check-conv, + tests/create-makefile, tests/data/Makefile.am, tests/genhashcheck.py, + tests/normalize.xsl: + updated year in copyright statements to 2017 + +2016-12-20 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, + doc/dvisvgm.txt.in, doc/dvisvgm.xpr, doc/tweak-db-article.xsl: + manpage: minor refactorings of the XSLT scripts; added generation of + epub + +2016-12-16 Martin Gieseking <martin.gieseking@uos.de> + + * doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, + doc/tweak-dblatex-pdf.xsl: + added missing email address to copyright headers + + * doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, + doc/tweak-dblatex-pdf.xsl: + indent with tabs rather than spaces + + * doc/db2html.xsl: + manpage: replace icon of Author section + + * doc/conf-dblatex-pdf.xsl, doc/tweak-dblatex-pdf.xsl: + manpage: use mixed case titles in pdf output + +2016-12-15 Martin Gieseking <martin.gieseking@uos.de> + + * doc/db2html.xsl, doc/dvisvgm.xpr: + manpage: preserve whitespace in list of supported specials + +2016-11-16 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac: + ensure compiling C files with --std=c99 + +2016-11-14 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS: + updated NEWS + +2016-11-12 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in: + minor changes in manpage + + * README, README.md, configure.ac, libs/Makefile.am, libs/ff-woff/LICENSE, + libs/ff-woff/Makefile.am, libs/ff-woff/README.md, + libs/ff-woff/fontforge/PfEd.h, libs/ff-woff/fontforge/alphabet.c, + libs/ff-woff/fontforge/asmfpst.c, libs/ff-woff/fontforge/autohint.c, + libs/ff-woff/fontforge/char.c, libs/ff-woff/fontforge/cjk.c, + libs/ff-woff/fontforge/configure-fontforge.h, + libs/ff-woff/fontforge/cvundoes.c, libs/ff-woff/fontforge/dumppfa.c, + libs/ff-woff/fontforge/edgelist.h, libs/ff-woff/fontforge/edgelist2.h, + libs/ff-woff/fontforge/encoding.c, libs/ff-woff/fontforge/encoding.h, + libs/ff-woff/fontforge/fontforge-config.h, + libs/ff-woff/fontforge/fontforge.h, libs/ff-woff/fontforge/fontforgevw.h, + libs/ff-woff/fontforge/fvfonts.c, libs/ff-woff/fontforge/gwwiconv.c, + libs/ff-woff/fontforge/libffstamp.h, libs/ff-woff/fontforge/lookups.c, + libs/ff-woff/fontforge/macbinary.c, libs/ff-woff/fontforge/macenc.c, + libs/ff-woff/fontforge/mathconstants.c, libs/ff-woff/fontforge/memory.c, + libs/ff-woff/fontforge/mm.c, libs/ff-woff/fontforge/namehash.h, + libs/ff-woff/fontforge/namelist.c, libs/ff-woff/fontforge/nouiutil.c, + libs/ff-woff/fontforge/nowakowskittfinstr.c, + libs/ff-woff/fontforge/parsepfa.c, libs/ff-woff/fontforge/parsettf.c, + libs/ff-woff/fontforge/parsettfatt.c, libs/ff-woff/fontforge/psfont.h, + libs/ff-woff/fontforge/psread.c, libs/ff-woff/fontforge/pua.c, + libs/ff-woff/fontforge/sd.h, libs/ff-woff/fontforge/sfd.c, + libs/ff-woff/fontforge/sfd1.c, libs/ff-woff/fontforge/sfd1.h, + libs/ff-woff/fontforge/splinechar.c, libs/ff-woff/fontforge/splinefont.c, + libs/ff-woff/fontforge/splinefont.h, + libs/ff-woff/fontforge/splineorder2.c, + libs/ff-woff/fontforge/splineoverlap.c, + libs/ff-woff/fontforge/splinerefigure.c, + libs/ff-woff/fontforge/splinesave.c, + libs/ff-woff/fontforge/splinesaveafm.c, + libs/ff-woff/fontforge/splineutil.c, + libs/ff-woff/fontforge/splineutil2.c, libs/ff-woff/fontforge/start.c, + libs/ff-woff/fontforge/stemdb.c, libs/ff-woff/fontforge/stemdb.h, + libs/ff-woff/fontforge/tables.h, libs/ff-woff/fontforge/tottf.c, + libs/ff-woff/fontforge/tottfaat.c, libs/ff-woff/fontforge/tottfgpos.c, + libs/ff-woff/fontforge/tottfvar.c, libs/ff-woff/fontforge/ttf.h, + libs/ff-woff/fontforge/ttfinstrs.c, libs/ff-woff/fontforge/ttfinstrs.h, + libs/ff-woff/fontforge/ttfspecial.c, + libs/ff-woff/fontforge/uiinterface.h, libs/ff-woff/fontforge/unialt.c, + libs/ff-woff/fontforge/ustring.c, libs/ff-woff/fontforge/utils.c, + libs/ff-woff/fontforge/utype.c, libs/ff-woff/fontforge/woff.c, + libs/ff-woff/inc/basics.h, libs/ff-woff/inc/chardata.h, + libs/ff-woff/inc/charset.h, libs/ff-woff/inc/dlist.h, + libs/ff-woff/inc/gimage.h, libs/ff-woff/inc/gnetwork.h, + libs/ff-woff/inc/gwwiconv.h, libs/ff-woff/inc/intl.h, + libs/ff-woff/inc/ustring.h, libs/ff-woff/inc/utype.h, src/Makefile.am: + bundle reduced fontforge library (ff-woff) + + * configure.ac, libs/Makefile.am, libs/clipper/Makefile.am, + libs/ff-woff/Makefile.am, libs/woff2/Makefile.am, + libs/woff2/brotli/Makefile.am, libs/woff2/brotli/enc/Makefile.am, + libs/woff2/src/Makefile.am, src/Makefile.am: + added license files of bundled libraries; relocated Makefiles + + * .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.0.4 + +2016-11-07 Martin Gieseking <martin.gieseking@uos.de> + + * src/CommandLine.hpp, src/options.xml: + fixed a typo in the --help output + + * src/BasicDVIReader.cpp, src/BasicDVIReader.hpp, src/DVIReader.cpp, + src/DVIReader.hpp: + use const variables for DVI opcodes rather than the values directly + +2016-11-01 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontWriter.cpp: + few cosmetic changes; added comments + +2016-09-27 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.0.3 + + * NEWS, README, README.md: + updated NEWS and README + +2016-09-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp, src/DVIReader.hpp, src/DVIToSVG.cpp, + src/DVIToSVG.hpp: + dropped tracking of previous DVI state from DVIReader + + * src/DVIReader.cpp: + fixed positioning of rules + +2016-09-22 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp, src/DVIReader.hpp, src/DVIToSVG.cpp: + fixed regression in character positioning of of virtual fonts + +2016-09-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp: + fixed type regression in computation of DVI positions (closes #61) + + * .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.0.2 + + * NEWS, README.md: + updated NEWS and README + +2016-09-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/Font.cpp: + fixed sign of character depth computed for native fonts + +2016-09-03 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.0.1 + + * NEWS, README, README.md: + updated NEWS and README + +2016-08-31 Martin Gieseking <martin.gieseking@uos.de> + + * README, README.md: + added link to reduced FF library to README + + * doc/dvisvgm.txt.in, src/FontWriter.cpp, src/FontWriter.hpp, + src/SVGTree.cpp, src/SVGTree.hpp, src/ffwrapper.c: + added option to autohint fonts created by the FontForge library + +2016-08-30 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVGActions.hpp, src/FontManager.hpp, src/MetafontWrapper.hpp: + adapted struct/class forward declarations + +2016-08-28 Martin Gieseking <martin.gieseking@uos.de> + + * src/FileFinder.cpp, src/FileFinder.hpp: + removed unused variable + + * src/CLCommandLine.cpp: + added missing cast to avoid compiler warning + + * .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: + set version to 2.0 + + * README, README.md: + updated README files + + * NEWS: + updated NEWS + +2016-08-27 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml: + use Ubuntu Trusty for Travis builds + + * .travis.yml: + Travis: prevent rebuilding files in folder 'src' when calling 'make + check' + + * src/FontWriter.cpp, src/FontWriter.hpp, src/ffwrapper.c, + src/ffwrapper.h: + added missing copyright headers + +2016-08-25 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile.am, clipper/License.txt, clipper/Makefile.am, + clipper/clipper.cpp, clipper/clipper.hpp, configure.ac, libs/Makefile.am, + libs/clipper/License.txt, libs/clipper/Makefile.am, + libs/clipper/clipper.cpp, libs/clipper/clipper.hpp, libs/xxHash/LICENSE, + libs/xxHash/Makefile.am, libs/xxHash/xxhash.c, libs/xxHash/xxhash.h, + src/Makefile.am, tests/Makefile.am, tests/create-makefile, + xxHash/LICENSE, xxHash/Makefile.am, xxHash/xxhash.c, xxHash/xxhash.h: + moved bundled libraries (clipper, xxHash) to subfolder 'libs' + + * configure.ac, doc/dvisvgm.txt.in, libs/Makefile.am, libs/woff2/LICENSE, + libs/woff2/brotli/LICENSE, libs/woff2/brotli/enc/Makefile.am, + libs/woff2/brotli/enc/backward_references.cc, + libs/woff2/brotli/enc/backward_references.h, + libs/woff2/brotli/enc/bit_cost.h, + libs/woff2/brotli/enc/block_splitter.cc, + libs/woff2/brotli/enc/block_splitter.h, + libs/woff2/brotli/enc/brotli_bit_stream.cc, + libs/woff2/brotli/enc/brotli_bit_stream.h, + libs/woff2/brotli/enc/cluster.h, libs/woff2/brotli/enc/command.h, + libs/woff2/brotli/enc/compress_fragment.cc, + libs/woff2/brotli/enc/compress_fragment.h, + libs/woff2/brotli/enc/compress_fragment_two_pass.cc, + libs/woff2/brotli/enc/compress_fragment_two_pass.h, + libs/woff2/brotli/enc/compressor.h, libs/woff2/brotli/enc/context.h, + libs/woff2/brotli/enc/dictionary.cc, libs/woff2/brotli/enc/dictionary.h, + libs/woff2/brotli/enc/dictionary_hash.h, libs/woff2/brotli/enc/encode.cc, + libs/woff2/brotli/enc/encode.h, libs/woff2/brotli/enc/encode_parallel.cc, + libs/woff2/brotli/enc/encode_parallel.h, + libs/woff2/brotli/enc/entropy_encode.cc, + libs/woff2/brotli/enc/entropy_encode.h, + libs/woff2/brotli/enc/entropy_encode_static.h, + libs/woff2/brotli/enc/fast_log.h, + libs/woff2/brotli/enc/find_match_length.h, libs/woff2/brotli/enc/hash.h, + libs/woff2/brotli/enc/histogram.cc, libs/woff2/brotli/enc/histogram.h, + libs/woff2/brotli/enc/literal_cost.cc, + libs/woff2/brotli/enc/literal_cost.h, libs/woff2/brotli/enc/metablock.cc, + libs/woff2/brotli/enc/metablock.h, libs/woff2/brotli/enc/port.h, + libs/woff2/brotli/enc/prefix.h, libs/woff2/brotli/enc/ringbuffer.h, + libs/woff2/brotli/enc/static_dict.cc, + libs/woff2/brotli/enc/static_dict.h, + libs/woff2/brotli/enc/static_dict_lut.h, + libs/woff2/brotli/enc/streams.cc, libs/woff2/brotli/enc/streams.h, + libs/woff2/brotli/enc/transform.h, libs/woff2/brotli/enc/types.h, + libs/woff2/brotli/enc/utf8_util.cc, libs/woff2/brotli/enc/utf8_util.h, + libs/woff2/brotli/enc/write_bits.h, libs/woff2/brotli/tools/bro.cc, + libs/woff2/brotli/tools/rfc-format.py, libs/woff2/brotli/tools/version.h, + libs/woff2/src/Makefile.am, libs/woff2/src/buffer.h, + libs/woff2/src/file.h, libs/woff2/src/font.cc, libs/woff2/src/font.h, + libs/woff2/src/glyph.cc, libs/woff2/src/glyph.h, + libs/woff2/src/normalize.cc, libs/woff2/src/normalize.h, + libs/woff2/src/port.h, libs/woff2/src/round.h, + libs/woff2/src/store_bytes.h, libs/woff2/src/table_tags.cc, + libs/woff2/src/table_tags.h, libs/woff2/src/transform.cc, + libs/woff2/src/transform.h, libs/woff2/src/variable_length.cc, + libs/woff2/src/variable_length.h, libs/woff2/src/woff2_common.cc, + libs/woff2/src/woff2_common.h, libs/woff2/src/woff2_dec.h, + libs/woff2/src/woff2_enc.cc, libs/woff2/src/woff2_enc.h, + libs/woff2/src/woff2_out.cc, libs/woff2/src/woff2_out.h, + src/FontWriter.cpp, src/FontWriter.hpp, src/Makefile.am: + added support for embedding WOFF2 fonts + +2016-08-24 Martin Gieseking <martin.gieseking@uos.de> + + * src/XMLNode.hpp: + added move constructors to XMLNode classes + +2016-08-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontEngine.cpp: + fixed sign of the font descender + + * configure.ac, doc/dvisvgm.txt.in, src/CommandLine.hpp, + src/FontWriter.cpp, src/FontWriter.hpp, src/GraphicsPath.hpp, + src/Makefile.am, src/SVGTree.cpp, src/SVGTree.hpp, src/XMLNode.cpp, + src/XMLNode.hpp, src/dvisvgm.cpp, src/ffwrapper.c, src/ffwrapper.h, + src/options.xml: + added option --font-format to select the file format used to embed fonts + +2016-08-22 Martin Gieseking <martin.gieseking@uos.de> + + * xxHash/xxhash.c, xxHash/xxhash.h: + updated xxHash to version 0.6.2 + +2016-08-17 Martin Gieseking <martin.gieseking@uos.de> + + * src/FixWord.hpp, src/Font.cpp, src/FontMetrics.hpp, src/SVGTree.cpp, + src/TFM.cpp, src/TFM.hpp: + added getters for ascent and descent to TFM-based fonts + +2016-08-14 Martin Gieseking <martin.gieseking@uos.de> + + * src/Ghostscript.hpp: + removed copy constructor of class Ghostscript + + * src/PathClipper.cpp: + added missing initializers + +2016-08-13 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, src/CLCommandLine.cpp, src/CLCommandLine.hpp, + src/CommandLine.hpp, src/Makefile.am, src/dvisvgm.cpp, src/options.dtd, + src/options.xml, src/version.hpp, src/version.hpp.in: + added version.hpp to provide the current version number + +2016-08-08 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp, src/DVIReader.hpp, src/Directory.cpp, + src/Directory.hpp, src/FilePath.cpp, src/FilePath.hpp, src/Font.cpp, + src/Font.hpp, src/FontManager.cpp, src/FontManager.hpp, src/GFReader.hpp, + src/PageRanges.cpp, src/PageRanges.hpp, src/PageSize.cpp, + src/PageSize.hpp, src/SVGOutput.cpp, src/SVGOutput.hpp, + src/VFActions.hpp, src/VFReader.cpp: + pass string parameters by reference if possible + + * src/System.cpp, src/dvisvgm.cpp: + minor refactorings of dvisvgm.cpp + + * src/Ghostscript.cpp, src/MiKTeXCom.cpp: + replaced __WIN64__ with pre-defined _WIN64 + +2016-08-02 Martin Gieseking <martin.gieseking@uos.de> + + * src/CLCommandLine.cpp, src/CLCommandLine.hpp, src/CLOption.hpp, + src/CmdLineParserBase.cpp, src/CmdLineParserBase.hpp, + src/CommandLine.cpp, src/CommandLine.hpp, src/Makefile.am, + src/dvisvgm.cpp, src/options.dtd, src/options.xml, + tests/CommandLineTest.cpp: + reimplemented the CommandLine parser class + + * src/CMap.cpp, src/CMapManager.cpp, src/CMapReader.cpp, src/EncFile.cpp, + src/FileFinder.cpp, src/FileFinder.hpp, src/Font.cpp, + src/FontEncoding.cpp, src/FontManager.cpp, src/FontMap.cpp, + src/FontMetrics.cpp, src/Ghostscript.cpp, src/MetafontWrapper.cpp, + src/PsSpecialHandler.cpp, src/Subfont.cpp, src/dvisvgm.cpp, + tests/CMapManagerTest.cpp, tests/FileFinderTest.cpp, + tests/MapLineTest.cpp, tests/SubfontTest.cpp: + made FileFinder a singleton again + +2016-07-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/BgColorSpecialHandler.cpp, src/BoundingBox.cpp, + src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, + src/FileSystem.cpp, src/FontCache.cpp, src/FontEngine.cpp, + src/FontManager.cpp, src/GraphicsPath.hpp, src/PSInterpreter.cpp, + src/PapersizeSpecialHandler.cpp, src/PathClipper.cpp, src/RangeMap.cpp, + src/Subfont.cpp, src/TpicSpecialHandler.cpp, src/XMLDocument.cpp, + src/XMLNode.cpp: + replaced insert/push_back with emplace/emplace_back where useful + +2016-07-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/PathClipper.cpp: + some minor refactorings of class PathClipper + + * src/CMapReader.cpp: + minor refactoring of class CMapReader + +2016-07-22 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontMap.cpp, src/FontMap.hpp: + some syntactic refactorings of class FontMap + + * src/FontManager.cpp, src/FontManager.hpp: + use unique_ptr to automatically release Font objects in class + FontManager + +2016-07-21 Martin Gieseking <martin.gieseking@uos.de> + + * src/AGLTable.h, src/AGLTable.hpp, src/BasicDVIReader.cpp, + src/BasicDVIReader.h, src/BasicDVIReader.hpp, src/Bezier.cpp, + src/Bezier.h, src/Bezier.hpp, src/BgColorSpecialHandler.cpp, + src/BgColorSpecialHandler.h, src/BgColorSpecialHandler.hpp, + src/Bitmap.cpp, src/Bitmap.h, src/Bitmap.hpp, src/BoundingBox.cpp, + src/BoundingBox.h, src/BoundingBox.hpp, src/CMap.cpp, src/CMap.h, + src/CMap.hpp, src/CMapManager.cpp, src/CMapManager.h, + src/CMapManager.hpp, src/CMapReader.cpp, src/CMapReader.h, + src/CMapReader.hpp, src/CRC32.cpp, src/CRC32.h, src/CRC32.hpp, + src/Calculator.cpp, src/Calculator.h, src/Calculator.hpp, + src/CharMapID.cpp, src/CharMapID.h, src/CharMapID.hpp, src/Character.h, + src/Character.hpp, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, + src/CmdLineParserBase.hpp, src/Color.cpp, src/Color.h, src/Color.hpp, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, + src/ColorSpecialHandler.hpp, src/CommandLine.cpp, src/CommandLine.h, + src/CommandLine.hpp, src/DLLoader.cpp, src/DLLoader.h, src/DLLoader.hpp, + src/DVIActions.h, src/DVIActions.hpp, src/DVIReader.cpp, src/DVIReader.h, + src/DVIReader.hpp, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVG.hpp, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/DVIToSVGActions.hpp, + src/DependencyGraph.h, src/DependencyGraph.hpp, src/Directory.cpp, + src/Directory.h, src/Directory.hpp, src/DvisvgmSpecialHandler.cpp, + src/DvisvgmSpecialHandler.h, src/DvisvgmSpecialHandler.hpp, + src/EPSFile.cpp, src/EPSFile.h, src/EPSFile.hpp, src/EPSToSVG.cpp, + src/EPSToSVG.h, src/EPSToSVG.hpp, src/EmSpecialHandler.cpp, + src/EmSpecialHandler.h, src/EmSpecialHandler.hpp, src/EncFile.cpp, + src/EncFile.h, src/EncFile.hpp, src/FileFinder.cpp, src/FileFinder.h, + src/FileFinder.hpp, src/FilePath.cpp, src/FilePath.h, src/FilePath.hpp, + src/FileSystem.cpp, src/FileSystem.h, src/FileSystem.hpp, src/FixWord.h, + src/FixWord.hpp, src/Font.cpp, src/Font.h, src/Font.hpp, + src/FontCache.cpp, src/FontCache.h, src/FontCache.hpp, + src/FontEncoding.cpp, src/FontEncoding.h, src/FontEncoding.hpp, + src/FontEngine.cpp, src/FontEngine.h, src/FontEngine.hpp, + src/FontManager.cpp, src/FontManager.h, src/FontManager.hpp, + src/FontMap.cpp, src/FontMap.h, src/FontMap.hpp, src/FontMetrics.cpp, + src/FontMetrics.h, src/FontMetrics.hpp, src/FontStyle.h, + src/FontStyle.hpp, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, + src/GFGlyphTracer.hpp, src/GFReader.cpp, src/GFReader.h, + src/GFReader.hpp, src/GFTracer.cpp, src/GFTracer.h, src/GFTracer.hpp, + src/Ghostscript.cpp, src/Ghostscript.h, src/Ghostscript.hpp, src/Glyph.h, + src/Glyph.hpp, src/GlyphTracerMessages.h, src/GlyphTracerMessages.hpp, + src/GraphicsPath.h, src/GraphicsPath.hpp, src/HtmlSpecialHandler.cpp, + src/HtmlSpecialHandler.h, src/HtmlSpecialHandler.hpp, + src/InputBuffer.cpp, src/InputBuffer.h, src/InputBuffer.hpp, + src/InputReader.cpp, src/InputReader.h, src/InputReader.hpp, src/JFM.cpp, + src/JFM.h, src/JFM.hpp, src/Length.cpp, src/Length.h, src/Length.hpp, + src/Makefile.am, src/MapLine.cpp, src/MapLine.h, src/MapLine.hpp, + src/Matrix.cpp, src/Matrix.h, src/Matrix.hpp, src/Message.cpp, + src/Message.h, src/Message.hpp, src/MessageException.h, + src/MessageException.hpp, src/MetafontWrapper.cpp, src/MetafontWrapper.h, + src/MetafontWrapper.hpp, src/MiKTeXCom.cpp, src/MiKTeXCom.h, + src/MiKTeXCom.hpp, src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.h, + src/NoPsSpecialHandler.hpp, src/NumericRanges.h, src/NumericRanges.hpp, + src/PSFilter.h, src/PSFilter.hpp, src/PSInterpreter.cpp, + src/PSInterpreter.h, src/PSInterpreter.hpp, src/PSPattern.cpp, + src/PSPattern.h, src/PSPattern.hpp, src/PSPreviewFilter.cpp, + src/PSPreviewFilter.h, src/PSPreviewFilter.hpp, src/PageRanges.cpp, + src/PageRanges.h, src/PageRanges.hpp, src/PageSize.cpp, src/PageSize.h, + src/PageSize.hpp, src/Pair.h, src/Pair.hpp, + src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.h, + src/PapersizeSpecialHandler.hpp, src/PathClipper.cpp, src/PathClipper.h, + src/PathClipper.hpp, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.h, + src/PdfSpecialHandler.hpp, src/PreScanDVIReader.cpp, + src/PreScanDVIReader.h, src/PreScanDVIReader.hpp, src/Process.cpp, + src/Process.h, src/Process.hpp, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/PsSpecialHandler.hpp, src/RangeMap.cpp, + src/RangeMap.h, src/RangeMap.hpp, src/SVGCharHandler.cpp, + src/SVGCharHandler.h, src/SVGCharHandler.hpp, + src/SVGCharHandlerFactory.cpp, src/SVGCharHandlerFactory.h, + src/SVGCharHandlerFactory.hpp, src/SVGCharPathHandler.cpp, + src/SVGCharPathHandler.h, src/SVGCharPathHandler.hpp, + src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.h, + src/SVGCharTspanTextHandler.hpp, src/SVGOutput.cpp, src/SVGOutput.h, + src/SVGOutput.hpp, src/SVGSingleCharTextHandler.cpp, + src/SVGSingleCharTextHandler.h, src/SVGSingleCharTextHandler.hpp, + src/SVGTree.cpp, src/SVGTree.h, src/SVGTree.hpp, src/ShadingPatch.cpp, + src/ShadingPatch.h, src/ShadingPatch.hpp, src/SignalHandler.cpp, + src/SignalHandler.h, src/SignalHandler.hpp, src/SpecialActions.h, + src/SpecialActions.hpp, src/SpecialHandler.h, src/SpecialHandler.hpp, + src/SpecialManager.cpp, src/SpecialManager.h, src/SpecialManager.hpp, + src/StreamReader.cpp, src/StreamReader.h, src/StreamReader.hpp, + src/StreamWriter.cpp, src/StreamWriter.h, src/StreamWriter.hpp, + src/Subfont.cpp, src/Subfont.h, src/Subfont.hpp, src/System.cpp, + src/System.h, src/System.hpp, src/TFM.cpp, src/TFM.h, src/TFM.hpp, + src/TensorProductPatch.cpp, src/TensorProductPatch.h, + src/TensorProductPatch.hpp, src/Terminal.cpp, src/Terminal.h, + src/Terminal.hpp, src/ToUnicodeMap.cpp, src/ToUnicodeMap.h, + src/ToUnicodeMap.hpp, src/TpicSpecialHandler.cpp, + src/TpicSpecialHandler.h, src/TpicSpecialHandler.hpp, + src/TriangularPatch.cpp, src/TriangularPatch.h, src/TriangularPatch.hpp, + src/Unicode.cpp, src/Unicode.h, src/Unicode.hpp, src/VFActions.h, + src/VFActions.hpp, src/VFReader.cpp, src/VFReader.h, src/VFReader.hpp, + src/VectorIterator.h, src/VectorIterator.hpp, src/VectorStream.h, + src/VectorStream.hpp, src/XMLDocument.cpp, src/XMLDocument.h, + src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.h, src/XMLNode.hpp, + src/XMLString.cpp, src/XMLString.h, src/XMLString.hpp, + src/ZLibOutputStream.h, src/ZLibOutputStream.hpp, src/dvisvgm.cpp, + src/macros.h, src/macros.hpp, src/psdefs.cpp, tests/BezierTest.cpp, + tests/BitmapTest.cpp, tests/BoundingBoxTest.cpp, + tests/CMapManagerTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, + tests/CRC32Test.cpp, tests/CalculatorTest.cpp, + tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, + tests/CommandLineTest.cpp, tests/DependencyGraphTest.cpp, + tests/DirectoryTest.cpp, tests/DvisvgmSpecialTest.cpp, + tests/EmSpecialTest.cpp, tests/FileFinderTest.cpp, + tests/FilePathTest.cpp, tests/FileSystemTest.cpp, + tests/FontManagerTest.cpp, tests/FontMapTest.cpp, + tests/GFGlyphTracerTest.cpp, tests/GFReaderTest.cpp, + tests/GhostscriptTest.cpp, tests/GraphicsPathTest.cpp, + tests/JFMReaderTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, + tests/MapLineTest.cpp, tests/MatrixTest.cpp, + tests/MessageExceptionTest.cpp, tests/PSInterpreterTest.cpp, + tests/PageRagesTest.cpp, tests/PageSizeTest.cpp, tests/PairTest.cpp, + tests/RangeMapTest.cpp, tests/SVGOutputTest.cpp, + tests/ShadingPatchTest.cpp, tests/SplittedCharInputBufferTest.cpp, + tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, + tests/StreamWriterTest.cpp, tests/SubfontTest.cpp, + tests/TFMReaderTest.cpp, tests/TensorProductPatchTest.cpp, + tests/ToUnicodeMapTest.cpp, tests/TriangularPatchTest.cpp, + tests/UnicodeTest.cpp, tests/VectorIteratorTest.cpp, + tests/VectorStreamTest.cpp, tests/XMLNodeTest.cpp, + tests/XMLStringTest.cpp, tests/create-makefile: + renamed filename extension of C++ headers to .hpp + +2016-07-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/CMapManager.cpp, src/CMapManager.h, src/FileFinder.cpp, + src/Font.cpp, src/Font.h, src/XMLDocument.cpp, src/XMLDocument.h, + src/XMLNode.cpp, src/XMLNode.h, tests/XMLNodeTest.cpp: + use smart pointers to release heap memory + + * src/DVIToSVGActions.cpp, src/DVIToSVGActions.h: + create BoxMap object directly, avoid new/delete + +2016-07-19 Martin Gieseking <martin.gieseking@uos.de> + + * src/AGLTable.h, src/Color.cpp, src/Unicode.cpp, tests/genhashcheck.py: + replaced repeated binary search implementations with calls of + lower_bound() + +2016-07-13 Martin Gieseking <martin.gieseking@uos.de> + + * src/FileFinder.cpp, src/Message.cpp: + initialize maps with initializer-lists + +2016-07-05 Martin Gieseking <martin.gieseking@uos.de> + + * src/Length.cpp, src/TpicSpecialHandler.cpp: + replaced 'id macros' with constexpr functions + +2016-07-04 Martin Gieseking <martin.gieseking@uos.de> + + * src/TFM.cpp: + added missing initializers + + * src/dvisvgm.cpp: + catch exception in set_cache_dir() + + * .travis.yml, configure.ac, src/Doxyfile: + set version to 1.16 + + * NEWS, README.md: + updated NEWS and README + +2016-07-03 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, m4/ax_cxx_compile_stdcxx.m4: + switch from C++03 to C++11 + + * src/NumericRanges.h, src/PapersizeSpecialHandler.cpp, src/Unicode.cpp, + src/VFReader.cpp: + replaced static callback functions with lambdas + + * src/CMapReader.cpp, src/CMapReader.h, src/CmdLineParserBase.cpp, + src/CmdLineParserBase.h, src/Color.cpp, src/Color.h, src/CommandLine.cpp, + src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, + src/EmSpecialHandler.cpp, src/Font.cpp, src/Font.h, src/FontManager.cpp, + src/GraphicsPath.h, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.h, + src/Length.cpp, src/Length.h, src/PathClipper.cpp, + src/PsSpecialHandler.cpp, src/SVGTree.cpp, src/ShadingPatch.cpp, + src/TensorProductPatch.h, tests/BoundingBoxTest.cpp, + tests/LengthTest.cpp, tests/ShadingPatchTest.cpp, + tests/TensorProductPatchTest.cpp, tests/TriangularPatchTest.cpp: + replaced some enums with enum classes + + * clipper/clipper.hpp, src/AGLTable.h, src/BasicDVIReader.cpp, + src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.h, src/CMap.cpp, + src/CMap.h, src/CMapReader.cpp, src/CRC32.cpp, src/CRC32.h, + src/CharMapID.h, src/Character.h, src/Color.cpp, src/Color.h, + src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, + src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, + src/EPSFile.cpp, src/EPSFile.h, src/EncFile.cpp, src/EncFile.h, + src/FileSystem.cpp, src/FileSystem.h, src/FixWord.h, src/Font.cpp, + src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEncoding.cpp, + src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, + src/FontManager.cpp, src/FontManager.h, src/FontMetrics.cpp, + src/FontMetrics.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, + src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, + src/Glyph.h, src/GlyphTracerMessages.h, src/InputBuffer.cpp, + src/InputBuffer.h, src/JFM.cpp, src/JFM.h, src/Makefile.am, + src/Message.h, src/Pair.h, src/PathClipper.cpp, src/PreScanDVIReader.cpp, + src/PsSpecialHandler.h, src/RangeMap.cpp, src/RangeMap.h, + src/SVGCharHandler.h, src/SVGCharPathHandler.cpp, + src/SVGCharPathHandler.h, src/SVGCharTspanTextHandler.cpp, + src/SVGCharTspanTextHandler.h, src/SVGSingleCharTextHandler.cpp, + src/SVGSingleCharTextHandler.h, src/StreamReader.cpp, src/StreamReader.h, + src/StreamWriter.cpp, src/StreamWriter.h, src/Subfont.cpp, src/Subfont.h, + src/TFM.cpp, src/TFM.h, src/ToUnicodeMap.cpp, src/ToUnicodeMap.h, + src/Unicode.cpp, src/Unicode.h, src/VFActions.h, src/VFReader.cpp, + src/VFReader.h, src/XMLString.cpp, src/types.h, tests/BitmapTest.cpp, + tests/CRC32Test.cpp, tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, + tests/GFGlyphTracerTest.cpp, tests/GFReaderTest.cpp, + tests/JFMReaderTest.cpp, tests/Makefile.am, tests/StreamReaderTest.cpp, + tests/TriangularPatchTest.cpp, tests/TypesTest.cpp, + tests/UnicodeTest.cpp: + replaced own fixed-sized integer types with types from cstdint + + * AUTHORS, LGPL-2.1.txt, Makefile.am, gzstream/COPYING.LIB, + gzstream/Makefile, gzstream/README, gzstream/gzstream.cpp, + gzstream/gzstream.h, gzstream/index.html, gzstream/logo.gif, + gzstream/test_gunzip.C, gzstream/test_gzip.C, gzstream/version, + src/Makefile.am, src/SVGOutput.cpp, src/SVGOutput.h, + src/ZLibOutputStream.h, src/dvisvgm.cpp, src/gzstream.cpp, + src/gzstream.h, tests/Makefile.am, tests/SVGOutputTest.cpp, + tests/create-makefile: + replaced old gzstream classes + + * src/DVIReader.cpp, src/DVIReader.h, src/Font.cpp, src/Font.h, + src/FontManager.cpp, src/FontManager.h, src/VFActions.h, + src/VFReader.cpp: + transfer DVI snippet of a VF char by move semantics rather than by heap + pointer + +2016-07-02 Martin Gieseking <martin.gieseking@uos.de> + + * src/Bitmap.cpp, src/BoundingBox.h, src/CMapManager.cpp, + src/CmdLineParserBase.cpp, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/DependencyGraph.h, + src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, + src/FileFinder.cpp, src/FilePath.cpp, src/FilePath.h, src/Font.cpp, + src/FontCache.cpp, src/FontEncoding.cpp, src/FontManager.cpp, + src/FontMap.cpp, src/FontMap.h, src/GFReader.cpp, src/GFReader.h, + src/GraphicsPath.h, src/HtmlSpecialHandler.cpp, src/NumericRanges.h, + src/PSPattern.cpp, src/PsSpecialHandler.cpp, src/SVGTree.cpp, + src/SVGTree.h, src/SpecialManager.cpp, src/SpecialManager.h, + src/Subfont.cpp, src/Subfont.h, src/TpicSpecialHandler.cpp, + src/XMLDocument.cpp, src/XMLNode.cpp, src/XMLString.cpp, src/macros.h: + use range-based 'for' loop to iterate over containers; drop FORALL macro + + * clipper/clipper.hpp, src/BgColorSpecialHandler.h, src/Bitmap.cpp, + src/CMap.h, src/CmdLineParserBase.h, src/ColorSpecialHandler.h, + src/CommandLine.h, src/DVIReader.h, src/DVIToSVG.h, + src/DVIToSVGActions.h, src/DvisvgmSpecialHandler.h, src/EPSToSVG.h, + src/EmSpecialHandler.h, src/EncFile.h, src/Font.h, src/FontCache.cpp, + src/FontEncoding.h, src/FontMetrics.h, src/GFGlyphTracer.h, + src/GFReader.h, src/GFTracer.h, src/GlyphTracerMessages.h, + src/GraphicsPath.h, src/HtmlSpecialHandler.h, src/InputBuffer.h, + src/InputReader.h, src/JFM.h, src/MessageException.h, + src/NoPsSpecialHandler.h, src/PSPattern.h, src/PSPreviewFilter.h, + src/PapersizeSpecialHandler.h, src/PathClipper.cpp, + src/PdfSpecialHandler.h, src/PreScanDVIReader.h, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, + src/SVGCharPathHandler.h, src/SVGCharTspanTextHandler.h, src/SVGOutput.h, + src/SVGSingleCharTextHandler.h, src/SpecialActions.h, src/TFM.h, + src/TensorProductPatch.h, src/TpicSpecialHandler.h, + src/TriangularPatch.h, src/VectorStream.h, src/XMLNode.h: + mark overridden methods with 'override' keyword + + * src/PsSpecialHandler.cpp: + use unique_ptr rather than deprecated auto_ptr + + * src/BasicDVIReader.h, src/Bitmap.h, src/CMap.h, src/CmdLineParserBase.h, + src/DVIActions.h, src/Font.h, src/FontEncoding.h, src/FontMetrics.h, + src/GFGlyphTracer.h, src/GFReader.h, src/GFTracer.h, src/GraphicsPath.h, + src/InputBuffer.h, src/InputReader.h, src/MessageException.h, + src/PSFilter.h, src/PSInterpreter.h, src/PSPattern.h, + src/SVGCharHandler.h, src/SVGOutput.h, src/ShadingPatch.h, + src/SpecialActions.h, src/SpecialHandler.h, src/StreamReader.h, + src/StreamWriter.h, src/Subfont.h, src/VFActions.h, src/XMLNode.h: + replaced empty virtual destructors with default ones + +2016-07-01 Martin Gieseking <martin.gieseking@uos.de> + + * src/BasicDVIReader.h, src/DVIActions.h, src/DVIReader.cpp, + src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/FontManager.cpp, + src/FontManager.h, src/PreScanDVIReader.h, src/dvisvgm.cpp: + refactored the DVI reader classes +- added higher-level template methods + to process the DVI commands more safely +- moved triggering of DVIActions + from DVIReader to DVIToSVG + +2016-06-29 Martin Gieseking <martin.gieseking@uos.de> + + * src/BoundingBox.cpp, src/BoundingBox.h, src/DVIToSVG.cpp, + src/dvisvgm.cpp: + fixed computation of bounding boxes modified by relative --bbox argument + + * xxHash/xxhash.c, xxHash/xxhash.h: + updated xxHash to version 0.6.1 + +2016-06-17 Martin Gieseking <martin.gieseking@uos.de> + + * src/TFM.cpp, tests/JFMReaderTest.cpp, tests/TFMReaderTest.cpp: + minor improvements to TFM/JFM tests + +2016-06-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp, src/VectorStream.h, tests/VectorStreamTest.cpp: + refactored VectorStreamBuffer to keep constness of assigned vector + + * src/GFReader.cpp: + ensure validity of postpost command in GFReader::executePostamble() + +2016-06-14 Martin Gieseking <martin.gieseking@uos.de> + + * src/DvisvgmSpecialHandler.cpp, src/TFM.cpp, src/VFReader.cpp: + replaced local definitions of pt2bp with Length::pt2bp + + * src/XMLNode.h: + added ouput operators for the XML node objects + + * src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, + tests/EmSpecialTest.cpp, tests/Makefile.am: + improved the emTeX special handler; added EmSpecialTest + + * src/BoundingBox.cpp, src/BoundingBox.h, tests/BoundingBoxTest.cpp: + fixed unit conversion in BoundingBox class + +2016-06-13 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/Length.cpp, src/Length.h, tests/LengthTest.cpp: + added dd, cc, and sp units to class Length; fixed factor pt2pc + +2016-06-12 Martin Gieseking <martin.gieseking@uos.de> + + * xxHash/xxhash.c, xxHash/xxhash.h: + updated xxHash to version 0.6.0 + + * src/DLLoader.cpp, src/DLLoader.h, src/Directory.cpp, src/Directory.h, + src/FilePath.cpp, src/FilePath.h, src/FileSystem.cpp, src/GFTracer.cpp, + src/Ghostscript.cpp, src/Ghostscript.h, src/Message.cpp, + src/MetafontWrapper.cpp, src/Process.cpp, src/Terminal.cpp, + src/Terminal.h, src/dvisvgm.cpp: + cleaned up Windows-related #defines + +2016-06-10 Martin Gieseking <martin.gieseking@uos.de> + + * src/CommandLine.cpp: + removed redundant #includes + + * src/Length.cpp, src/Length.h, tests/LengthTest.cpp: + added functions to convert between Length::Unit and std::string + +2016-06-07 Martin Gieseking <martin.gieseking@uos.de> + + * src/CMapManager.cpp, src/CMapManager.h, src/DVIActions.h, + src/DVIToSVGActions.h, src/DvisvgmSpecialHandler.h, src/Font.h, + src/FontEngine.h, src/FontManager.h, src/HtmlSpecialHandler.cpp, + src/HtmlSpecialHandler.h, src/PSPattern.h, src/PSPreviewFilter.h, + src/SVGCharHandler.cpp, src/SVGCharHandler.h, src/SVGCharPathHandler.cpp, + src/SVGCharTspanTextHandler.cpp, src/SVGSingleCharTextHandler.cpp, + src/SVGTree.h, src/SpecialActions.h, src/SpecialHandler.h, + src/SpecialManager.h, src/XMLDocument.cpp, src/XMLNode.h, + tests/XMLNodeTest.cpp: + changed some structs to classes and replaced #includes with forward + declarations + + * src/SVGCharHandler.h: + added missing initializer to class SVGCharHandler + +2016-06-03 Martin Gieseking <martin.gieseking@uos.de> + + * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DVIToSVG.cpp, + src/DVIToSVGActions.cpp, src/DvisvgmSpecialHandler.cpp, + src/DvisvgmSpecialHandler.h, src/EPSToSVG.cpp, src/EmSpecialHandler.cpp, + src/EmSpecialHandler.h, src/HtmlSpecialHandler.cpp, + src/HtmlSpecialHandler.h, src/NoPsSpecialHandler.cpp, + src/NoPsSpecialHandler.h, src/PSPattern.cpp, src/PSPattern.h, + src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.h, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SpecialHandler.h, + src/SpecialManager.cpp, src/SpecialManager.h, src/TpicSpecialHandler.cpp, + src/TpicSpecialHandler.h, tests/ColorSpecialTest.cpp, + tests/DvisvgmSpecialTest.cpp: + refactored handling of SpecialAction objects + + * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/SVGTree.cpp, + src/SVGTree.h: + refactored processing of end-of-page (eop) commands + + * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/Makefile.am, + src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.h, + src/PsSpecialHandler.cpp, src/dvisvgm.cpp: + added evaluation of PS special 'papersize=' + +2016-06-02 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVG.cpp: + fixed transformation of background color rectange + +2016-05-31 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVG.cpp, src/EPSToSVG.cpp: + reworded messages printed after finishing a conversion + +2016-05-30 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVGActions.cpp, src/Font.cpp, src/Makefile.am, + src/SVGCharHandler.cpp, src/SVGCharHandler.h, + src/SVGCharHandlerFactory.cpp, src/SVGCharHandlerFactory.h, + src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.h, + src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.h, + src/SVGSingleCharTextHandler.cpp, src/SVGSingleCharTextHandler.h, + src/SVGTree.cpp, src/SVGTree.h, src/dvisvgm.cpp: + replaced static SVG text backend by specialized handler classes + + * src/BasicDVIReader.cpp, src/BasicDVIReader.h, src/Bezier.h, + src/TensorProductPatch.h, src/TriangularPatch.h: + replaced leading spaces with tabs + +2016-05-29 Martin Gieseking <martin.gieseking@uos.de> + + * src/BasicDVIReader.cpp, src/DVIReader.cpp: + fixed handling of subfont index in native font definition of XDV 7 + +2016-05-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/XMLDocument.cpp, src/XMLNode.cpp, src/XMLNode.h, + tests/DvisvgmSpecialTest.cpp: + prevent line wrapping inside text nodes + +2016-05-26 Martin Gieseking <martin.gieseking@uos.de> + + * README.md, doc/dvisvgm.txt.in, src/BasicDVIReader.cpp, + src/BasicDVIReader.h, src/DVIReader.cpp, src/DVIToSVG.cpp: + reworded 'DVI format' to 'DVI (format) version' + + * README.md, doc/dvisvgm.txt.in, src/BasicDVIReader.cpp, + src/BasicDVIReader.h, src/DVIReader.cpp: + added support for XDV version 7 introduced by XeTeX 0.99995 + +2016-05-25 Martin Gieseking <martin.gieseking@uos.de> + + * src/TFM.cpp: + prevent reading more than 7 TFM param values (fixes #58) + + * .travis.yml: + temporarily drop clang from Travis builds + +2016-05-24 Martin Gieseking <martin.gieseking@uos.de> + + * src/JFM.cpp, src/JFM.h, src/TFM.cpp, src/TFM.h: + TFM: store design size in bp units rather than as fixword + + * src/FontMetrics.h, src/JFM.cpp, src/TFM.cpp, src/TFM.h: + added methods to query space-related parameters from TFM/JFM files + + * src/TFM.cpp, tests/JFMReaderTest.cpp, tests/TFMReaderTest.cpp: + fixed calculation of character dimensions in TFM class + +2016-04-22 Martin Gieseking <martin.gieseking@uos.de> + + * src/Process.cpp: + fixed collecting stdout/stderr output when executing a process + +2016-04-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/CMap.h, src/CMapReader.cpp, tests/CMapManagerTest.cpp, + tests/Makefile.am, tests/data/Makefile.am, tests/data/ot1.cmap: + added CMapManagerTest + +2016-04-19 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml, configure.ac, src/Doxyfile: + set version to 1.15.1 + + * NEWS, README, README.md: + updated NEWS and README + +2016-04-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/Calculator.cpp, src/Matrix.cpp: + use std::ws to skip whitespace in istreams + + * src/Matrix.cpp: + avoid adding trailing EOF characters when parsing parameters of + transformation commands + + * tests/CMapReaderTest.cpp: + improved CMapReaderTest + +2016-04-11 Martin Gieseking <martin.gieseking@uos.de> + + * src/AGLTable.h, src/Makefile.am, src/Unicode.cpp, tests/Makefile.am, + tests/create-makefile, tests/genhashcheck.py: + moved AGL hash table from Unicode.cpp to a separate file + +2016-04-07 Martin Gieseking <martin.gieseking@uos.de> + + * src/XMLDocument.cpp: + explicitly specify UTF-8 encoding in XML declaration (closes #54) + + * src/Unicode.cpp, tests/UnicodeTest.cpp: + added support for the AGL character names 'uniFOO' and 'uFOO' + +2016-03-17 Martin Gieseking <martin.gieseking@uos.de> + + * src/GraphicsPath.h: + renamed GraphicsPath::sconito/scubicto + +2016-03-14 Martin Gieseking <martin.gieseking@uos.de> + + * doc/db2html.xsl: + adapted db2html to insert anchors for each option entry + + * src/DVIActions.h, src/DVIReader.cpp, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/SVGTree.cpp, src/SVGTree.h: + changed font parameter of setFont() methods from pointer to reference + + * src/SVGTree.cpp, src/SVGTree.h: + split text and path section of SVGTree::appendChar() into seperate + methods + +2016-02-27 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS: + updated NEWS + +2016-02-26 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/Font.cpp, src/Font.h, src/SVGTree.cpp, src/SVGTree.h, + src/dvisvgm.cpp, src/options.xml: + added option --comments (adds comments with additional information to + the SVG file + + * src/Font.cpp, src/Unicode.cpp, src/Unicode.h, tests/UnicodeTest.cpp: + renamed Unicode::psNameToCodepoint() to Unicode::aglNameToCodepoint + + * src/FileFinder.cpp, src/FilePath.cpp, src/FileSystem.cpp, + src/FileSystem.h, src/Font.cpp, src/MetafontWrapper.cpp, src/dvisvgm.cpp: + changed string parameters of FileSystem functions to type std::string + + * .travis.yml, configure.ac, src/Doxyfile: + set version to 1.15 + +2016-02-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontEngine.cpp: + reworded error messages of class FontEngine + + * src/MetafontWrapper.cpp, src/Process.cpp: + avoid reading Metafont logfiles to extract the GF filename + + * configure.ac, src/FileFinder.cpp, src/FileFinder.h, + tests/FileFinderTest.cpp, tests/GFGlyphTracerTest.cpp, + tests/GFReaderTest.cpp, tests/JFMReaderTest.cpp, tests/Makefile.am, + tests/TFMReaderTest.cpp, tests/cidjmgr0-h.tfm, tests/cmr10.600gf, + tests/cmr10.tfm, tests/create-makefile, tests/data/Makefile.am, + tests/data/cidjmgr0-h.tfm, tests/data/cmr10.600gf, tests/data/cmr10.tfm, + tests/data/dvipdfm_test.map, tests/data/dvips_test.map, + tests/data/frktest-nf-cmp.svg, tests/data/frktest-wf-cmp.svg, + tests/data/frktest.dvi, tests/data/sample-nf-cmp.svg, + tests/data/sample-wf-cmp.svg, tests/data/sample.dvi, + tests/data/sample.sfd, tests/dvipdfm_test.map, tests/dvips_test.map, + tests/frktest-nf-cmp.svg, tests/frktest-wf-cmp.svg, tests/frktest.dvi, + tests/sample-nf-cmp.svg, tests/sample-wf-cmp.svg, tests/sample.dvi, + tests/sample.sfd: + moved test data files to subfolder + +2016-02-22 Martin Gieseking <martin.gieseking@uos.de> + + * tests/FileFinderTest.cpp, tests/GFReaderTest.cpp, + tests/SVGOutputTest.cpp: + avoid implicit casts of ifstream/ozstream objects in tests + + * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, + tests/CommandLineTest.cpp: + minor improvements of class CommandLineTest + + * src/XMLNode.cpp, tests/DvisvgmSpecialTest.cpp: + improved DvisvgmSpecialTest + + * src/FontEngine.cpp, src/FontEngine.h: + removed redundant code from class FontEngine + +2016-02-05 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + don't remove clipping paths that consist of single moveto commands only + +2016-02-01 Martin Gieseking <martin.gieseking@uos.de> + + * src/Bitmap.cpp, src/BoundingBox.cpp, src/CMap.cpp, src/CMapManager.cpp, + src/Calculator.cpp, src/CommandLine.cpp, src/DVIReader.cpp, + src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, + src/Directory.cpp, src/Directory.h, src/EPSToSVG.cpp, src/EncFile.cpp, + src/FileFinder.cpp, src/Font.cpp, src/FontCache.h, src/FontEngine.cpp, + src/FontManager.cpp, src/FontMap.cpp, src/FontMetrics.cpp, + src/GFGlyphTracer.cpp, src/GFReader.cpp, src/GFTracer.cpp, + src/HtmlSpecialHandler.cpp, src/InputReader.cpp, src/MapLine.cpp, + src/MetafontWrapper.cpp, src/PSInterpreter.cpp, + src/PdfSpecialHandler.cpp, src/Process.cpp, src/PsSpecialHandler.cpp, + src/SVGTree.cpp, src/SpecialManager.cpp, src/StreamReader.cpp, + src/StreamWriter.cpp, src/Subfont.cpp, src/TFM.cpp, + src/TensorProductPatch.cpp, src/TpicSpecialHandler.cpp, src/VFReader.cpp, + src/XMLDocument.cpp, src/dvisvgm.cpp, tests/XMLStringTest.cpp: + minor code cleanup (removed redundant includes, added casts) + +2016-01-21 Martin Gieseking <martin.gieseking@uos.de> + + * m4/ax_code_coverage.m4: + updated m4 code coverage script to latest version + + * src/JFM.h, tests/JFMReaderTest.cpp, tests/Makefile.am, + tests/TFMReaderTest.cpp, tests/cidjmgr0-h.tfm, tests/cmr10.tfm, + tests/create-makefile: + added tests for the TFM and JFM classes + +2016-01-19 Martin Gieseking <martin.gieseking@uos.de> + + * src/GraphicsPath.h, tests/GraphicsPathTest.cpp: + fixed access of invalid iterator + + * .travis.yml, configure.ac, src/Doxyfile: + set version to 1.14.2 + + * NEWS, README.md: + updated NEWS + +2016-01-18 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in: + added generic info about the command-line interface to the manpage + + * doc/db2html.xsl: + updated links to Bootstrap and Font Awesome in stylesheet db2html.xsl + + * src/dvisvgm.cpp, xxHash/xxhash.c, xxHash/xxhash.h: + updated xxHash to version 0.5.0 + + * tests/Makefile.am, tests/create-makefile, tests/genhashcheck.py: + added test to check the validity of the char name hashes used in + Unicode.cpp + +2016-01-15 Martin Gieseking <martin.gieseking@uos.de> + + * src/BgColorSpecialHandler.cpp, src/ColorSpecialHandler.cpp, + src/ColorSpecialHandler.h, tests/ColorSpecialTest.cpp: + removed check for 'background' special from ColorSpecialHandler + +2016-01-13 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.h, src/FontStyle.h, src/SVGTree.cpp, + src/TriangularPatch.cpp: + updated/fixed some comments + + * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DVIToSVG.cpp, + src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h: + corrected handling of background color special across DVI pages + +2016-01-05 Martin Gieseking <martin.gieseking@uos.de> + + * src/GFReader.cpp, src/GFReader.h: + added checks for misplaced GF commands + + * NEWS: + updated NEWS + +2016-01-04 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml: + force Travis to use legacy builds due to an issue with clang and gtest + + * Makefile.am, README, README.md, configure.ac, doc/Makefile.am, + doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, + doc/dvisvgm.txt.in, src/BasicDVIReader.cpp, src/BasicDVIReader.h, + src/Bezier.cpp, src/Bezier.h, src/BgColorSpecialHandler.cpp, + src/BgColorSpecialHandler.h, src/Bitmap.cpp, src/Bitmap.h, + src/BoundingBox.cpp, src/BoundingBox.h, src/CMap.cpp, src/CMap.h, + src/CMapManager.cpp, src/CMapManager.h, src/CMapReader.cpp, + src/CMapReader.h, src/CRC32.cpp, src/CRC32.h, src/Calculator.cpp, + src/Calculator.h, src/CharMapID.cpp, src/CharMapID.h, src/Character.h, + src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Color.cpp, + src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, + src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DLLoader.h, + src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, + src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, + src/DependencyGraph.h, src/Directory.cpp, src/Directory.h, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, + src/EPSFile.cpp, src/EPSFile.h, src/EPSToSVG.cpp, src/EPSToSVG.h, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/EncFile.cpp, + src/EncFile.h, src/FileFinder.cpp, src/FileFinder.h, src/FilePath.cpp, + src/FilePath.h, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, + src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEncoding.cpp, + src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, + src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, + src/FontMetrics.cpp, src/FontMetrics.h, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, + src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/Glyph.h, + src/GlyphTracerMessages.h, src/GraphicsPath.h, + src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.h, + src/InputBuffer.cpp, src/InputBuffer.h, src/InputReader.cpp, + src/InputReader.h, src/JFM.cpp, src/JFM.h, src/Length.cpp, src/Length.h, + src/Makefile.am, src/MapLine.cpp, src/MapLine.h, src/Matrix.cpp, + src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, + src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/MiKTeXCom.cpp, + src/MiKTeXCom.h, src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.h, + src/NumericRanges.h, src/PSFilter.h, src/PSInterpreter.cpp, + src/PSInterpreter.h, src/PSPattern.cpp, src/PSPattern.h, + src/PSPreviewFilter.cpp, src/PSPreviewFilter.h, src/PageRanges.cpp, + src/PageRanges.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, + src/PathClipper.cpp, src/PathClipper.h, src/PdfSpecialHandler.cpp, + src/PdfSpecialHandler.h, src/PreScanDVIReader.cpp, + src/PreScanDVIReader.h, src/Process.cpp, src/Process.h, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/RangeMap.cpp, + src/RangeMap.h, src/SVGOutput.cpp, src/SVGOutput.h, src/SVGTree.cpp, + src/SVGTree.h, src/ShadingPatch.cpp, src/ShadingPatch.h, + src/SignalHandler.cpp, src/SignalHandler.h, src/SpecialActions.h, + src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, + src/StreamReader.cpp, src/StreamReader.h, src/StreamWriter.cpp, + src/StreamWriter.h, src/Subfont.cpp, src/Subfont.h, src/System.cpp, + src/System.h, src/TFM.cpp, src/TFM.h, src/TensorProductPatch.cpp, + src/TensorProductPatch.h, src/Terminal.cpp, src/Terminal.h, + src/ToUnicodeMap.cpp, src/ToUnicodeMap.h, src/TpicSpecialHandler.cpp, + src/TpicSpecialHandler.h, src/TriangularPatch.cpp, src/TriangularPatch.h, + src/Unicode.cpp, src/Unicode.h, src/VFActions.h, src/VFReader.cpp, + src/VFReader.h, src/VectorIterator.h, src/VectorStream.h, + src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, + src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, + src/options.dtd, src/options.xml, src/psdefs.cpp, src/types.h, + tests/BezierTest.cpp, tests/BitmapTest.cpp, tests/BoundingBoxTest.cpp, + tests/CMapReaderTest.cpp, tests/CMapTest.cpp, tests/CRC32Test.cpp, + tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, + tests/ColorTest.cpp, tests/CommandLineTest.cpp, + tests/DependencyGraphTest.cpp, tests/DirectoryTest.cpp, + tests/DvisvgmSpecialTest.cpp, tests/FileFinderTest.cpp, + tests/FilePathTest.cpp, tests/FileSystemTest.cpp, + tests/FontManagerTest.cpp, tests/FontMapTest.cpp, + tests/GFGlyphTracerTest.cpp, tests/GFReaderTest.cpp, + tests/GraphicsPathTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, + tests/MapLineTest.cpp, tests/MatrixTest.cpp, + tests/MessageExceptionTest.cpp, tests/PSInterpreterTest.cpp, + tests/PageRagesTest.cpp, tests/PageSizeTest.cpp, tests/PairTest.cpp, + tests/RangeMapTest.cpp, tests/SVGOutputTest.cpp, + tests/ShadingPatchTest.cpp, tests/SplittedCharInputBufferTest.cpp, + tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, + tests/StreamWriterTest.cpp, tests/SubfontTest.cpp, + tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, + tests/TriangularPatchTest.cpp, tests/TypesTest.cpp, + tests/UnicodeTest.cpp, tests/VectorIteratorTest.cpp, + tests/VectorStreamTest.cpp, tests/XMLNodeTest.cpp, + tests/XMLStringTest.cpp, tests/check-conv, tests/create-makefile, + tests/normalize.xsl: + updated year in copyright statements to 2016 + + * .travis.yml, configure.ac, src/Doxyfile: + set version to 1.14.1 + +2015-12-31 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: + reset PS graphics state at end of every DVI page + +2015-12-28 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml, configure.ac, src/Doxyfile: + set version to 1.14 + + * NEWS: + updated NEWS + +2015-12-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + added evaluation of PSTricks specials 'pst:' and 'PST:' + +2015-12-26 Martin Gieseking <martin.gieseking@uos.de> + + * src/FileFinder.cpp: + lookup files in the current working directory before searching the texmf + tree + + * src/GraphicsPath.h, tests/GraphicsPathTest.cpp: + fixed memory issue in class GraphicsPath<T> + +2015-12-17 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/EPSToSVG.h, + src/PSPreviewFilter.cpp, src/PSPreviewFilter.h, src/PsSpecialHandler.cpp, + src/SpecialActions.h, src/dvisvgm.cpp: + added option --bbox=preview; adapt preview data if --bbox=min + +2015-12-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/FileFinder.cpp: + return entire kpathsea version string if it doesn't start with + 'kpathsea' + + * tests/GhostscriptTest.cpp: + prevent opening a graphics window when running GhostscriptTest + +2015-12-08 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml, configure.ac, src/Doxyfile: + set version to 1.13 + + * NEWS: + updated NEWS + + * clipper/clipper.cpp, clipper/clipper.hpp: + replaced DOS line endings of the Clipper sources to Unix ones + +2015-12-02 Martin Gieseking <martin.gieseking@uos.de> + + * src/Font.cpp, src/Font.h, src/Glyph.h, src/GraphicPath.h, + src/GraphicsPath.h, src/Makefile.am, src/PathClipper.h, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/ShadingPatch.h, + src/TensorProductPatch.cpp, src/TensorProductPatch.h, + src/TpicSpecialHandler.cpp, src/TriangularPatch.cpp, + src/TriangularPatch.h, tests/GraphicPathTest.cpp, + tests/GraphicsPathTest.cpp, tests/Makefile.am, + tests/TensorProductPatchTest.cpp, tests/TriangularPatchTest.cpp: + renamed class GraphicPath to GraphicsPath + +2015-11-30 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in: + added a couple of links to the manpage + + * src/GraphicPath.h, src/PsSpecialHandler.cpp: + remove redundant moveto commands from graphics paths + +2015-11-25 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVGActions.cpp, src/EPSToSVG.cpp: + remove progress message before printing a PS error message + + * src/DVIToSVGActions.cpp, src/DVIToSVGActions.h: + removed redundant methods + +2015-11-24 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + added evaluation of PS operators ashow, awidthshow, and widthshow (fixes + #49) + + * xxHash/xxhash.c: + updated xxHash to version r42 + +2015-11-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp, src/psdefs.cpp: + minor code cleanup and reordering + + * src/psdefs.cpp: + reduce rounding errors produced by PS operator 'charpath' + + * src/psdefs.cpp: + propagate call of PS operator 'setcolor' to the PS handler + +2015-11-18 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml, configure.ac, src/Doxyfile: + set version to 1.12 + + * NEWS: + updated NEWS + +2015-11-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontManager.cpp: + removed redundant #include + + * src/FontEngine.cpp: + treat character code as character index if no font mapping is set + +2015-11-12 Martin Gieseking <martin.gieseking@uos.de> + + * README, README.md: + updated links to Google Test framework + +2015-11-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, + src/HtmlSpecialHandler.cpp, tests/ColorTest.cpp: + renamed Color::setName() to Color::setPSName() + + * tests/Makefile.am, tests/ShadingPatch.cpp, tests/ShadingPatchTest.cpp: + renamed ShadingPatchTest + + * doc/dvisvgm.txt.in, src/Color.cpp, src/Color.h, src/CommandLine.cpp, + src/CommandLine.h, src/DVIToSVGActions.cpp, + src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, + src/HtmlSpecialHandler.cpp, src/PSPattern.cpp, src/PsSpecialHandler.cpp, + src/SVGTree.cpp, src/TpicSpecialHandler.cpp, src/dvisvgm.cpp, + src/options.xml, tests/ColorTest.cpp: + added option --colornames to replace RGB color values with SVG color + names + +2015-10-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/Process.cpp, src/Process.h: + fixed invalid access to freed string memory + +2015-10-06 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in: + minor improvements of the manual page + +2015-09-21 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, README, README.md: + updated NEWS and README files + +2015-09-18 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml, configure.ac, src/Doxyfile: + set version to 1.11 + +2015-09-14 Martin Gieseking <martin.gieseking@uos.de> + + * src/Font.cpp, src/ToUnicodeMap.cpp, src/Unicode.cpp, src/Unicode.h, + tests/UnicodeTest.cpp: + improved handling of invalid Unicode points + + * src/Font.cpp, src/Unicode.cpp, src/Unicode.h, tests/UnicodeTest.cpp: + renamed Unicode::psName2Codepoint to Unicode::psNameToCodepoint + +2015-09-10 Martin Gieseking <martin.gieseking@uos.de> + + * src/Font.cpp: + prevent creating 0x00 codepoints if PS character name is unknown + + * src/HtmlSpecialHandler.cpp: + quote XML metacharacters in xlink:title attributes + + * src/CmdLineParserBase.h, src/InputReader.h: + changed 'struct InputReader' to 'class InputReader' + +2015-09-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/SVGTree.cpp: + force creating a new text element after appending a different node to + the page + +2015-08-13 Martin Gieseking <martin.gieseking@uos.de> + + * README, README.md: + minor updates to README and README.md + +2015-07-29 Martin Gieseking <martin.gieseking@uos.de> + + * tests/GhostscriptTest.cpp, tests/Makefile.am: + added GhostscriptTest + + * tests/UnicodeTest.cpp: + improved UnicodeTest + + * tests/CommandLineTest.cpp, tests/MessageExceptionTest.cpp: + use ASSERT_STREQ in tests + +2015-07-22 Martin Gieseking <martin.gieseking@uos.de> + + * README, README.md, doc/dvisvgm.txt.in: + updated links to project website again (relocated to + dvisvgm.bplaced.net) + +2015-07-20 Martin Gieseking <martin.gieseking@uos.de> + + * README, README.md, doc/dvisvgm.txt.in: + updated info about new project website + +2015-07-14 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml, configure.ac, src/Doxyfile: + set version to 1.10 + + * NEWS: + updated NEWS + +2015-07-12 Martin Gieseking <martin.gieseking@uos.de> + + * README.md, doc/dvisvgm.txt.in, src/BasicDVIReader.cpp, + src/BasicDVIReader.h, src/DVIReader.cpp, src/DVIReader.h, src/Font.h, + src/FontManager.cpp, src/FontManager.h: + added support for new XDV format 6 + +2015-07-11 Martin Gieseking <martin.gieseking@uos.de> + + * README, README.md: + updated README + +2015-07-03 Martin Gieseking <martin.gieseking@uos.de> + + * src/dvisvgm.cpp: + check for option --help before initializing the FileFinder + + * src/MiKTeXCom.cpp: + added some comments to MiKTeXCom.cpp + +2015-07-02 Martin Gieseking <martin.gieseking@uos.de> + + * tests/BezierTest.cpp: + removed #include "debug.h" from test + + * Makefile.am, configure.ac, xxHash/LICENSE, xxHash/Makefile.am, + xxHash/xxhash.c, xxHash/xxhash.h: + added xxHash library (https://github.com/Cyan4973/xxHash) + + * src/Font.cpp, src/Makefile.am, src/Unicode.cpp, src/Unicode.h, + tests/Makefile.am, tests/create-makefile: + added mapping from character names to unicode for PostScript fonts + +2015-04-07 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml, configure.ac, src/Doxyfile: + set version to 1.9.2 + + * NEWS, README.md: + updated NEWS and README.md + + * src/SVGTree.cpp: + apply --precision settings to font-size attributes too + +2015-04-04 Martin Gieseking <martin.gieseking@uos.de> + + * tests/SVGOutputTest.cpp: + remove output files created by SVGOutputTest::getPageStream() + +2015-04-02 Martin Gieseking <martin.gieseking@uos.de> + + * README.md: + minor additions to README.md + +2015-03-26 Martin Gieseking <martin.gieseking@uos.de> + + * src/GlyphTracerMessages.h: + always skip tracer message if no glyphs have been traced + + * src/GFReader.cpp, src/GFReader.h, tests/GFReaderTest.cpp: + improved GFReaderTest + +2015-03-25 Martin Gieseking <martin.gieseking@uos.de> + + * src/GFGlyphTracer.cpp, src/GFTracer.h, tests/GFGlyphTracerTest.cpp, + tests/Makefile.am: + ensure GFGlyphTracer::executeChar() returns the correct status; added + GFGlyphtracerTest + + * src/DVIToSVG.cpp: + avoid retracing of fonts if option --no-fonts is given + +2015-03-22 Martin Gieseking <martin.gieseking@uos.de> + + * tests/StreamWriterTest.cpp: + fixed StreamWriterTest + + * tests/SVGOutputTest.cpp: + improved SVGOutputTest + +2015-03-19 Martin Gieseking <martin.gieseking@uos.de> + + * tests/Makefile.am, tests/ShadingPatch.cpp: + added ShadingPatchTest + +2015-03-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/ShadingPatch.h, src/TensorProductPatch.cpp, + src/TensorProductPatch.h, src/TriangularPatch.cpp, src/TriangularPatch.h, + tests/Makefile.am, tests/TriangularPatchTest.cpp: + added test for class TriangularPatch + + * src/Bezier.cpp, src/Bezier.h, src/TensorProductPatch.cpp, + src/TriangularPatch.cpp, src/TriangularPatch.h, + tests/TriangularPatchTest.cpp: + renamed method pointAt() of class Bezier and TriangularPatch to + valueAt() + + * src/TensorProductPatch.h, tests/TensorProductPatchTest.cpp: + improved TensorProductPatchTest + +2015-03-17 Martin Gieseking <martin.gieseking@uos.de> + + * m4/ax_code_coverage.m4: + added missing file ax_code_coverage.m4 + + * autogen.sh: + updated autogen.sh + +2015-03-15 Martin Gieseking <martin.gieseking@uos.de> + + * src/XMLNode.cpp, src/XMLNode.h, tests/Makefile.am, + tests/XMLNodeTest.cpp: + fixed a few issues in class XMLElementNode; added XMLNodeTest + + * .gitignore, Makefile.am, clipper/Makefile.am, configure.ac, + src/Makefile.am, tests/Makefile.am, tests/create-makefile: + extended build system to generate coverage reports + + * tests/Makefile.am, tests/VectorIteratorTest.cpp: + added VectorIteratorTest + +2015-03-13 Martin Gieseking <martin.gieseking@uos.de> + + * tests/XMLStringTest.cpp: + fixed test class name of XMLString + +2015-03-09 Martin Gieseking <martin.gieseking@uos.de> + + * tests/CRC32Test.cpp: + added test for 'compute' methods of class CRC32 + + * tests/GraphicPathTest.cpp: + extended tests of class GraphicPath + +2015-03-08 Martin Gieseking <martin.gieseking@uos.de> + + * src/Unicode.cpp, tests/Makefile.am, tests/UnicodeTest.cpp: + fixed UTF-8 encoding of 0xfffe and 0xffff; added UnicodeTest + + * tests/StreamReaderTest.cpp: + exteded StreamReader tests + +2015-03-07 Martin Gieseking <martin.gieseking@uos.de> + + * src/XMLString.cpp, tests/Makefile.am, tests/XMLStringTest.cpp: + fixed conversion from C and C++ strings to XMLString; added + XMLStringTest + + * .gitignore: + added .gitignore + +2015-03-06 Martin Gieseking <martin.gieseking@uos.de> + + * src/Bitmap.cpp, src/Bitmap.h, tests/BitmapTest.cpp, + tests/GFReaderTest.cpp, tests/Makefile.am: + small refactorings of class Bitmap; added tests for class Bitmap + + * src/BoundingBox.cpp, src/BoundingBox.h, tests/BoundingBoxTest.cpp: + improved BoundingBox tests + +2015-03-04 Martin Gieseking <martin.gieseking@uos.de> + + * src/Bezier.cpp, src/BoundingBox.cpp, src/BoundingBox.h, + tests/BezierTest.cpp, tests/Makefile.am: + fixed Bezier::reduceDegree() for degree 1 and added BezierTest class + +2015-03-01 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml: + Travis conf: added configuration data for Coverity Scan + + * README.md: + added license badge to README.md + +2015-02-28 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, README.md: + updated NEWS and README.md + +2015-02-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/Calculator.cpp: + replaced while(1) with for(;;) for consistency + +2015-02-26 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, src/Doxyfile: + set version to 1.9.1 + +2015-02-25 Martin Gieseking <martin.gieseking@uos.de> + + * src/Ghostscript.cpp: + disable lookup of GS library in Windows registry for old gcc versions + +2015-02-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVG.cpp, src/EPSToSVG.cpp, src/Makefile.am, src/SVGOutput.cpp, + src/SVGOutput.h, src/SVGOutputBase.h, src/dvisvgm.cpp: + moved class SVGOutput to separate compilation unit + + * doc/dvisvgm.txt.in, src/SVGOutput.cpp, src/SVGOutput.h, + tests/Makefile.am, tests/SVGOutputTest.cpp, tests/create-makefile: + added width specifiers and exression evaluation to --output patterns + + * doc/dvisvgm.txt.in: + minor additions and formatting changes of the manpage + + * doc/Makefile.am, doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, + doc/dvisvgm.sty, doc/dvisvgm.xpr, doc/tweak-dblatex-pdf.xsl: + improved the layout of the pdf manpage + + * doc/Makefile.am, doc/db2html.xsl, doc/dvisvgm.css: + create html manpage with a separate stylesheet matching the new website + theme + +2015-02-19 Martin Gieseking <martin.gieseking@uos.de> + + * .travis.yml: + added configuration file for Travis CI + + * .travis.yml: + added dependency 'python-lxml' to Travis configuration + + * .travis.yml: + added dependency 'libgtest-dev' to Travis configuration; ensure call of + 'make check' + + * .travis.yml: + Travis conf: added missing call of 'configure' + + * .travis.yml: + Travis conf: build gtest libraries since Ubuntu doesn't provide the + binaries + +2015-02-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/TpicSpecialHandler.cpp: + use constant M_PI rather than computing PI locally + +2015-02-17 Martin Gieseking <martin.gieseking@uos.de> + + * README, README.md: + updated README and README.md + +2015-01-26 Martin Gieseking <martin.gieseking@uos.de> + + * src/ShadingPatch.h: + removed redundant methods from class ShadingPatch + +2015-01-21 Martin Gieseking <martin.gieseking@uos.de> + + * src/TensorProductPatch.cpp, src/TriangularPatch.cpp: + renamed static helper function clip() to snap() + +2015-01-15 Martin Gieseking <martin.gieseking@uos.de> + + * src/Color.cpp: + resolved ambiguous call of pow (patch by Peter Breitenlohner) + +2015-01-12 Martin Gieseking <martin.gieseking@uos.de> + + * src/VectorIterator.h: + removed redundant method VectorIterator::distanceToLast() + +2014-12-30 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile.am, README, README.md, configure.ac, doc/Makefile.am, + doc/dvisvgm.txt.in, src/BasicDVIReader.cpp, src/BasicDVIReader.h, + src/Bezier.cpp, src/Bezier.h, src/BgColorSpecialHandler.cpp, + src/BgColorSpecialHandler.h, src/Bitmap.cpp, src/Bitmap.h, + src/BoundingBox.cpp, src/BoundingBox.h, src/CMap.cpp, src/CMap.h, + src/CMapManager.cpp, src/CMapManager.h, src/CMapReader.cpp, + src/CMapReader.h, src/CRC32.cpp, src/CRC32.h, src/Calculator.cpp, + src/Calculator.h, src/CharMapID.cpp, src/CharMapID.h, src/Character.h, + src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Color.cpp, + src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, + src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DLLoader.h, + src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, + src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, + src/DependencyGraph.h, src/Directory.cpp, src/Directory.h, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, + src/EPSFile.cpp, src/EPSFile.h, src/EPSToSVG.cpp, src/EPSToSVG.h, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/EncFile.cpp, + src/EncFile.h, src/FileFinder.cpp, src/FileFinder.h, src/FilePath.cpp, + src/FilePath.h, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, + src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEncoding.cpp, + src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, + src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, + src/FontMetrics.cpp, src/FontMetrics.h, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, + src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/Glyph.h, + src/GlyphTracerMessages.h, src/GraphicPath.h, src/HtmlSpecialHandler.cpp, + src/HtmlSpecialHandler.h, src/InputBuffer.cpp, src/InputBuffer.h, + src/InputReader.cpp, src/InputReader.h, src/JFM.cpp, src/JFM.h, + src/Length.cpp, src/Length.h, src/Makefile.am, src/MapLine.cpp, + src/MapLine.h, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, + src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, + src/MetafontWrapper.h, src/MiKTeXCom.cpp, src/MiKTeXCom.h, + src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.h, + src/NumericRanges.h, src/PSFilter.h, src/PSInterpreter.cpp, + src/PSInterpreter.h, src/PSPattern.cpp, src/PSPattern.h, + src/PSPreviewFilter.cpp, src/PSPreviewFilter.h, src/PageRanges.cpp, + src/PageRanges.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, + src/PathClipper.cpp, src/PathClipper.h, src/PdfSpecialHandler.cpp, + src/PdfSpecialHandler.h, src/PreScanDVIReader.cpp, + src/PreScanDVIReader.h, src/Process.cpp, src/Process.h, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/RangeMap.cpp, + src/RangeMap.h, src/SVGOutputBase.h, src/SVGTree.cpp, src/SVGTree.h, + src/ShadingPatch.cpp, src/ShadingPatch.h, src/SignalHandler.cpp, + src/SignalHandler.h, src/SpecialActions.h, src/SpecialHandler.h, + src/SpecialManager.cpp, src/SpecialManager.h, src/StreamReader.cpp, + src/StreamReader.h, src/StreamWriter.cpp, src/StreamWriter.h, + src/Subfont.cpp, src/Subfont.h, src/System.cpp, src/System.h, + src/TFM.cpp, src/TFM.h, src/TensorProductPatch.cpp, + src/TensorProductPatch.h, src/Terminal.cpp, src/Terminal.h, + src/ToUnicodeMap.cpp, src/ToUnicodeMap.h, src/TpicSpecialHandler.cpp, + src/TpicSpecialHandler.h, src/TriangularPatch.cpp, src/TriangularPatch.h, + src/Unicode.cpp, src/Unicode.h, src/VFActions.h, src/VFReader.cpp, + src/VFReader.h, src/VectorIterator.h, src/VectorStream.h, + src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, + src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, + src/options.dtd, src/options.xml, src/psdefs.cpp, src/types.h, + tests/BoundingBoxTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, + tests/CRC32Test.cpp, tests/CalculatorTest.cpp, + tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, + tests/CommandLineTest.cpp, tests/DependencyGraphTest.cpp, + tests/DirectoryTest.cpp, tests/DvisvgmSpecialTest.cpp, + tests/FileFinderTest.cpp, tests/FilePathTest.cpp, + tests/FileSystemTest.cpp, tests/FontManagerTest.cpp, + tests/FontMapTest.cpp, tests/GFReaderTest.cpp, tests/GraphicPathTest.cpp, + tests/LengthTest.cpp, tests/Makefile.am, tests/MapLineTest.cpp, + tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, + tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, + tests/PageSizeTest.cpp, tests/PairTest.cpp, tests/RangeMapTest.cpp, + tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, + tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, + tests/SubfontTest.cpp, tests/TensorProductPatchTest.cpp, + tests/ToUnicodeMapTest.cpp, tests/TypesTest.cpp, + tests/VectorStreamTest.cpp, tests/check-conv, tests/create-makefile, + tests/normalize.xsl: + updated year in copyright statements to 2015 + +2014-12-28 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/ShadingPatch.h, + src/TensorProductPatch.cpp, src/TensorProductPatch.h, + src/TriangularPatch.cpp, src/TriangularPatch.h, src/dvisvgm.cpp, + src/options.xml: + added command-line options --grad-overlap, --grad-segments, and + --grad-simplify + + * src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/EPSToSVG.cpp, + src/EPSToSVG.h, src/SpecialActions.h, src/SpecialManager.cpp, + src/dvisvgm.cpp: + show PS instruction counter when processing EPS files with option + --progress + + * src/dvisvgm.cpp: + clear line before printing the message about user interruption to avoid + trailing text fragments + + * configure.ac, src/Doxyfile: + set version to 1.9 + + * NEWS: + updated NEWS + +2014-12-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp: + check validity of DVI file before trying to collect the BOPs + +2014-12-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/Makefile.am, src/TriangularPatch.cpp, src/TriangularPatch.h: + added class to compute triangular shading patches + + * src/Makefile.am, src/PsSpecialHandler.cpp, src/ShadingPatch.cpp, + src/ShadingPatch.h, src/TensorProductPatch.cpp, src/TensorProductPatch.h: + extracted common interface class ShadingPatch from TensorProductPatch + + * src/Color.cpp, src/Color.h, src/Makefile.am, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/VectorIterator.h, src/psdefs.cpp: + extended PS operator 'shfill' to support triangular patch meshes + +2014-12-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: + added processing of the optional 'BBox' entry in a PS shading dictionary + +2014-12-03 Martin Gieseking <martin.gieseking@uos.de> + + * src/CommandLine.cpp, src/CommandLine.h, src/dvisvgm.cpp, + src/options.xml: + disable option --clipjoin if PS support is disabled + + * src/Color.cpp, tests/ColorSpecialTest.cpp, tests/ColorTest.cpp: + fixed CMYK to RGB approximation + +2014-11-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/psdefs.cpp, tests/PSInterpreterTest.cpp: + added evaluation of PS operator shfill (Coons and tensor product patches + only) + +2014-11-24 Martin Gieseking <martin.gieseking@uos.de> + + * README.md: + added list of features and a download button to README.md + +2014-11-09 Martin Gieseking <martin.gieseking@uos.de> + + * clipper/clipper.cpp, clipper/clipper.hpp: + updated clipper library to version 6.2.1 + +2014-11-08 Martin Gieseking <martin.gieseking@uos.de> + + * src/Bezier.cpp, src/Bezier.h, src/BoundingBox.h, src/GraphicPath.h, + src/Makefile.am, src/TensorProductPatch.cpp, src/TensorProductPatch.h, + tests/Makefile.am, tests/TensorProductPatchTest.cpp: + added code to compute tensor-product patches required for gradient fills + +2014-11-06 Martin Gieseking <martin.gieseking@uos.de> + + * src/Matrix.cpp: + use constant M_PI rather than defining PI locally + +2014-10-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, + src/PsSpecialHandler.cpp, tests/ColorTest.cpp: + replaced float by double in class Color + + * src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, + src/DVIReader.cpp, src/HtmlSpecialHandler.cpp, src/PsSpecialHandler.cpp, + tests/ColorTest.cpp: + renamed RGB setters/getters of class Color + + * src/Color.cpp, src/Color.h: + replaced vectors with valarrays in class Color + + * src/Color.cpp, src/Color.h, tests/ColorTest.cpp: + added deltaE and L*a*b* color space methods to class Color + +2014-10-17 Martin Gieseking <martin.gieseking@uos.de> + + * clipper/clipper.cpp, clipper/clipper.hpp: + updated clipper library to version 6.2.0 + + * src/GraphicPath.h, src/PathClipper.cpp, src/PathClipper.h, + src/XMLNode.h: + fixed a couple of doxygen comments; removed redundant + PathClipperException + +2014-10-08 Martin Gieseking <martin.gieseking@uos.de> + + * src/CommandLine.cpp: + updated CommandLine.cpp with description of option --no-merge + + * src/Ghostscript.cpp: + try to lookup the location of the GS DLL in the Windows registry + +2014-10-01 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/options.xml: + added info about option --no-merge to the manpage + +2014-09-24 Khaled Hosny <khaled.hosny@hindawi.com> + + * src/Makefile.am: + Add an opt2cpp Python script + +A very ugly script that should work as a + drop in replacement for the +opt2cpp XSLT. + +2014-09-15 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: + ensure that colors set by a color special are always considered by the + PS handler + +2014-09-10 Martin Gieseking <martin.gieseking@uos.de> + + * src/BasicDVIReader.cpp, src/DVIReader.cpp, src/FontCache.cpp, + src/GFReader.cpp, src/dvisvgm.cpp: + replaced namespace 'ios_base' with 'ios' + +2014-08-29 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + added missing whitespace boundaries in PS code + + * src/FontEngine.cpp, tests/PageRagesTest.cpp: + removed unused static functions + + * configure.ac, src/Doxyfile: + set version to 1.8.1 + + * NEWS: + updated NEWS + +2014-08-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVG.cpp, src/DependencyGraph.h, src/Makefile.am, + src/SVGTree.cpp, src/SVGTree.h, src/XMLNode.cpp, src/XMLNode.h, + tests/DependencyGraphTest.cpp, tests/Makefile.am: + remove redundant clipPath elements from generated SVG files + +2014-08-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/PSPattern.cpp, src/XMLNode.cpp, src/XMLNode.h: + renamed XMLElementNode::findDescendants() and made it constant + +2014-08-11 Martin Gieseking <martin.gieseking@uos.de> + + * tests/Makefile.am, tests/create-makefile: + link tests against FreeType library + + * README.md: + minor fixed to README.md + +2014-08-10 Khaled Hosny <khaledhosny@eglug.org> + + * configure.ac, src/Makefile.am: + Don't override CXXFLAGS in configure script + +Breaks standard things + like: + + make CXXFLAGS="-g -O0 -pg" + + * configure.ac, src/Makefile.am: + Don't override CPPFLAGS and LDFLAGS in configure + +For the same reasons + as the previous commit + +2014-08-07 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/dvisvgm.cpp: + removed old code that moved cache files to new location + + * src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h: + removed unused emit() methods from XML classes + +2014-07-31 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/PsSpecialHandler.cpp, src/psdefs.cpp: + prevent side-effects caused by bop/eop operators present in PS specials + +2014-07-29 Martin Gieseking <mgieseki@users.sourceforge.net> + + * NEWS: + updated NEWS + +2014-07-28 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/GraphicPath.h, src/PSInterpreter.cpp, src/PSInterpreter.h, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/psdefs.cpp, + tests/PSInterpreterTest.cpp: + added evaluation of PS operator 'clippath' (copies clipping path into + graphics path) + + * configure.ac, src/Doxyfile: + set version to 1.8 + +2014-07-26 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Font.cpp, src/GFGlyphTracer.cpp, src/GraphicPath.h, + src/PsSpecialHandler.cpp: + renamed GraphicPath::newpath() to GraphicPath::clear() + +2014-07-24 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/InputReader.cpp, src/PSInterpreter.cpp: + ensure that InputReader::compare() checks whole and not just partial + words + +2014-07-22 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVG.h, src/dvisvgm.cpp: + prevent throwing a DVIException when option -l is present + + * Makefile.am, clipper/License.txt, clipper/Makefile.am, + clipper/clipper.cpp, clipper/clipper.hpp, configure.ac, src/Makefile.am: + added slightly modified sources of clipper library (computes boolops on + polygons) + + * src/GraphicPath.h: + added field to store the winding rule to class GraphicPath + + * README, README.md, src/Bezier.cpp, src/Bezier.h, src/GraphicPath.h, + src/Makefile.am, src/PathClipper.cpp, src/PathClipper.h, src/dvisvgm.cpp: + added class PathClipper to compute intersections of closed curved + graphics paths + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/dvisvgm.cpp, + src/options.xml: + added option --clippath to compute the intersection of clipping paths + +2014-07-20 Khaled Hosny <khaledhosny@eglug.org> + + * src/FontEngine.cpp: + Free existing FT_Face before creating a new one + +FontEngine was never + destroying the FT_Face's it creates, except the +very last one that was + destroyed by the destructor. For some reason, +this was causing + FT_New_Face() to fail on Windows after processing the +first hundred or so + pages of DVI files. + +2014-07-18 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/GraphicPath.h, src/PsSpecialHandler.cpp, src/SVGTree.cpp, + src/SVGTree.h, src/dvisvgm.cpp, src/options.xml, + tests/GraphicPathTest.cpp: + added option to create relative rather than absolute path commands + + * src/TpicSpecialHandler.cpp: + TPIC handler: use class GraphicPath to create SVG path commands + +2014-07-07 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVGActions.h, src/Doxyfile, src/HtmlSpecialHandler.h, + src/RangeMap.cpp, src/SpecialManager.cpp, src/ToUnicodeMap.cpp: + fixed a couple of broken doxygen comments + +2014-06-25 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Ghostscript.cpp: + get proper name of Ghostscript library when building for Cygwin + +2014-06-23 Martin Gieseking <mgieseki@users.sourceforge.net> + + * README.md: + added markdown version of README + +2014-06-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + suppress output of PS operator ':show' to prevent the creation of + additional graphic elements + +2014-06-17 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/SpecialManager.cpp, src/SpecialManager.h: + removed redundant method SpecialManager::leavePSHeaderSection() + + * doc/dvisvgm.txt.in, src/DVIToSVGActions.cpp, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, + tests/DvisvgmSpecialTest.cpp, tests/Makefile.am: + added/improved dvisvgm::raw* specials + + * src/InputReader.cpp: + added missing include + + * configure.ac, src/Doxyfile: + set version to 1.7 + + * NEWS: + updated NEWS + +2014-06-12 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/XMLNode.cpp, src/XMLNode.h: + added clear() to XMLNode classes; added XMLTextNode::getText() + +2014-06-11 Martin Gieseking <martin.gieseking@uos.de> + + * src/InputReader.cpp, src/InputReader.h: + added InputReader::getLine() + + * src/DVIToSVG.cpp, src/SpecialHandler.h, src/SpecialManager.cpp, + src/SpecialManager.h: + added listener to allow SpecialHandlers being notified when + pre-processing has finished + +2014-06-10 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/SpecialActions.h, tests/ColorSpecialTest.cpp: + renamed class SpecialEmptyActions to EmptySpecialActions + +2014-06-09 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIReader.cpp, src/Ghostscript.cpp: + removed unused variable; call Ghostscript::exit() with explicitely given + object + + * src/DVIToSVG.h, src/SpecialManager.h: + removed redundant definition of assignment operators + +2014-06-05 Martin Gieseking <martin.gieseking@uos.de> + + * src/BasicDVIReader.cpp, src/BasicDVIReader.h, src/DVIReader.cpp, + src/DVIReader.h, src/Makefile.am: + moved basic funtionality of DVIReader to base class BasicDVIReader + + * src/BasicDVIReader.h, src/DVIReader.cpp, src/DVIToSVG.cpp, + src/DVIToSVG.h, src/dvisvgm.cpp: + moved call of executePreamble() and executePostamble() from DVIToSVG to + DVIReader + + * src/DVIActions.h, src/DVIReader.cpp, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Makefile.am, + src/PreScanDVIReader.cpp, src/PreScanDVIReader.h, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SpecialHandler.h, + src/SpecialManager.cpp, src/SpecialManager.h, src/StreamReader.cpp, + src/StreamReader.h: + pre-process DVI file to collect required data not present in the page + ranges to be converted + + * src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, + src/SpecialManager.cpp, src/SpecialManager.h, src/dvisvgm.cpp: + made class SpecialManager a singleton + + * src/BasicDVIReader.h, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h: + allow to replace the DVI reader assigned to an instance of + DVIToSVGActions + + * doc/dvisvgm.txt.in, src/BasicDVIReader.h, src/DVIToSVG.cpp, + src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, + src/EPSToSVG.cpp, src/EPSToSVG.h, src/HtmlSpecialHandler.cpp, + src/HtmlSpecialHandler.h, src/PreScanDVIReader.cpp, + src/PreScanDVIReader.h, src/SpecialActions.h: + process hyperref anchors and links across pages + + * src/BasicDVIReader.cpp, src/BasicDVIReader.h, src/Bitmap.h, + src/BoundingBox.h, src/CMap.h, src/CMapManager.cpp, src/CMapManager.h, + src/CMapReader.h, src/CRC32.h, src/Calculator.cpp, src/Calculator.h, + src/CmdLineParserBase.h, src/Color.cpp, src/ColorSpecialHandler.cpp, + src/ColorSpecialHandler.h, src/CommandLine.cpp, src/CommandLine.h, + src/DLLoader.h, src/DVIReader.cpp, src/DVIToSVG.h, src/DVIToSVGActions.h, + src/Directory.h, src/DvisvgmSpecialHandler.h, src/EmSpecialHandler.cpp, + src/EmSpecialHandler.h, src/EncFile.h, src/FileFinder.h, + src/FileSystem.cpp, src/Font.cpp, src/Font.h, src/FontCache.h, + src/FontEncoding.cpp, src/FontEngine.cpp, src/FontEngine.h, + src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, + src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, + src/GFReader.h, src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, + src/GraphicPath.h, src/HtmlSpecialHandler.h, src/InputBuffer.cpp, + src/InputBuffer.h, src/JFM.h, src/Length.cpp, src/Length.h, + src/MapLine.cpp, src/MapLine.h, src/Matrix.cpp, src/Matrix.h, + src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, + src/NoPsSpecialHandler.h, src/NumericRanges.h, src/PSInterpreter.h, + src/PSPattern.h, src/PSPreviewFilter.h, src/PageRanges.h, src/PageSize.h, + src/Pair.h, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.h, + src/Process.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, + src/SVGTree.h, src/SignalHandler.h, src/SpecialActions.h, + src/SpecialManager.h, src/StreamWriter.h, src/Subfont.cpp, src/Subfont.h, + src/TFM.h, src/ToUnicodeMap.h, src/TpicSpecialHandler.cpp, + src/TpicSpecialHandler.h, src/VFReader.cpp, src/VectorStream.h, + src/XMLDocument.h, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, + src/dvisvgm.cpp, src/types.h: + replaced leading spaces by tabs; removed trailing whitespace + +2014-06-03 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIReader.cpp, src/DVIReader.h: + removed redundant variable DVIReader::_prevBop + + * src/PsSpecialHandler.cpp: + fixed incorrect extent values shown when applying a preview bbox + (bp->pt) + +2014-06-01 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/EPSFile.cpp, src/GFReader.cpp: + replaced relative variant of seekg() by absolute one where possible + + * src/DVIReader.cpp, src/DVIReader.h: + removed redundant code from DVIReader::evalCommand() + +2014-05-31 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIReader.cpp, src/VFReader.cpp: + few code adjustments + + * src/DVIReader.cpp, src/StreamReader.cpp, src/StreamReader.h, + src/VFReader.cpp: + removed StreamReader::in() + + * src/DVIReader.cpp, src/StreamReader.h, src/VFReader.cpp: + renamed some methods of class StreamReader + +2014-05-29 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIReader.cpp, src/DVIReader.h, src/StreamReader.h: + collect all DVI BOP offsets to reach them quickly + + * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h: + removed DVIReader::_totalPages; use number of BOP offsets instead + + * src/DVIReader.cpp, src/DVIReader.h, src/dvisvgm.cpp: + simplified computation of progress ratio + + * src/DVIReader.cpp, src/DVIReader.h: + simplified DVIReader::executePage; removed DVIReader::executePages + +2014-05-22 Martin Gieseking <martin.gieseking@uos.de> + + * src/Font.cpp, src/Makefile.am, src/Unicode.cpp, src/Unicode.h, + src/XMLString.cpp: + moved unicode-related funtions to separate class + + * src/CharMap.cpp, src/CharMap.h, src/Font.cpp, src/FontEngine.cpp, + src/FontEngine.h: + removed redundant method CharMap::invert() + + * src/CMap.cpp, src/CMap.h, src/Makefile.am, src/RangeMap.cpp, + src/RangeMap.h, tests/Makefile.am, tests/RangeMapTest.cpp: + extracted class RangeMap previously implemented as part of SegmentedCMap + + * src/RangeMap.cpp: + fixed right joins of touching ranges in a RangeMap + + * src/CharMap.cpp, src/CharMap.h, src/Font.cpp, src/Font.h, + src/FontEngine.cpp, src/FontEngine.h, src/Makefile.am: + replaced class CharMap with more generic class RangeMap + + * src/DVIToSVG.cpp, src/Makefile.am, src/NumericRanges.h, + src/PageRanges.cpp, src/PageRanges.h, tests/PageRagesTest.cpp: + extracted functionality of class PageRanges to separate class + NumericRanges + + * src/Makefile.am, src/RangeMap.h, src/ToUnicodeMap.cpp, + src/ToUnicodeMap.h, tests/Makefile.am, tests/ToUnicodeMapTest.cpp: + added class ToUnicodeMap to handle mappings from character indexes to + unicode points + + * src/Makefile.am: + Makefile: put source files on separate lines + +2014-04-30 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/CharMapID.cpp, src/CharMapID.h, src/DVIReader.cpp, src/Font.cpp, + src/Font.h, src/FontEngine.cpp, src/FontEngine.h: + try to add unicode mappings missing in a font's cmap table + +2014-04-29 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/SVGTree.cpp: + don't add unnecessary element 'missing-glyph' to SVG files + +2014-04-24 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/options.xml: + renamed argument of option --linkmark from 'type' to 'style' + +2014-04-23 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/System.h: + removed redundant semicolon + +2014-04-22 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, src/Doxyfile: + set version to 1.6 + + * NEWS: + updated NEWS + +2014-04-21 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/EPSToSVG.cpp: + removed date and machine triplet from generated SVG files + +2014-04-18 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/dvisvgm.txt.in, src/HtmlSpecialHandler.cpp, + src/HtmlSpecialHandler.h: + added optional selection of line/box colors to option --linkmark + +2014-04-17 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/CommandLine.h, src/DVIToSVG.cpp, src/EPSToSVG.cpp: + don't link GS messages unnecessarily if HAVE_LIBGS is defined + + * src/DVIReader.h, src/DVIToSVGActions.h, src/HtmlSpecialHandler.cpp, + src/HtmlSpecialHandler.h, src/SpecialActions.h: + only split hyperlink boxes on line breaks + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/options.xml: + changed default argument of option --linkmark to 'box' + +2014-04-16 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DLLoader.cpp: + prevent calling dlopen() if the length of the string argument is 0 + + * doc/dvisvgm.txt.in, src/Ghostscript.cpp: + if libgs is loaded during runtime, look for libgs.so.X instead of + libgs.so + + * src/Ghostscript.cpp, src/dvisvgm.cpp: + moved lookup of MiKTeX's GS DLL to get_libgs() + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/SVGTree.cpp, src/SVGTree.h, src/dvisvgm.cpp, src/options.xml: + added command-line option --zoom + +2014-04-11 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/CMap.cpp, src/CmdLineParserBase.cpp, src/ColorSpecialHandler.cpp, + src/DVIReader.cpp, src/DVIToSVGActions.cpp, src/Doxyfile, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, + src/EPSFile.cpp, src/EmSpecialHandler.cpp, src/FileFinder.cpp, + src/FileSystem.cpp, src/Font.cpp, src/FontCache.cpp, src/FontEncoding.h, + src/FontEngine.cpp, src/FontMap.cpp, src/GraphicPath.h, + src/PSInterpreter.cpp, src/PageRanges.cpp, src/PsSpecialHandler.cpp, + src/SVGTree.cpp, src/SVGTree.h, src/SpecialManager.cpp, src/Subfont.cpp, + src/TFM.cpp, src/TpicSpecialHandler.cpp, src/XMLDocument.cpp, + src/XMLNode.cpp, src/dvisvgm.cpp: + fixed issues in the doxygen documentation + + * configure.ac, src/Doxyfile: + set version to 1.5.3 + + * NEWS: + updated NEWS + +2014-04-09 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVGActions.cpp: + equalize implementations of moveToX and moveToY + + * src/BoundingBox.h, src/DVIActions.cpp, src/DVIActions.h, + src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, + src/DvisvgmSpecialHandler.cpp, src/EPSToSVG.cpp, + src/EmSpecialHandler.cpp, src/Font.h, src/FontManager.cpp, + src/GFGlyphTracer.cpp, src/GFReader.cpp, src/GFTracer.cpp, + src/GFTracer.h, src/GraphicPath.h, src/HtmlSpecialHandler.h, + src/Makefile.am, src/PSPattern.cpp, src/PSPreviewFilter.cpp, + src/PSPreviewFilter.h, src/PageSize.cpp, src/PageSize.h, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SVGTree.cpp, + src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, + src/TFM.cpp, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, + src/VFReader.cpp: + switched internal computations from TeX points (pt) to PS points (bp) + +2014-02-05 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp, src/DVIReader.h: + ensure updating the SVG cursor position when executing DVI command + set_rule + +2014-01-13 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Ghostscript.cpp: + check if library given by --libgs is actually a GS library + +2014-01-10 Martin Gieseking <mgieseki@users.sourceforge.net> + + * NEWS: + updated NEWS + +2014-01-03 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FileFinder.cpp: + catch exceptions thrown by MiKTeXCom object + + * src/Directory.cpp: + initialize Directory member variables (Win only) + + * src/FileFinder.cpp: + return 'unknown' if MiKTeX version can't be retrieved + + * configure.ac, src/Doxyfile: + set version to 1.5.2 + +2014-01-02 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile.am, README, configure.ac, doc/Makefile.am, doc/dvisvgm.txt.in, + src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, + src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, + src/CMap.cpp, src/CMap.h, src/CMapManager.cpp, src/CMapManager.h, + src/CMapReader.cpp, src/CMapReader.h, src/CRC32.cpp, src/CRC32.h, + src/Calculator.cpp, src/Calculator.h, src/CharMap.cpp, src/CharMap.h, + src/CharMapID.cpp, src/CharMapID.h, src/Character.h, + src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Color.cpp, + src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, + src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DLLoader.h, + src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, + src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/Directory.cpp, src/Directory.h, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, + src/EPSFile.cpp, src/EPSFile.h, src/EPSToSVG.cpp, src/EPSToSVG.h, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/EncFile.cpp, + src/EncFile.h, src/FileFinder.cpp, src/FileFinder.h, src/FilePath.cpp, + src/FilePath.h, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, + src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEncoding.cpp, + src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, + src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, + src/FontMetrics.cpp, src/FontMetrics.h, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, + src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/Glyph.h, + src/GlyphTracerMessages.h, src/GraphicPath.h, src/HtmlSpecialHandler.cpp, + src/HtmlSpecialHandler.h, src/InputBuffer.cpp, src/InputBuffer.h, + src/InputReader.cpp, src/InputReader.h, src/JFM.cpp, src/JFM.h, + src/Length.cpp, src/Length.h, src/Makefile.am, src/MapLine.cpp, + src/MapLine.h, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, + src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, + src/MetafontWrapper.h, src/MiKTeXCom.cpp, src/MiKTeXCom.h, + src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.h, src/PSFilter.h, + src/PSInterpreter.cpp, src/PSInterpreter.h, src/PSPattern.cpp, + src/PSPattern.h, src/PSPreviewFilter.cpp, src/PSPreviewFilter.h, + src/PageRanges.cpp, src/PageRanges.h, src/PageSize.cpp, src/PageSize.h, + src/Pair.h, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.h, + src/Process.cpp, src/Process.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/SVGOutputBase.h, src/SVGTree.cpp, + src/SVGTree.h, src/SignalHandler.cpp, src/SignalHandler.h, + src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, + src/SpecialManager.h, src/StreamReader.cpp, src/StreamReader.h, + src/StreamWriter.cpp, src/StreamWriter.h, src/Subfont.cpp, src/Subfont.h, + src/System.cpp, src/System.h, src/TFM.cpp, src/TFM.h, src/Terminal.cpp, + src/Terminal.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, + src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, + src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, + src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, + src/options.dtd, src/options.xml, src/psdefs.cpp, src/types.h, + tests/BoundingBoxTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, + tests/CRC32Test.cpp, tests/CalculatorTest.cpp, + tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, + tests/CommandLineTest.cpp, tests/DirectoryTest.cpp, + tests/FileFinderTest.cpp, tests/FilePathTest.cpp, + tests/FileSystemTest.cpp, tests/FontManagerTest.cpp, + tests/FontMapTest.cpp, tests/GFReaderTest.cpp, tests/GraphicPathTest.cpp, + tests/LengthTest.cpp, tests/Makefile.am, tests/MapLineTest.cpp, + tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, + tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, + tests/PageSizeTest.cpp, tests/PairTest.cpp, + tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, + tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, + tests/SubfontTest.cpp, tests/TypesTest.cpp, tests/VectorStreamTest.cpp, + tests/check-conv, tests/create-makefile, tests/normalize.xsl: + updated year in copyright statements to 2014 + +2014-01-01 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/MiKTeXCom.cpp: + prevent releasing MiKTeX object if its initialization failed + +2013-12-29 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Font.cpp: + check if units per EM are not 0 to prevent divisions by zero + + * src/Directory.cpp, src/Directory.h, src/FontMap.cpp, + tests/DirectoryTest.cpp: + changed directory entry types from char to enums + + * src/FontCache.cpp: + catch potential StreamReaderException + +2013-12-18 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/BoundingBox.cpp: + explicitely initialize BoundingBox fields + + * src/FontCache.cpp: + avoid accessing strings constructed from temporaries + + * src/Matrix.cpp: + ensure return value of istream::get() is assigned to int vars + + * src/DVIReader.cpp: + check if denominator of DVI unit is non-zero + + * src/DvisvgmSpecialHandler.cpp, src/FontCache.cpp: + ensure null pointer checks before dereferencing + + * src/FontCache.cpp, src/SpecialManager.cpp: + restore stream format flags + + * src/DVIReader.cpp, src/Directory.cpp, src/GFReader.cpp: + added missing initializations of member variables + +2013-12-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/BgColorSpecialHandler.h, src/Bitmap.h, src/BoundingBox.h, + src/CMap.h, src/CMapManager.h, src/CMapReader.h, src/Calculator.h, + src/CharMap.h, src/CharMapID.h, src/Character.h, src/CmdLineParserBase.h, + src/Color.h, src/ColorSpecialHandler.h, src/CommandLine.h, + src/DLLoader.h, src/DVIActions.h, src/DVIReader.h, src/DVIToSVG.h, + src/DVIToSVGActions.h, src/Directory.h, src/DvisvgmSpecialHandler.h, + src/EPSFile.h, src/EPSToSVG.h, src/EmSpecialHandler.h, src/EncFile.h, + src/FileFinder.h, src/FilePath.h, src/FileSystem.h, src/Font.h, + src/FontCache.h, src/FontEncoding.h, src/FontEngine.h, src/FontManager.h, + src/FontMap.h, src/FontMetrics.h, src/GFGlyphTracer.h, src/GFReader.h, + src/GFTracer.h, src/Ghostscript.h, src/Glyph.h, + src/GlyphTracerMessages.h, src/GraphicPath.h, src/HtmlSpecialHandler.h, + src/InputBuffer.h, src/InputReader.h, src/JFM.h, src/Length.h, + src/MapLine.h, src/Matrix.h, src/Message.h, src/MessageException.h, + src/MetafontWrapper.h, src/MiKTeXCom.h, src/NoPsSpecialHandler.h, + src/PSFilter.h, src/PSInterpreter.h, src/PSPattern.h, + src/PSPreviewFilter.h, src/PageRanges.h, src/PageSize.h, src/Pair.h, + src/PdfSpecialHandler.h, src/Process.h, src/PsSpecialHandler.h, + src/SVGOutputBase.h, src/SVGTree.h, src/SignalHandler.h, + src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.h, + src/StreamReader.h, src/StreamWriter.h, src/Subfont.h, src/System.h, + src/TFM.h, src/Terminal.h, src/TpicSpecialHandler.h, src/VFActions.h, + src/VFReader.h, src/VectorStream.h, src/XMLDocument.h, src/XMLNode.h, + src/XMLString.h, src/macros.h, src/types.h: + prefixed include guards with DVISVGM_ to prevent ambiguities with + external headers + +2013-11-16 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIReader.cpp, src/SVGTree.cpp, src/SVGTree.h: + don't let global font colors interfere with color specials + +2013-10-29 Martin Gieseking <mgieseki@users.sourceforge.net> + + * NEWS: + updated NEWS + +2013-10-28 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Bitmap.cpp, src/Color.cpp, src/JFM.cpp, src/Matrix.cpp: + added missing #includes of header file <algorithm> + + * src/FileSystem.cpp, src/MetafontWrapper.cpp: + added explicit casts from ifstream to bool + + * src/DVIReader.cpp: + temporarily reactivated processing of font definitions located in the + postamble + + * configure.ac, src/Doxyfile: + set version to 1.5.1 + +2013-10-27 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVG.cpp: + suppress output of logical page number if it equals physical page number + +2013-10-16 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/PSPreviewFilter.cpp, src/PsSpecialHandler.cpp: + ensure proper evaluation of tightpage data if multiple pages are + processed + +2013-10-12 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/InputBuffer.h: + don't check unsigned variables for negative values + + * src/Color.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: + added 'const' to read-only methods + +2013-09-21 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FontCache.cpp, src/FontCache.h: + renamed FontCache::VERSION to FontCache::FORMAT_VERSION + + * src/DVIToSVG.cpp, src/Ghostscript.h, src/dvisvgm.cpp: + added missing guards and functions to prevent compilation errors if + DISABLE_GS is set + + * src/DVIToSVG.cpp: + changed warning message that appears if PS support has been disabled + permanently + +2013-09-01 Martin Gieseking <martin.gieseking@uos.de> + + * src/BgColorSpecialHandler.cpp, src/Bitmap.cpp, src/BoundingBox.cpp, + src/CMap.cpp, src/CMapManager.cpp, src/CMapReader.cpp, src/CRC32.cpp, + src/Calculator.cpp, src/CharMap.cpp, src/CmdLineParserBase.cpp, + src/Color.cpp, src/ColorSpecialHandler.cpp, src/CommandLine.cpp, + src/CommandLine.h, src/DLLoader.cpp, src/DVIActions.cpp, + src/DVIReader.cpp, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, + src/Directory.cpp, src/DvisvgmSpecialHandler.cpp, src/EPSFile.cpp, + src/EPSToSVG.cpp, src/EmSpecialHandler.cpp, src/EncFile.cpp, + src/FileFinder.cpp, src/FilePath.cpp, src/FileSystem.cpp, src/Font.cpp, + src/FontCache.cpp, src/FontEncoding.cpp, src/FontEngine.cpp, + src/FontManager.cpp, src/FontMap.cpp, src/FontMetrics.cpp, + src/GFGlyphTracer.cpp, src/GFReader.cpp, src/GFTracer.cpp, + src/Ghostscript.cpp, src/Ghostscript.h, src/HtmlSpecialHandler.cpp, + src/InputBuffer.cpp, src/InputReader.cpp, src/JFM.cpp, src/Length.cpp, + src/MapLine.cpp, src/Matrix.cpp, src/Message.cpp, + src/MetafontWrapper.cpp, src/MiKTeXCom.cpp, src/NoPsSpecialHandler.cpp, + src/PSInterpreter.cpp, src/PSPattern.cpp, src/PSPreviewFilter.cpp, + src/PageRanges.cpp, src/PageSize.cpp, src/PdfSpecialHandler.cpp, + src/Process.cpp, src/PsSpecialHandler.cpp, src/SVGTree.cpp, + src/SignalHandler.cpp, src/SpecialManager.cpp, src/StreamReader.cpp, + src/StreamWriter.cpp, src/Subfont.cpp, src/System.cpp, src/TFM.cpp, + src/Terminal.cpp, src/TpicSpecialHandler.cpp, src/VFReader.cpp, + src/XMLDocument.cpp, src/XMLNode.cpp, src/XMLString.cpp, src/dvisvgm.cpp: + include config.h at the top of every translation unit + + * src/DLLoader.h, src/Directory.h: + moved #define NOMINMAX to Windows config.h + + * configure.ac, src/Doxyfile: + set version to 1.5 + + * NEWS: + updated NEWS + +2013-08-30 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FontMetrics.h, src/JFM.cpp, src/JFM.h, src/TFM.h: + added retrieval of vertical mode flag to class FontMetrics + + * src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Font.cpp, src/Font.h, + src/FontEngine.cpp, src/FontEngine.h, src/FontMetrics.h, src/JFM.h, + src/SVGTree.cpp, src/SVGTree.h, src/TFM.h, src/dvisvgm.cpp: + added support for DVI format 3 (pTeX, vertical mode) + + * src/DVIReader.cpp, src/DVIReader.h, src/Font.cpp, src/Font.h, + src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, + src/FontManager.h, src/FontStyle.h, src/SVGTree.cpp, src/dvisvgm.cpp: + added support for XDV (DVI format 5) files + + * src/Font.cpp, src/Font.h, src/XMLString.cpp: + replaced entity references by corresponding UTF-8 characters; use + correct unicode points rather than DVI charcodes + + * doc/dvisvgm.txt.in: + updated manpage + +2013-08-29 Martin Gieseking <martin.gieseking@uos.de> + + * src/CharMap.cpp, src/CharMap.h, src/Font.cpp, src/Font.h, + src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, + src/FontManager.cpp, src/Makefile.am: + replaced local std::map tables used in Font classes with new class + CharMap + +2013-08-23 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/SVGTree.cpp: + appended px unit to font-size attributes in style section + +2013-08-22 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/XMLString.cpp: + replace very small floating point numbers by 0 + +2013-08-20 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FileFinder.cpp: + suppress error messages from makeFOO tools + +2013-08-13 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/CMap.cpp, src/CMap.h, src/CMapManager.cpp, src/CMapManager.h, + src/EncFile.h, src/Font.cpp, src/Font.h, src/FontEncoding.cpp, + src/FontEncoding.h, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h: + derive EncodingPair from FontEncoding + + * src/Font.cpp, src/Font.h, src/FontEncoding.cpp, src/FontEncoding.h, + src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h: + moved assignment of base font map to Font class + +2013-08-11 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac, src/FileFinder.cpp: + check if the kpathsea library is C++-safe (patch by Peter Breitenlohner) + + * src/dvisvgm.cpp: + fix number of dashes printed by -V1 + +2013-08-08 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Matrix.cpp, src/Matrix.h: + renamed Matrix skewing methods + +2013-08-04 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Font.cpp, src/Font.h, src/FontEngine.cpp, src/FontManager.cpp, + src/FontMap.cpp, src/FontMap.h, src/FontStyle.h, src/Makefile.am: + store pointers to font map and encoding in Font objects to speed up + looking them up + + * src/Ghostscript.h, src/PSPreviewFilter.cpp, src/PsSpecialHandler.cpp: + added missing variable initializations + +2013-08-03 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/CMapManager.cpp, src/CMapManager.h, src/FontManager.cpp: + avoid const_cast in CMapManager + +2013-08-02 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIActions.h, src/DVIReader.cpp, src/DVIToSVG.cpp: + disable font processing while scanning PS header specials + + * src/CMap.h, src/CMapManager.cpp: + properly handle 'unicode' encoding entries set in font map + +2013-08-01 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/XMLDocument.cpp, src/XMLString.cpp: + changed encoding of SVG files from ISO-8859-1 to UTF-8 + + * src/DVIToSVG.cpp, src/Makefile.am, src/SVGTree.cpp, + src/XMLDocTypeNode.h: + removed DOCTYPE declaration from generated files as suggested by the SVG + specification + + * src/DVIToSVG.cpp: + removed redundant #include statements + + * src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.h, src/EPSToSVG.h, + src/Matrix.cpp, src/Matrix.h, src/PsSpecialHandler.cpp, + src/SpecialActions.h, src/dvisvgm.cpp: + apply page transformations to width, height, and depth of preview bbox + + * NEWS: + updated NEWS + + * configure.ac, src/Doxyfile: + set version to 1.4 + +2013-07-31 Martin Gieseking <martin.gieseking@uos.de> + + * src/CMap.cpp, src/CMap.h, src/CMapManager.cpp, src/CMapManager.h, + src/CMapReader.cpp, src/CMapReader.h, src/FontManager.cpp, + src/Makefile.am, tests/CMapTest.cpp, tests/Makefile.am: + added classes to handle CMap files + + * src/CMap.cpp, src/CMap.h, src/CMapManager.h, src/EncFile.cpp, + src/EncFile.h, src/FileFinder.cpp, src/Font.cpp, src/Font.h, + src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, + src/FontEngine.h, src/FontManager.cpp, src/Makefile.am, + tests/CMapTest.cpp: + derive .enc encoding vectors and CMaps from common base class + FontEncoding + + * src/CMap.cpp, src/CMap.h, src/Character.h, src/EncFile.h, src/Font.cpp, + src/Font.h, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, + src/Makefile.am, tests/CMapTest.cpp: + added Character class to handle character names, codes, and indexes + consistently + + * src/FileFinder.cpp, src/Font.cpp, src/Font.h, src/FontManager.cpp: + added support for OTF fonts + + * src/Font.cpp, src/Font.h, src/FontMetric.cpp, src/FontMetric.h, + src/FontMetrics.cpp, src/FontMetrics.h, src/Makefile.am, src/TFM.h: + renamed class FontMetric to FontMetrics + + * src/CMap.cpp, src/CMap.h, src/CMapReader.cpp, src/CMapReader.h, + tests/CMapReaderTest.cpp, tests/CMapTest.cpp, tests/Makefile.am: + added evaluation of base font (bf) sections in CMap files + + * src/CMap.h, src/CMapManager.cpp, src/CMapManager.h, src/CMapReader.cpp, + src/CharMapID.cpp, src/CharMapID.h, src/Font.cpp, src/Font.h, + src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, + src/FontMap.cpp, src/FontMap.h, src/Makefile.am: + try to decode characters of non-CID fonts that have a CMap assigned in + the fontmap + +2013-07-27 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Font.cpp, src/Font.h, src/FontEncoding.cpp, src/FontEncoding.h: + moved lookup of the encoding of a font to the Font class + + * src/JFM.cpp: + fixed retrieval of char indexes if a JFM contains entries of chartype 0 + only + + * src/BgColorSpecialHandler.h, src/DVIToSVG.cpp, src/PSInterpreter.cpp, + src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, + src/SpecialManager.cpp, src/SpecialManager.h: + ensure that PS header code is evaluated before the page/body code; also + execute bop-hook and eop-hook + + * src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp: + added funtion to execute PS code snippets and retrieve their results + + * doc/dvisvgm.txt.in, src/DVIActions.h, src/DVIReader.cpp, + src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, + src/EPSToSVG.cpp, src/Makefile.am, src/PSFilter.h, src/PSInterpreter.cpp, + src/PSInterpreter.h, src/PSPreviewFilter.cpp, src/PSPreviewFilter.h, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SpecialActions.h, + src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h: + added evaluation of bounding box information created by preview package + +2013-07-23 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/EPSToSVG.cpp: + print warning message if height or width of EPS bbox is 0 + + * src/psdefs.cpp: + PS handler: call newpath before executing charpath in operator show + + * src/FontMap.cpp: + check for EOF prior to try to parse another mapline + +2013-07-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.cpp: + replaced PS operator prval with =only in psdefs + +2013-07-17 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVG.cpp: + ensure catching PSExceptions while processing PS header specials to + prevent segfaults + + * src/psdefs.cpp: + properly store PS operator applyscalevals in systemdict + +2013-07-14 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Process.cpp, src/Process.h: + extended Process::run() to grab the output written to stdout + + * src/FileFinder.cpp, src/FileFinder.h: + FileFinder: added lookup of cmap files + +2013-07-08 Martin Gieseking <martin.gieseking@uos.de> + + * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/CommandLine.cpp: + command-line parser: changed type of argument mode from char to enum + +2013-06-17 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FileFinder.cpp: + removed redundant 'using namespace std' + +2013-06-03 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/dvisvgm.txt.in, src/HtmlSpecialHandler.cpp, + src/HtmlSpecialHandler.h, src/dvisvgm.cpp: + extend option --linkmark to highlight linked areas by a given background + color + +2013-06-01 Martin Gieseking <martin.gieseking@uos.de> + + * src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, + src/ColorSpecialHandler.h, src/SpecialActions.h, + tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, tests/Makefile.am: + use Color class in ColorSpecialHandler rather than local code; added + ColorTest + +2013-05-22 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/dvisvgm.cpp: + added a missing (underlining) hyphen to the output of -V1 + +2013-05-17 Martin Gieseking <martin.gieseking@uos.de> + + * src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.h: + added missing NoPsSpecialhandler files + +2013-05-13 Martin Gieseking <martin.gieseking@uos.de> + + * src/Font.cpp, src/Font.h, src/FontManager.h, src/FontMetric.cpp, + src/FontMetric.h, src/Makefile.am, src/TFM.cpp, src/TFM.h: + handle invalid TFM files properly + + * src/Font.cpp, src/FontMetric.cpp, src/FontMetric.h, src/JFM.cpp, + src/JFM.h, src/Makefile.am, src/StreamReader.h, src/TFM.cpp, src/TFM.h: + added support for Japanese font metric (JFM) files + + * src/FileFinder.cpp, src/MiKTeXCom.cpp, src/MiKTeXCom.h, src/dvisvgm.cpp: + try to load the Ghostscript library that comes with MiKTeX + + * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/HtmlSpecialHandler.cpp, + src/HtmlSpecialHandler.h, src/Makefile.am, src/SpecialManager.cpp: + added support of hyperref specials + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/HtmlSpecialHandler.cpp, src/dvisvgm.cpp, src/options.xml: + added option --linkmark to select the highlighing variant for hyperlinks + + * configure.ac, src/Doxyfile: + set version to 1.3 + + * NEWS: + updated NEWS + +2013-05-02 Martin Gieseking <martin.gieseking@uos.de> + + * AUTHORS, Makefile.am, README, configure.ac, potracelib/Makefile.am, + potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, + potracelib/curve.h, potracelib/decompose.c, potracelib/decompose.h, + potracelib/lists.h, potracelib/potracelib.c, potracelib/potracelib.h, + potracelib/progress.h, potracelib/trace.c, potracelib/trace.h: + removed bundled potrace library + + * src/SVGTree.cpp, src/SVGTree.h: + added methods to push and pop 'context elements' to a page that wrap + parts of the page contents + + * src/DVIToSVGActions.h, src/EPSToSVG.h, src/SpecialActions.h: + provide the context push/pop methods of class SVGTree to special + handlers + + * src/InputReader.cpp, src/InputReader.h: + added optional parameter 'quotechar' to InputReader::parseAttributes() + + * src/EmSpecialHandler.h, src/NoPsSpecialHandler.h, src/SpecialHandler.h, + src/SpecialManager.cpp, src/SpecialManager.h, src/TpicSpecialHandler.h: + moved DVI listener methods to dedicated listener interface classes + + * src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, + src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, + src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.h, + src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, + src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h: + added page number parameter to DVIEndPageListener::dviEndPage() + +2013-05-01 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVGActions.cpp, src/Terminal.cpp, src/Terminal.h: + disable cursor when showing the progress indicator (Windows only) + +2013-04-26 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVG.cpp: + don't link NoPsSpecialHandler if HAVE_LIBGS + +2013-04-25 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FontEncoding.cpp: + fixed bracketing bug that prevented lookup of fontmap files + +2013-04-24 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.cpp, + src/Calculator.h, src/Matrix.cpp, src/Matrix.h, src/MessageException.h, + src/PageSize.cpp, src/PageSize.h, src/StreamReader.cpp, + src/StreamReader.h, src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, + src/XMLDocument.cpp, src/XMLDocument.h: + added missing underscores to private member variables + + * configure.ac, src/Doxyfile: + set version to 1.2.2 + + * NEWS: + updated NEWS + +2013-04-23 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVG.cpp, src/EPSToSVG.cpp, src/dvisvgm.cpp: + avoid output of empty parentheses if TARGET_SYSTEM is not set + + * doc/dvisvgm.txt.in, src/CmdLineParserBase.cpp, src/CommandLine.cpp, + src/options.dtd, src/options.xml: + added information about 'dvisvgm -E' to usage line + + * src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.h, + src/CmdLineParserBase.h, src/DVIToSVGActions.cpp, src/Message.cpp, + src/VFReader.cpp: + added missing member initializations to some classes + +2013-04-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVG.cpp, src/Makefile.am, src/SpecialManager.cpp: + print a warning message if PS specials are found but ignored + +2013-04-15 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FileFinder.cpp, src/dvisvgm.cpp: + catch MessageException if MiKTeX version can't be obtained + +2013-04-09 Martin Gieseking <mgieseki@users.sourceforge.net> + + * tests/Makefile.am, tests/create-makefile: + updated tests/Makefile.am to honor system potracelib if present + + * configure.ac, src/Doxyfile: + set version to 1.2.1 + + * NEWS: + updated NEWS + +2013-04-08 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/dvisvgm.txt.in, src/Color.cpp, src/Color.h, src/DVIToSVGActions.cpp: + allow the background color special to insert white rectancles + + * src/PageRanges.h: + dropped unused variable PageRanges::_max + +2013-04-04 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/XMLNode.cpp, src/XMLNode.h: + unhide derived method XMLDeclarationNode::append + +2013-03-10 Martin Gieseking <mgieseki@users.sourceforge.net> + + * Makefile.am, configure.ac: + don't build bundled potracelib if system library is used (patch by + Alexis Ballier) + +2013-03-03 Martin Gieseking <mgieseki@users.sourceforge.net> + + * potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, + potracelib/curve.h, potracelib/decompose.c, potracelib/decompose.h, + potracelib/lists.h, potracelib/potracelib.c, potracelib/potracelib.h, + potracelib/progress.h, potracelib/trace.c, potracelib/trace.h: + updated bundled potrace library to version 1.11 + +2013-03-02 Martin Gieseking <martin.gieseking@uos.de> + + * potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, + potracelib/decompose.h, potracelib/lists.h, potracelib/progress.h, + potracelib/trace.c, potracelib/trace.h, src/EPSFile.cpp, + src/EPSToSVG.cpp, src/EPSToSVG.h, src/PSPattern.cpp, src/PSPattern.h, + src/SVGOutputBase.h: + converted DOS line endings + +2013-02-28 Martin Gieseking <martin.gieseking@uos.de> + + * src/Makefile.am, src/PSInterpreter.cpp, src/PSInterpreter.h, + src/PSPattern.cpp, src/PSPattern.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/psdefs.psc, tests/PSInterpreterTest.cpp: + PS handler: added support of tiling patterns + + * src/Makefile.am, src/PSInterpreter.cpp, src/psdefs.cpp, src/psdefs.psc: + make psdefs a separate compilation unit + + * tests/MapLineTest.cpp: + prevent MapLineTest from failing if file UGBK.sfd is not available + + * src/psdefs.cpp: + improved processing of PS operator 'show' + + * configure.ac, src/Doxyfile: + set version to 1.2 + + * NEWS: + updated NEWS + +2013-02-21 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/XMLNode.cpp, src/XMLNode.h: + added virtual constructor XMLNode::clone() + + * src/XMLNode.cpp, src/XMLNode.h: + added methods to lookup attribute values and selected descendant XML + nodes + +2013-02-19 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/PSInterpreter.cpp, src/PSInterpreter.h: + added PSInterpreter::limit() to limit the number of bytes to be + processed + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/DVIToSVG.cpp, src/DVIToSVG.h, src/EPSFile.cpp, src/EPSFile.h, + src/EPSToSVG.cpp, src/EPSToSVG.h, src/Makefile.am, + src/PsSpecialHandler.cpp, src/SVGOutputBase.h, src/dvisvgm.cpp, + src/options.xml: + add option to directly convert EPS files to SVG + + * src/FilePath.cpp: + adapt path separators on Windows systems to get the correct output path + +2013-02-11 Martin Gieseking <martin.gieseking@uos.de> + + * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/CommandLine.cpp, + src/CommandLine.h: + applied a few refactorings to the command-line parser + +2013-02-07 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, + src/CommandLine.cpp, src/CommandLine.h, src/dvisvgm.cpp, src/options.xml: + added optional parameter to option --help to specify output format + +2013-02-06 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/dvisvgm.txt.in, src/BoundingBox.cpp, src/CommandLine.cpp, + src/CommandLine.h, src/EmSpecialHandler.cpp, src/GraphicPath.h, + src/Matrix.cpp, src/PsSpecialHandler.cpp, src/TpicSpecialHandler.cpp, + src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/options.xml: + added option --precision to set the number of decimal places applied to + attribute values + +2013-01-30 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/CommandLine.cpp: + fixed alignment of --help text + +2013-01-22 Martin Gieseking <martin.gieseking@uos.de> + + * src/FileFinder.cpp, src/FontEngine.cpp, src/Makefile.am, + src/MiKTeXCom.cpp, src/MiKTeXCom.h: + moved MiKTeX COM code to separate class + +2013-01-21 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp, src/DVIToSVG.cpp, src/FileFinder.cpp, src/Font.cpp, + src/Font.h, src/FontEncoding.cpp, src/FontEngine.cpp, src/FontEngine.h, + src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h, src/Makefile.am, + src/MapLine.cpp, src/MapLine.h, src/Subfont.cpp, src/Subfont.h, + tests/FontMapTest.cpp, tests/Makefile.am, tests/MapLineTest.cpp, + tests/SubfontTest.cpp, tests/create-makefile, tests/sample.sfd: + added support for subfont definitions and multi-font (.ttc) files + + * src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h, src/MapLine.h: + replaced FontMap entries by pointers; initialize entries with MapLine + objects + + * src/CommandLine.cpp, src/Font.cpp, src/Font.h, src/FontEngine.cpp, + src/FontEngine.h, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h, + src/MapLine.cpp, src/MapLine.h, tests/MapLineTest.cpp: + implemented evaluation of font style options given in a mapline + + * configure.ac, src/Doxyfile: + set version to 1.1 + + * NEWS, README: + updated NEWS and README + +2013-01-20 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FontEngine.cpp, src/FontEngine.h: + removed unneeded code related to font sizes from class FontEngine + +2013-01-16 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/FontMap.cpp, src/FontMap.h, src/dvisvgm.cpp, src/options.xml: + renamed option --map-file to --fontmap; allow multiple mapfiles and + modes + + * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/FontMap.cpp, src/FontMap.h, + src/Makefile.am, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.h: + added PdfSpecialHandler to evaluate pdf:mapline and pdf:mapfile specials + +2013-01-10 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Font.cpp, src/FontEncoding.cpp: + fixed a string exception that occurred when an encoding file or an entry + in the encoding table is unavailable + +2013-01-06 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FileFinder.cpp, src/FileFinder.h, src/FontEncoding.cpp, + src/FontEncoding.h: + removed font encoding methods from FileFinder + +2013-01-02 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile.am, README, configure.ac, doc/Makefile.am, doc/dvisvgm.txt.in, + src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, + src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, + src/CRC32.cpp, src/CRC32.h, src/Calculator.cpp, src/Calculator.h, + src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Color.cpp, + src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, + src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DLLoader.h, + src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, + src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/Directory.cpp, src/Directory.h, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/FileFinder.cpp, + src/FileFinder.h, src/FilePath.cpp, src/FilePath.h, src/FileSystem.cpp, + src/FileSystem.h, src/Font.cpp, src/Font.h, src/FontCache.cpp, + src/FontCache.h, src/FontEncoding.cpp, src/FontEncoding.h, + src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, + src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, + src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/Glyph.h, + src/GlyphTracerMessages.h, src/GraphicPath.h, src/InputBuffer.cpp, + src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, + src/Length.cpp, src/Length.h, src/Makefile.am, src/Matrix.cpp, + src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, + src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/MiKTeXCom.cpp, + src/MiKTeXCom.h, src/PSInterpreter.cpp, src/PSInterpreter.h, + src/PageRanges.cpp, src/PageRanges.h, src/PageSize.cpp, src/PageSize.h, + src/Pair.h, src/Process.cpp, src/Process.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/SVGTree.cpp, src/SVGTree.h, + src/SignalHandler.cpp, src/SignalHandler.h, src/SpecialActions.h, + src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, + src/StreamReader.cpp, src/StreamReader.h, src/StreamWriter.cpp, + src/StreamWriter.h, src/System.cpp, src/System.h, src/TFM.cpp, src/TFM.h, + src/Terminal.cpp, src/Terminal.h, src/TpicSpecialHandler.cpp, + src/TpicSpecialHandler.h, src/VFActions.h, src/VFReader.cpp, + src/VFReader.h, src/VectorStream.h, src/XMLDocTypeNode.h, + src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, + src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, + src/options.dtd, src/options.xml, src/psdefs.psc, src/types.h, + tests/BoundingBoxTest.cpp, tests/CRC32Test.cpp, tests/CalculatorTest.cpp, + tests/ColorSpecialTest.cpp, tests/CommandLineTest.cpp, + tests/DirectoryTest.cpp, tests/FileFinderTest.cpp, + tests/FilePathTest.cpp, tests/FileSystemTest.cpp, + tests/FontManagerTest.cpp, tests/FontMapTest.cpp, tests/GFReaderTest.cpp, + tests/GraphicPathTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, + tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, + tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, + tests/PageSizeTest.cpp, tests/PairTest.cpp, + tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, + tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, + tests/TypesTest.cpp, tests/VectorStreamTest.cpp, tests/create-makefile: + updated year in copyright statements to 2013 + +2012-12-23 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FontCache.cpp, src/PsSpecialHandler.cpp, src/TpicSpecialHandler.cpp: + check emptiness of containers with empty() instead of size() + + * src/FileFinder.cpp, src/MiKTeXCom.cpp, src/Process.cpp: + avoid creating copies of exception objects + + * src/CmdLineParserBase.h, src/Directory.cpp, src/GFReader.cpp, + src/PsSpecialHandler.cpp: + initialize uninitialized member variables + + * src/FileFinder.cpp, src/Message.cpp, src/dvisvgm.cpp: + reduced scope of some variables + +2012-12-12 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FontCache.cpp: + replaced 'char' with 'glyph' in font cache listing + + * src/SpecialManager.cpp: + clear all corresponding containers when calling + SpecialHandler::unregisterHandlers() + +2012-12-03 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Ghostscript.cpp: + added explicit cast to avoid signed/unsigned comparison warning + +2012-12-02 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FilePath.cpp, tests/FilePathTest.cpp: + strip drive letter if it's not set (Windows only) + + * tests/FileSystemTest.cpp, tests/GFReaderTest.cpp: + ensure that tests work properly on Windows + + * src/macros.h: + removed SHOW() from macros.h + + * doc/dvisvgm.txt.in, src/Ghostscript.cpp: + use gsdll64.dll for 64-bit builds; added info about gsdll64.dll to + manpage + +2012-11-24 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Message.cpp: + don't wrap message lines explicitly on Windows +* * * + +2012-11-23 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Ghostscript.cpp, src/Ghostscript.h, src/PSInterpreter.cpp, + src/PSInterpreter.h, src/dvisvgm.cpp: + print an error message if the execution of PS code fails + + * src/PSInterpreter.cpp, src/psdefs.psc: + print operand stack in case of a PS error + +2012-11-22 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Message.cpp: + handle wrapping of messages containing newlines correctly + +2012-11-21 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DLLoader.cpp, src/DLLoader.h, src/Ghostscript.cpp: + renamed DLLoader::loadFunction() to DLLoader::loadSymbol() + +2012-11-19 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FontEngine.cpp, src/FontEngine.h: + renamed FontEngine::fname to FontEngine::_fontname + + * src/Font.cpp, src/Font.h, src/FontManager.cpp: + print warning if font checksums don't match + +2012-11-16 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Directory.h: + undefine macro max() to avoid compilation problems on Windows + +2012-11-15 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FileFinder.cpp, src/FileFinder.h, src/FontMap.cpp, src/FontMap.h, + tests/FontMapTest.cpp: + made class FontMap a singleton + + * src/FileFinder.cpp, src/FileFinder.h, src/dvisvgm.cpp: + moved initialization of FontMap from FileFinder to dvisvgm.cpp + + * src/Makefile.am, src/MapLine.cpp, src/MapLine.h, tests/Makefile.am, + tests/MapLineTest.cpp: + added new class MapLine to parse and evaluate a single line of a map + file + + * src/FileFinder.cpp, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h, + tests/FontMapTest.cpp: + adapted code to use new MapLine class; introduced support of map line + modes + +2012-11-14 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FileFinder.cpp: + initialize Ghostscript when compiled for TeX Live Win32 (patch by Peter + Breitenlohner) + + * src/FileFinder.cpp, src/FileFinder.h, src/dvisvgm.cpp, + tests/FileFinderTest.cpp, tests/FontManagerTest.cpp: + initialize second parameter of kpse_set_program_name() correctly + + * src/DVIToSVG.cpp: + prevent compilation error when using a C++11 compiler (patch by Peter + Breitenlohner) + +2012-11-11 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/InputBuffer.cpp, src/InputBuffer.h, src/InputReader.cpp, + src/InputReader.h, src/PsSpecialHandler.cpp, + tests/StreamInputBufferTest.cpp: + some refactorings of class InputReader; added InputReader::find() + +2012-10-24 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVG.cpp, src/DVIToSVG.h, src/dvisvgm.cpp: + don't show warning about disabled PS support in list of special handlers + +2012-09-27 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, src/Doxyfile: + set version to 1.0.12 + + * NEWS: + updated NEWS + + * src/options.ggo: + removed deprecated file options.ggo + +2012-09-20 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVG.cpp: + show warning if processing of PS specials is disabled + + * src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: + removed Ghostscript info from ps entry in list of special handlers + +2012-09-19 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.psc: + ignore dvips bop operators that might be present in PS specials + +2012-09-17 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/StreamReader.cpp: + fixed reading invalid number of string characters + +2012-04-17 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/Makefile.am: + keep manpage when calling 'make clean' + +2012-04-04 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVGActions.cpp, src/SVGTree.cpp, src/SVGTree.h, + tests/frktest-nf-cmp.svg, tests/frktest-wf-cmp.svg, + tests/sample-nf-cmp.svg, tests/sample-wf-cmp.svg: + scale point units in the SVG files to big points (bp) + +2012-04-02 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Matrix.cpp, src/Matrix.h, tests/MatrixTest.cpp: + added Matrix::invert() and det() + +2012-03-29 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Matrix.cpp, src/Matrix.h, tests/MatrixTest.cpp: + added start index parameter to Matrix::set(vector<>) + +2012-03-21 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.psc: + evaluate PS operators rectclip, rectfill, and rectstroke + +2012-03-09 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Ghostscript.cpp, src/Ghostscript.h: + added optional parameter to Ghostscript::revision() to retrieve the + revision number only + + * src/dvisvgm.cpp: + added Ghostscript to library list printed by --version=yes + + * NEWS: + updated NEWS + +2012-03-08 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, src/Doxyfile: + set version to 1.0.11 + +2012-03-07 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVGActions.cpp: + correct location of a rule's bounding box (lp bug #948713) + +2012-02-24 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/dvisvgm.txt.in: + fixed a couple of mistakes and formatting flaws in the manpage + +2012-02-17 Martin Gieseking <mgieseki@users.sourceforge.net> + + * README: + updated information about bug reporting + +2012-01-26 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/CmdLineParserBase.h, src/DVIActions.h, src/DVIReader.h, + src/DVIToSVGActions.h, src/FontEngine.h, src/FontManager.h, + src/MetafontWrapper.h, src/SVGTree.h, src/SpecialActions.h, + src/SpecialHandler.h, src/SpecialManager.h, src/TFM.h, src/VFReader.h: + adapt forward declarations of classes and structs to their corresponding + definition (SF bug #3480013) + +2012-01-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/miktex-core.def, src/miktex-kps.def, src/miktex-kps.h: + removed outdated files for old MiKTeX bindings + +2012-01-09 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/InputReader.cpp, tests/StreamInputBufferTest.cpp: + fixed parsing of negative floating point numbers starting with '-0.' (SF + bug #3471097) + + * src/TpicSpecialHandler.cpp: + added some more comments to methods of class TpicSpecialHandler + +2012-01-06 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile.am, README, configure.ac, doc/Makefile.am, doc/dvisvgm.txt.in, + src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, + src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, + src/CRC32.cpp, src/CRC32.h, src/Calculator.cpp, src/Calculator.h, + src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Color.cpp, + src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, + src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DLLoader.h, + src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, + src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/Directory.cpp, src/Directory.h, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/FileFinder.cpp, + src/FileFinder.h, src/FilePath.cpp, src/FilePath.h, src/FileSystem.cpp, + src/FileSystem.h, src/Font.cpp, src/Font.h, src/FontCache.cpp, + src/FontCache.h, src/FontEncoding.cpp, src/FontEncoding.h, + src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, + src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, + src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/Glyph.h, + src/GlyphTracerMessages.h, src/GraphicPath.h, src/InputBuffer.cpp, + src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, + src/Length.cpp, src/Length.h, src/Makefile.am, src/Matrix.cpp, + src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, + src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PSInterpreter.cpp, + src/PSInterpreter.h, src/PageRanges.cpp, src/PageRanges.h, + src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/Process.cpp, + src/Process.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, + src/SVGTree.cpp, src/SVGTree.h, src/SignalHandler.cpp, + src/SignalHandler.h, src/SpecialActions.h, src/SpecialHandler.h, + src/SpecialManager.cpp, src/SpecialManager.h, src/StreamReader.cpp, + src/StreamReader.h, src/StreamWriter.cpp, src/StreamWriter.h, + src/System.cpp, src/System.h, src/TFM.cpp, src/TFM.h, src/Terminal.cpp, + src/Terminal.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, + src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, + src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, + src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, + src/dvisvgm.cpp, src/macros.h, src/options.dtd, src/options.xml, + src/psdefs.psc, src/types.h, tests/BoundingBoxTest.cpp, + tests/CRC32Test.cpp, tests/CalculatorTest.cpp, + tests/ColorSpecialTest.cpp, tests/CommandLineTest.cpp, + tests/DirectoryTest.cpp, tests/FileFinderTest.cpp, + tests/FilePathTest.cpp, tests/FileSystemTest.cpp, + tests/FontManagerTest.cpp, tests/FontMapTest.cpp, tests/GFReaderTest.cpp, + tests/GraphicPathTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, + tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, + tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, + tests/PageSizeTest.cpp, tests/PairTest.cpp, + tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, + tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, + tests/TypesTest.cpp, tests/VectorStreamTest.cpp, tests/check-conv, + tests/create-makefile: + updated year in copyright statements + +2011-12-18 Martin Gieseking <mgieseki@users.sourceforge.net> + + * tests/Makefile.am, tests/create-makefile: + link tests with -lpthread (required by gtest on Ubuntu) + + * configure.ac, src/Doxyfile: + set version to 1.0.10 + + * NEWS: + updated NEWS + +2011-12-17 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/GlyphTracerMessages.h, + src/Message.cpp, src/Message.h, src/MetafontWrapper.cpp, + src/Terminal.cpp, src/Terminal.h, src/dvisvgm.cpp: + allow users to customize the message colors + + * doc/dvisvgm.txt.in: + added documentation on environment variable DVISVGM_COLORS to manpage + +2011-11-22 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/GraphicPath.h: + added some more comments to the methods of GraphicPath + +2011-11-18 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac: + move linker flag -lfreetype from LDFLAGS to LIBS to avoid linking + problems + +2011-10-28 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FontMap.cpp: + removed unused variable eval_prefix in helper function read_entry() + + * src/SVGTree.cpp: + avoid possible collisions of glyph IDs + +2011-10-13 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, src/Doxyfile: + set version to 1.0.9 + + * NEWS: + updated NEWS + +2011-10-09 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FilePath.cpp: + added some missing comments to methods of class FilePath + + * src/Directory.h: + dropped method Directory::getEntry() + +2011-10-07 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Process.cpp: + added missing include <signal.h> to Process.cpp + + * src/Process.cpp: + exclude definition of split_paramstr() from Windows builds as it's not + used there + +2011-10-03 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/Makefile.am: + add metadata/pdfmarks to pdf version of manpage + +2011-09-06 Martin Gieseking <mgieseki@users.sourceforge.net> + + * potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, + potracelib/curve.h, potracelib/decompose.c, potracelib/decompose.h, + potracelib/lists.h, potracelib/potracelib.c, potracelib/potracelib.h, + potracelib/progress.h, potracelib/trace.c, potracelib/trace.h: + updated bundled potrace library to version 1.10 + +2011-06-04 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, src/Doxyfile: + set version to 1.0.9dev + + * src/FileFinder.cpp, src/MetafontWrapper.cpp: + fixed segfault occured in TeX Live Win32 caused by mf.exe being + unavailable (SF bug #3308473) + +2011-06-01 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac: + added AC_LANG_SOURCE to avoid autoconf warnings + +2011-05-31 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, configure.ac, src/Doxyfile: + set version to 1.0.8; updated NEWS + + * src/PsSpecialHandler.cpp: + explicitly cast double to int in call of ClippingStack::dup()/pop() + +2011-05-27 Martin Gieseking <mgieseki@users.sourceforge.net> + + * tests/check-conv, tests/sample-nf-cmp.svg, tests/sample-wf-cmp.svg: + updated conversion tests + +2011-05-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/Font.cpp, src/Makefile.am, src/MetafontWrapper.cpp, + src/MetafontWrapper.h, src/Process.cpp, src/Process.h, + src/SignalHandler.cpp: + replaced call of system() with Process::run() and kill child process if + necessary + +2011-05-22 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FileFinder.cpp: + MiKTeX: maketfm and makemf have been renamed to miktex-maketfm and + miktex-makemf + + * src/MetafontWrapper.cpp: + dropped '--halt-on-error' in Metafont call to process buggy mf files + completely + +2011-05-19 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DLLoader.h: + added #undef NOMINMAX before (re)defining it + +2011-05-12 Martin Gieseking <martin.gieseking@uos.de> + + * src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/psdefs.psc, tests/PSInterpreterTest.cpp: + PS handler: implemented evaluation of save, restore, and grestoreall + +2011-05-07 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, src/Doxyfile: + set version to 1.0.8dev + + * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVGActions.h, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SpecialActions.h: + fixed interaction between PS and DVI drawing position + + * src/PsSpecialHandler.cpp: + add definitions in literal PS headers to dictionary TeXDict + + * src/PsSpecialHandler.cpp: + fixed potential segfault caused by invisible zero-length paths + +2011-05-06 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVGActions.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, + src/psdefs.psc: + PS handler: added missing unit conversions (pt vs. bp) + + * NEWS, README, configure.ac, src/Doxyfile: + set version to 1.0.7; updated NEWS and README + +2011-05-05 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/PSInterpreter.cpp, src/PsSpecialHandler.cpp: + separate PS snippets by newline characters to leave preceding comments + + * src/PsSpecialHandler.h: + corrected scaling formula applied to PS line properties + + * doc/dvisvgm.txt.in: + added info about dvips rounding issues to manpage + +2011-05-04 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/PsSpecialHandler.cpp: + don't call Ghostscript::revision() in initialization of static variable + + * src/Ghostscript.cpp, src/Ghostscript.h, src/PSInterpreter.cpp, + src/PSInterpreter.h: + avoid 'this' pointer in initialazation list of + PSInterpreter::PSInterpreter() + + * src/Length.h: + undefine macro IN + +2011-05-03 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac, src/Doxyfile: + set version to 1.0.7dev + + * src/psdefs.psc: + catch PS error /nocurrentpoint in operator 'setpos' properly + + * src/psdefs.psc: + PS handler: recognize save/restore operators + + * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, + src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, + src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, + src/SpecialManager.h, src/TpicSpecialHandler.cpp, + src/TpicSpecialHandler.h: + replaced methods for DVI position alterations with translation semantics + + * src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/macros.h, src/psdefs.psc, + tests/PSInterpreterTest.cpp: + improved handling of pure PostScript specials + + * src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h: + tpic special 'ip' must not draw the outline of the polygon but only fill + its interior + + * src/DLLoader.cpp, src/DLLoader.h: + don't define min/max macros in windows.h + +2011-04-30 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/SpecialManager.cpp: + register special prefix ps:: properly + +2011-04-18 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FileFinder.cpp, src/FileFinder.h, src/dvisvgm.cpp, + tests/FileFinderTest.cpp: + dropped class FileFinder::Impl and simplified FileFinder interface + + * src/DVIReader.cpp, src/Font.cpp, src/GFReader.cpp, src/Makefile.am, + src/MetafontWrapper.cpp, src/PSInterpreter.cpp, src/SignalHandler.cpp, + src/SignalHandler.h, src/TFM.cpp, src/dvisvgm.cpp: + added class SignalHandler for CTRL-C signals + + * NEWS, README, configure.ac, src/Doxyfile: + set version to 1.0.6; updated NEWS and README + +2011-04-14 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVGActions.cpp, src/MessageException.h, src/dvisvgm.cpp, + tests/Makefile.am, tests/MessageExceptionTest.cpp: + derived MessageException from std::exception and replaced getMessage() + with what() + +2011-04-13 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/XMLNode.cpp, src/XMLNode.h: + prepended member variables of the XMLNode classes with underscore + +2011-03-15 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIReader.cpp: + throw DVI exception if set_char/put_char is executed without preceding + font selection + +2011-03-04 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac, src/Doxyfile: + set version to 1.0.6dev + + * potracelib/potracelib.c, potracelib/potracelib.h: + changed return type of potrace_version() to 'const char *' in order to + avoid compiler warning + +2011-03-01 Martin Gieseking <mgieseki@users.sourceforge.net> + + * NEWS, configure.ac, src/Doxyfile: + set version to 1.0.5, updated NEWS + +2011-02-28 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/dvisvgm.txt.in, src/FontCache.cpp, src/FontCache.h, src/dvisvgm.cpp: + added code to remove outdated and corrupted cache files + + * src/Ghostscript.cpp: + fixed formatting of GS version number + +2011-02-21 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac, src/Doxyfile: + set version to 1.0.5dev + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/GraphicPath.h, src/SVGTree.cpp, src/SVGTree.h, src/dvisvgm.cpp, + src/options.xml, tests/CommandLineTest.cpp: + added option to replace use elements with paths + + * src/SVGTree.cpp: + added missing unit in height/width attribute of svg root element + + * tests/frktest-nf-cmp.svg, tests/frktest-wf-cmp.svg, + tests/sample-nf-cmp.svg, tests/sample-wf-cmp.svg: + updated conversion test files + +2011-02-16 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/InputBuffer.h: + reference to scanned string in StringInputBuffer is constant now + +2011-02-10 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FileSystem.cpp, src/FileSystem.h, src/dvisvgm.cpp, + tests/FileSystemTest.cpp: + merged FileSystem::move() into FileSystem::copy() + + * src/CRC32.cpp, src/CRC32.h, src/Makefile.am, tests/CRC32Test.cpp, + tests/Makefile.am: + added class CRC32 and corresponding tests + + * src/StreamReader.cpp, src/StreamReader.h, src/StreamWriter.cpp, + src/StreamWriter.h, tests/Makefile.am, tests/StreamReaderTest.cpp, + tests/StreamWriterTest.cpp: + added CRC32 computation methods to StreamReader and StreamWriter + + * src/FontCache.cpp, src/FontCache.h: + added CRC32 checks to cache files + +2011-01-31 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/CmdLineParserBase.cpp: + print character instead of ascii value in message of command-line parser + +2011-01-30 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/FileFinder.cpp, src/FileFinder.h, src/FontEngine.cpp, + src/FontEngine.h, src/dvisvgm.cpp, src/options.xml: + added optional argument to --version + +2011-01-28 Martin Gieseking <mgieseki@users.sourceforge.net> + + * potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, + potracelib/curve.h, potracelib/decompose.c, potracelib/decompose.h, + potracelib/lists.h, potracelib/potracelib.c, potracelib/potracelib.h, + potracelib/progress.h, potracelib/trace.c, potracelib/trace.h: + updated bundled potrace library to version 1.9 + +2011-01-17 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FileSystem.cpp, src/FileSystem.h, tests/FileSystemTest.cpp, + tests/Makefile.am: + added FileSystem::copy and FileSystem::move; added FileSystemTest + + * doc/dvisvgm.txt.in, src/dvisvgm.cpp: + moved cache files to subfolder ($HOME/.dvisvgm/cache) + +2011-01-04 Martin Gieseking <mgieseki@users.sourceforge.net> + + * Makefile.am, README, configure.ac, doc/Makefile.am, doc/dvisvgm.txt.in, + src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, + src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, + src/Calculator.cpp, src/Calculator.h, src/CmdLineParserBase.cpp, + src/CmdLineParserBase.h, src/Color.cpp, src/Color.h, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, + src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DLLoader.h, + src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, + src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/Directory.cpp, src/Directory.h, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/FileFinder.cpp, + src/FileFinder.h, src/FilePath.cpp, src/FilePath.h, src/FileSystem.cpp, + src/FileSystem.h, src/Font.cpp, src/Font.h, src/FontCache.cpp, + src/FontCache.h, src/FontEncoding.cpp, src/FontEncoding.h, + src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, + src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, + src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/Glyph.h, + src/GlyphTracerMessages.h, src/GraphicPath.h, src/InputBuffer.cpp, + src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, + src/Length.cpp, src/Length.h, src/Makefile.am, src/Matrix.cpp, + src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, + src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PSInterpreter.cpp, + src/PSInterpreter.h, src/PageRanges.cpp, src/PageRanges.h, + src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/SVGTree.cpp, src/SVGTree.h, + src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, + src/SpecialManager.h, src/StreamReader.cpp, src/StreamReader.h, + src/StreamWriter.cpp, src/StreamWriter.h, src/System.cpp, src/System.h, + src/TFM.cpp, src/TFM.h, src/Terminal.cpp, src/Terminal.h, + src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/VFActions.h, + src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, + src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, + src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, + src/dvisvgm.cpp, src/macros.h, src/options.dtd, src/options.xml, + src/psdefs.psc, src/types.h, tests/BoundingBoxTest.cpp, + tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, + tests/CommandLineTest.cpp, tests/DirectoryTest.cpp, + tests/FileFinderTest.cpp, tests/FilePathTest.cpp, + tests/FontManagerTest.cpp, tests/FontMapTest.cpp, tests/GFReaderTest.cpp, + tests/GraphicPathTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, + tests/MatrixTest.cpp, tests/PageRagesTest.cpp, tests/PageSizeTest.cpp, + tests/PairTest.cpp, tests/SplittedCharInputBufferTest.cpp, + tests/StreamInputBufferTest.cpp, tests/TypesTest.cpp, + tests/VectorStreamTest.cpp, tests/check-conv, tests/create-makefile: + updated year in copyright info + + * tests/Makefile.am, tests/PSInterpreterTest.cpp: + added basic tests for class PSInterpreter + +2010-12-18 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FileFinder.cpp: + updated to MiKTeX 2.8 SDK + + * src/PsSpecialHandler.cpp: + fixed scaling issue in PS positioning + + * src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/psdefs.psc: + PS handler: added missing scaling of linewidths and dash distances + + * NEWS, configure.ac, src/Doxyfile: + set version to 1.0.4; updated NEWS + + * doc/dvisvgm.txt.in: + minor update to the manpage + +2010-08-18 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FontEngine.cpp: + fixed FreeType version check (patch by Paul Vojta) + +2010-08-11 Martin Gieseking <mgieseki@users.sourceforge.net> + + * tests/Makefile.am, tests/PairTest.cpp: + added PairTest + +2010-08-06 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac, src/Doxyfile: + set version to 1.0.3 + +2010-08-05 Martin Gieseking <mgieseki@users.sourceforge.net> + + * NEWS, doc/dvisvgm.txt.in: + updated manpage and NEWS + +2010-08-04 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/BoundingBox.cpp, src/BoundingBox.h, src/Matrix.cpp, src/Matrix.h, + src/PsSpecialHandler.cpp: + revamped PsSpecialHandler::psfile() to fix a transformation issue (SF + bug #3037372) + +2010-07-28 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp: + added check of DVI format version + +2010-07-26 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: + restore transformation matrix after execution of psfile + +2010-07-13 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac, src/Doxyfile: + set version to 1.0.3dev + + * src/InputBuffer.h: + added missing namespace prefix + + * src/Terminal.cpp: + replaced \e with \x1B + + * src/GraphicPath.h, src/PsSpecialHandler.h: + fixed missing initialization of GraphicPath iterator + + * src/Directory.cpp, src/Directory.h, src/GFReader.cpp, src/GFReader.h: + added leading underscore to variables of GFReader + +2010-06-22 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/gzstream.cpp, src/gzstream.h: + fixed class variable issue introduced by previous AIX patch + + * NEWS, configure.ac, src/Doxyfile: + set version to 1.0.2 + +2010-06-18 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Bitmap.cpp, tests/DirectoryTest.cpp, tests/GFReaderTest.cpp, + tests/Makefile.am, tests/cmr10.600gf, tests/create-makefile: + added GFReaderTest; updated DirectoryTest + +2010-06-17 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Bitmap.cpp, src/Calculator.cpp, src/CmdLineParserBase.cpp, + src/Color.cpp, src/ColorSpecialHandler.cpp, src/DVIReader.cpp, + src/DVIReader.h, src/DVIToSVGActions.cpp, src/DvisvgmSpecialHandler.cpp, + src/EmSpecialHandler.cpp, src/FontCache.cpp, src/FontEncoding.cpp, + src/GFGlyphTracer.cpp, src/Pair.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/TFM.cpp, src/TFM.h: + fixed some type conversion warnings + + * src/Message.cpp, src/Message.h: + renamed MessageStream::putchar() to MessageStream::putChar() to avoid + name clashes + + * src/types.h, tests/Makefile.am, tests/TypesTest.cpp: + added TypesTest + +2010-06-16 Martin Gieseking <mgieseki@users.sourceforge.net> + + * potracelib/curve.c, potracelib/curve.h, potracelib/decompose.c: + renamed internal potrace functions path_new() and path_free() to prevent + linker conflicts on OS X + +2010-06-14 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac, src/Doxyfile: + set version to 1.0.2dev + + * configure.ac, src/CmdLineParserBase.h, src/FileFinder.h, + src/FontCache.cpp, src/FontCache.h, src/FontEncoding.cpp, + src/FontEngine.cpp, src/GFGlyphTracer.h, src/MetafontWrapper.cpp, + src/gzstream.cpp: + applied latest TL patches from Peter Breitenlohner and Karl Berry + +2010-06-11 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Message.cpp: + suppress ANSI color code by default + + * NEWS, configure.ac, src/Doxyfile: + set version to 1.0.1 + +2010-06-09 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac, src/Doxyfile: + set version to 1.0.1dev + + * src/psdefs.psc: + fixed recursion issue in PS operator charpath + +2010-06-08 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac, doc/Makefile.am, src/Makefile.am: + cleaned up configuration scripts + + * configure.ac, src/Doxyfile: + set version to 1.0dev + + * doc/dvisvgm.txt.in, src/BoundingBox.cpp, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/DvisvgmSpecialHandler.cpp, + src/EmSpecialHandler.cpp, src/PsSpecialHandler.cpp, src/SpecialActions.h, + src/SpecialManager.cpp, src/TpicSpecialHandler.cpp: + added special for creating local bounding boxes + + * src/FilePath.cpp, src/FilePath.h, src/FileSystem.cpp, src/FileSystem.h, + src/Makefile.am, tests/FilePathTest.cpp, tests/Makefile.am: + added class FilePath + + * src/InputBuffer.h, tests/ColorSpecialTest.cpp, + tests/StreamInputBufferTest.cpp: + added InputBuffer::invalidate() + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Makefile.am, + src/PageRanges.cpp, src/PageRanges.h, src/StreamCounter.h, + src/dvisvgm.cpp, src/options.xml, tests/BoundingBoxTest.cpp, + tests/CommandLineTest.cpp, tests/Makefile.am, tests/PageRagesTest.cpp, + tests/StreamCounterTest.cpp: + added conversion of multiple pages + + * configure.ac, doc/Makefile.am, doc/dvisvgm.txt.in, src/CommandLine.cpp, + src/CommandLine.h, src/DVIActions.h, src/DVIToSVG.cpp, src/GFTracer.cpp, + src/GlyphTracerMessages.h, src/Makefile.am, src/Message.cpp, + src/Message.h, src/MetafontWrapper.cpp, src/Terminal.cpp, src/Terminal.h, + src/dvisvgm.cpp, src/options.xml: + improved output of messages including optional colorization + + * src/Font.cpp: + print error message if Metafont failed + + * src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/psdefs.psc: + evaluate Ghostscript operator .setopacityalpha + + * src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h: + added method to compute length of DVI command + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/DVIActions.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, + src/Makefile.am, src/Message.cpp, src/Message.h, src/PSInterpreter.cpp, + src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, + src/SpecialActions.h, src/System.cpp, src/System.h, src/dvisvgm.cpp, + src/options.xml: + added percentage-based progress indicator + + * doc/Makefile.am, doc/dvisvgm.txt.in: + documented option --help and --version in manpage + + * NEWS, configure.ac, src/Doxyfile: + set version to 1.0 + + * src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h: + fixed PS destructor issue (SF bug #3013392) + +2010-05-09 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac: + fixed whitespace issue in CPPFLAGS and LDFLAGS + +2010-05-04 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac: + fixed kpathsea check; use pkg-config to check freetype availability + + * tests/FileFinderTest.cpp, tests/FontManagerTest.cpp, tests/check-conv: + fixed segfaults in tests + +2010-04-23 Martin Gieseking <mgieseki@users.sourceforge.net> + + * NEWS, configure.ac, src/Doxyfile: + set version to 0.9.1 + +2010-04-22 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/CommandLine.cpp, src/options.xml: + output of option --help: replaced '(default: FOO)' by '[FOO]' + + * src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, + src/SVGTree.cpp, src/SVGTree.h, src/XMLNode.cpp, src/XMLNode.h: + ignore unused fonts in CSS styles list + + * src/SVGTree.cpp: + fixed broken validity when using SVG fonts + + * src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, + src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h: + print page count and page number of DVI page being processed + + * tests/check-conv, tests/frktest-wf-cmp.svg, tests/sample-wf-cmp.svg: + adapted conversion tests to new output format + +2010-04-20 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FontEncoding.cpp: + fixed memory bug in FontEncoding::encoding() + +2010-04-11 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac, src/Doxyfile: + set version to 0.9.1dev + + * src/DVIToSVGActions.cpp: + replaced wrong font pointer that could lead to segfaults + +2010-03-24 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Font.cpp, src/Font.h, src/dvisvgm.cpp: + moved some methods from PhysicalFontImpl to PysicalFont + + * doc/dvisvgm.txt.in, src/BoundingBox.cpp, src/BoundingBox.h, + src/CommandLine.cpp, src/CommandLine.h, src/DVIToSVG.cpp, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Font.cpp, src/Font.h, + src/GlyphTracerMessages.h, src/Makefile.am, src/dvisvgm.cpp, + src/options.xml: + added command-line option --exact + + * src/FontCache.cpp, src/Makefile.am, src/StreamWriter.cpp, + src/StreamWriter.h, src/TFM.cpp: + replaced local stream IO functions by StreamReader/StreamWriter methods + + * src/CmdLineParserBase.cpp, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, + src/FontEngine.cpp, src/GlyphTracerMessages.h, src/Message.cpp, + src/Message.h, src/MetafontWrapper.cpp, src/dvisvgm.cpp: + added class MessageStream, updated message output + + * src/FontCache.cpp, src/GFGlyphTracer.cpp, src/GFReader.cpp: + variable _fontname is now correctly set in class FontCache + + * NEWS, configure.ac, src/Doxyfile: + set version to 0.9 + + * tests/frktest-nf-cmp.svg, tests/frktest-wf-cmp.svg, + tests/sample-nf-cmp.svg, tests/sample-wf-cmp.svg: + updated conversion tests + +2010-03-18 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVG.cpp, src/SVGTree.cpp: + moved creation of SVG 'use' elements from class DVIToSVG to class + SVGTree + + * src/DVIToSVG.cpp, src/Font.cpp, src/Font.h, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.h, src/SVGTree.cpp, src/SVGTree.h: + added class GFGlyphTracer::Callback providing an interface used to print + status information about the tracer + + * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h: + added evaluation of boolean and char arguments to the command-line + parser + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/DVIToSVG.cpp, src/DVIToSVG.h, src/Font.cpp, src/Font.h, + src/dvisvgm.cpp, src/options.xml, tests/CommandLineTest.cpp: + reactivated option --trace-all, and added optional argument 'retrace' to + it + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/Font.cpp, src/Font.h, src/dvisvgm.cpp, src/options.xml: + added command-line option --keep + +2010-03-17 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/GFReader.cpp, src/GFReader.h: + replaced GFReader messages by exceptions + + * src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/DVIToSVG.cpp, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Font.cpp, src/Font.h, + src/Makefile.am, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/SVGTree.cpp, + src/SVGTree.h: + removed class CharmapTranslator + + * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, + src/DVIToSVGActions.cpp, src/FontManager.cpp, src/FontManager.h, + src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/SVGTree.cpp, + src/SVGTree.h, src/VFReader.h, tests/FontManagerTest.cpp: + made FontManager a singleton + + * src/FontCache.cpp, src/FontCache.h: + added method FontCache::write(const char *dir) that updates the cache + file of the current font + + * src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/Font.cpp, + src/Font.h, src/FontEmitter.h, src/GFGlyphTracer.h, src/Makefile.am, + src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/SVGTree.cpp, + src/SVGTree.h, src/dvisvgm.cpp, tests/Makefile.am, tests/check-conv, + tests/create-makefile: + removed emitter classes; incorporated their functionality into SVGTree + and PhysicalFontImpl + + * src/BoundingBox.cpp, src/Calculator.cpp, src/Matrix.cpp, + src/PSInterpreter.cpp, src/PSInterpreter.h: + fixed a couple of comments + +2010-02-26 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Font.cpp, src/FontCache.cpp, src/FontCache.h, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h: + refactorings of GF tracer class; removed transferGlyph() + +2010-02-21 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Font.h, src/FontEncoding.cpp, src/FontEncoding.h, + src/FontManager.cpp, src/FontManager.h, src/SVGFontEmitter.cpp: + moved method encoding() from class FontManager to class FontEncoding + + * src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/Font.cpp, + src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEngine.cpp, + src/FontEngine.h, src/Glyph.cpp, src/Glyph.h, src/Makefile.am, + src/SVGFontEmitter.cpp, src/SVGFontEmitter.h: + removed class Glyph and incorporated its functionality into Font class + +2010-02-05 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac, src/Doxyfile: + set version to 0.8.9dev + + * src/psdefs.psc: + removed PS error handler nocurrentpoint + + * src/DVIToSVG.cpp: + added evaluation of literal PS headers to PSHeaderActions + +2010-02-02 Martin Gieseking <mgieseki@users.sourceforge.net> + + * NEWS, configure.ac, src/Doxyfile: + version updated to 0.8.8 + +2010-02-01 Martin Gieseking <mgieseki@users.sourceforge.net> + + * tests/check-conv: + skip conversion checks by default + +2010-01-31 Martin Gieseking <mgieseki@users.sourceforge.net> + + * tests/Makefile.am, tests/check-conv, tests/create-makefile, + tests/frktest-nf-cmp.svg, tests/frktest-wf-cmp.svg, tests/frktest.dvi, + tests/normalize.xsl, tests/sample-nf-cmp.svg, tests/sample-wf-cmp.svg, + tests/sample.dvi: + added tests to check conversion results + + * tests/normalize.xsl: + some improvements to normalize.xsl + +2010-01-29 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/CommandLine.cpp, + src/CommandLine.h: + removed CmdLineParserBase::numOptions() + + * src/GraphicPath.h: + fixed scaling bug in computation of glyph paths when using -n + +2010-01-24 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/FontCache.h, src/dvisvgm.cpp, src/options.dtd, src/options.xml: + added command-line option --libgs + +2010-01-18 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/CommandLine.cpp, src/options.dtd, src/options.xml: + added DTD for options.xml + +2010-01-17 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac: + updated type of kpathsea_version_string (patch by lomov_vl) + + * fedora/dvisvgm-gs.patch, fedora/dvisvgm-potrace.patch, + fedora/dvisvgm.spec: + removed fedora directory + + * doc/dvisvgm.txt.in, src/BoundingBox.cpp, src/BoundingBox.h, + src/DVIToSVG.cpp, tests/BoundingBoxTest.cpp, tests/Makefile.am: + added support for enlarging the minimal bbox by a given amount. + + * Makefile.am, README, configure.ac, doc/dvisvgm.txt.in, + src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, + src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, + src/Calculator.cpp, src/Calculator.h, src/CharmapTranslator.cpp, + src/CharmapTranslator.h, src/CmdLineParserBase.cpp, + src/CmdLineParserBase.h, src/Color.cpp, src/Color.h, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, + src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DLLoader.h, + src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, + src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/Directory.cpp, src/Directory.h, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/FileFinder.cpp, + src/FileFinder.h, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, + src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEmitter.h, + src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, + src/FontEngine.h, src/FontManager.cpp, src/FontManager.h, + src/FontMap.cpp, src/FontMap.h, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, + src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/Glyph.cpp, + src/Glyph.h, src/GraphicPath.h, src/InputBuffer.cpp, src/InputBuffer.h, + src/InputReader.cpp, src/InputReader.h, src/Length.cpp, src/Length.h, + src/Makefile.am, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, + src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, + src/MetafontWrapper.h, src/PSInterpreter.cpp, src/PSInterpreter.h, + src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/SVGTree.cpp, + src/SVGTree.h, src/SpecialActions.h, src/SpecialHandler.h, + src/SpecialManager.cpp, src/SpecialManager.h, src/StreamCounter.h, + src/StreamReader.cpp, src/StreamReader.h, src/TFM.cpp, src/TFM.h, + src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/VFActions.h, + src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, + src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, + src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, + src/dvisvgm.cpp, src/macros.h, src/options.xml, src/psdefs.psc, + src/types.h, tests/BoundingBoxTest.cpp, tests/CalculatorTest.cpp, + tests/ColorSpecialTest.cpp, tests/CommandLineTest.cpp, + tests/DirectoryTest.cpp, tests/FileFinderTest.cpp, + tests/FontManagerTest.cpp, tests/FontMapTest.cpp, + tests/GraphicPathTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, + tests/MatrixTest.cpp, tests/PageSizeTest.cpp, + tests/SplittedCharInputBufferTest.cpp, tests/StreamCounterTest.cpp, + tests/StreamInputBufferTest.cpp, tests/VectorStreamTest.cpp, + tests/create-makefile: + updated boilerplates + + * doc/dvisvgm.txt.in, src/FileFinder.cpp, src/Ghostscript.cpp, + src/Ghostscript.h, src/dvisvgm.cpp: + environment variable LIBGS can now be used to set the name of the GS + shared library + + * NEWS: + updated NEWS + + * src/Ghostscript.cpp: + fixed typo in variable name + +2009-12-16 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/InputReader.cpp: + fixed bug in InputReader::parseUInt() + +2009-12-15 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac, src/dvisvgm.cpp: + appied get_time patch sent by Peter Breitenlohner + +2009-12-02 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/BoundingBox.h, src/Calculator.h, src/CharmapTranslator.h, + src/DVIReader.h, src/DVIToSVG.h, src/DVIToSVGActions.h, src/Font.h, + src/FontEngine.h, src/FontManager.h, src/FontMap.h, src/GFGlyphTracer.h, + src/GFReader.h, src/MessageException.h, src/MetafontWrapper.h, + src/PageSize.h, src/SVGTree.cpp, src/SVGTree.h, src/StreamReader.h, + src/VFActions.h, src/VFReader.h, src/XMLDocTypeNode.h, src/XMLDocument.h, + src/XMLNode.h, src/XMLString.h: + removed using statements from header files + +2009-11-25 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/FontCache.cpp, src/FontCache.h, src/FontEngine.cpp, + src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, + src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFTracer.cpp, + src/Glyph.cpp, src/Glyph.h, src/GraphicPath.h, src/Makefile.am, + src/Pair.h, src/SVGFontEmitter.cpp, src/SVGFontTraceEmitter.cpp, + tests/GraphicPathTest.cpp: + removed FEGlyphCommands and replaced separate glyph class implementation + by class GraphicPath + +2009-11-18 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVG.cpp, src/Ghostscript.cpp, src/Ghostscript.h: + replaced #if !DISABLE_GS by #if !defined(DISABLE_GS) (Peter + Breitenlohner) + + * src/Ghostscript.cpp, src/Ghostscript.h: + replaced #if HAVE_LIBGS by #if defined(HAVE_LIBGS) + + * src/DLLoader.cpp, src/DLLoader.h: + fixed line endings + +2009-11-17 Martin Gieseking <mgieseki@users.sourceforge.net> + + * configure.ac, fedora/dvisvgm.spec, src/Doxyfile: + set version number to 0.8.8dev + + * potracelib/potracelib.c, potracelib/potracelib.h: + replaced outdated string constant type char* by const char* in + potrace_version() + + * src/Color.cpp, src/ColorSpecialHandler.cpp, src/FontManager.cpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, + src/TpicSpecialHandler.cpp: + added explicit casts to avoid compiler warnings (Peter Breitenlohner) + + * src/InputReader.cpp: + added missing initialization value (Peter Breitenlohner) + + * src/CmdLineParserBase.h, src/GraphicPath.h, src/InputReader.h, + src/Makefile.am, src/PSInterpreter.h, src/SpecialManager.h: + added missing virtual destructors to avoid warnings + + * src/dvisvgm.cpp: + don't use email adress PACKAGE_BUGREPORT for copyright notice + + * NEWS: + updated NEWS + +2009-11-09 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVG.cpp, src/dvisvgm.cpp: + added total number of pages to message text + + * NEWS, src/Color.cpp, src/Color.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/SVGTree.cpp: + PS handler: colors set by color specials are now considered properly + + * configure.ac, fedora/dvisvgm.spec, src/Doxyfile: + set version to 0.8.7 + +2009-11-06 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/GraphicPath.h, src/PsSpecialHandler.cpp: + PS handler: replace zero-length paths by dots + + * NEWS, doc/dvisvgm.txt.in: + updated NEWS and manpage + + * NEWS, src/PsSpecialHandler.cpp: + fixed path scaling issue in PS handler + +2009-10-29 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DVIToSVGActions.cpp, src/Font.cpp, src/Font.h: + fixed positioning of italic characters + +2009-10-25 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/DvisvgmSpecialHandler.cpp: + added macro {?nl} to dvisvgm:raw evaluator + +2009-10-18 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/Font.cpp, src/TFM.cpp, src/TFM.h: + added italic correction values to character widths + +2009-10-16 Martin Gieseking <mgieseki@users.sourceforge.net> + + * tests/Makefile.am, tests/create-makefile: + added script to create tests/Makefile.am + + * configure.ac, src/Doxyfile: + increased version to 0.8.7dev + +2009-10-13 Martin Gieseking <mgieseki@users.sourceforge.net> + + * doc/Makefile.am, doc/dvisvgm.txt.in: + removed outdated post-processing of manpage + + * fedora/dvisvgm.spec: + updated spec file + + * doc/Makefile.am: + added missing dvi suffix in Makefile target dvi-pdf + + * README, tests/CalculatorTest.cpp, tests/CalculatorTest.h, + tests/ColorSpecialTest.cpp, tests/ColorSpecialTest.h, + tests/CommandLineTest.cpp, tests/CommandLineTest.h, + tests/DirectoryTest.cpp, tests/DirectoryTest.h, tests/FileFinderTest.cpp, + tests/FileFinderTest.h, tests/FontManagerTest.cpp, + tests/FontManagerTest.h, tests/FontMapTest.cpp, tests/FontMapTest.h, + tests/GraphicPathTest.cpp, tests/GraphicPathTest.h, tests/LengthTest.cpp, + tests/LengthTest.h, tests/Makefile.am, tests/MatrixTest.cpp, + tests/MatrixTest.h, tests/PageSizeTest.cpp, tests/PageSizeTest.h, + tests/SplittedCharInputBufferTest.cpp, + tests/SplittedCharInputBufferTest.h, tests/StreamCounterTest.cpp, + tests/StreamCounterTest.h, tests/StreamInputBufferTest.cpp, + tests/StreamInputBufferTest.h, tests/VectorStreamTest.cpp, + tests/VectorStreamTest.h: + replaced cxxtest by googletest + +2009-10-12 Martin Gieseking <mgieseki@users.sourceforge.net> + + * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, + src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, + src/Calculator.cpp, src/Calculator.h, src/CharmapTranslator.cpp, + src/CharmapTranslator.h, src/CmdLineParserBase.cpp, + src/CmdLineParserBase.h, src/Color.cpp, src/Color.h, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DLLoader.cpp, + src/DLLoader.h, src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, + src/DVIReader.h, src/DVIToSVG.h, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/Directory.cpp, src/Directory.h, + src/DvisvgmSpecialHandler.h, src/EmSpecialHandler.cpp, + src/EmSpecialHandler.h, src/FileFinder.cpp, src/FileFinder.h, + src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, src/Font.h, + src/FontCache.cpp, src/FontCache.h, src/FontEmitter.h, + src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, + src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, + src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, + src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, + src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/Ghostscript.cpp, + src/Ghostscript.h, src/GraphicPath.h, src/InputBuffer.cpp, + src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, + src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, + src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, + src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageSize.cpp, + src/PageSize.h, src/Pair.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, + src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, + src/SpecialManager.h, src/StreamCounter.h, src/StreamReader.cpp, + src/StreamReader.h, src/TFM.cpp, src/TFM.h, src/TpicSpecialHandler.cpp, + src/TpicSpecialHandler.h, src/VFActions.h, src/VFReader.cpp, + src/VFReader.h, src/VectorStream.h, src/XMLDocTypeNode.h, + src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, + src/XMLString.cpp, src/XMLString.h, src/macros.h, src/types.h: + code cleanup + +2009-10-11 Martin Gieseking <mgieseki@users.sourceforge.net> + + * autogen.sh: + fixed file permissions of autogen.sh + + * src/DVIToSVG.cpp, src/DvisvgmSpecialHandler.cpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SVGTree.cpp, + src/SVGTree.h: + suppress empty style and transformation elements + + * NEWS: + NEWS updated + +2009-10-10 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + scale clipping paths by 72.27/72 + +2009-10-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/Bitmap.h: + fixed bit shift overflow in Bitmap class occured on 64-bit systems + + * autogen.sh, prepare: + prepare script replaced by autogen.sh + + * doc/dvisvgm.txt.in: + fixed formatting of manual page + + * src/Length.cpp, src/Length.h, tests/LengthTest.h: + fixed unit conversion bug + + * src/Makefile.am: + fixed Makefile + +2009-10-08 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, doc/dvisvgm.txt.in, src/BoundingBox.cpp, src/CommandLine.cpp, + src/CommandLine.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/dvisvgm.cpp, + src/options.xml, tests/CommandLineTest.h, tests/Makefile.am: + cmdline parameter --bbox can now be used to set the absolute bounding + box + + * NEWS, src/GraphicPath.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h: + PS clipping path sequences and intersections are now handled correctly + + * src/MetafontWrapper.cpp: + fixed file permissions + + * src/dvisvgm.cpp: + fixed uncaught PageSizeException + +2009-10-07 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, doc/dvisvgm.txt.in, src/BoundingBox.cpp, src/BoundingBox.h, + src/DvisvgmSpecialHandler.cpp: + added the special variant 'dvisvgm:bbox abs' and 'dvisvgm:bbox fix' + + * src/BoundingBox.cpp, src/BoundingBox.h, src/Length.cpp, src/Length.h, + src/Makefile.am, tests/LengthTest.h: + class Length provides length unit calculations + +2009-10-06 Martin Gieseking <martin.gieseking@uos.de> + + * src/BoundingBox.cpp, src/BoundingBox.h, src/GraphicPath.h, + src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/psdefs.psc: + fixed some PS bounding box and positioning issues introduced by previous + changesets + + * NEWS, configure.ac, fedora/dvisvgm.spec, src/Doxyfile: + set version to 0.8.6 + +2009-10-05 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + convert PS path coordinated to TeX point units + + * NEWS, src/PsSpecialHandler.cpp: + fixed another positioning bug reported by John Bowman + +2009-10-04 Martin Gieseking <martin.gieseking@uos.de> + + * src/GraphicPath.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: + corrected positioning bug introduced with previous PS positioning fix + +2009-10-02 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am, doc/dvisvgm.txt.in: + generate pdf manpage directly with groff; adapted manpage source to work + with latest asciidoc + +2009-10-01 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am, doc/dvisvgm.txt.in: + replaced backticks in manpage by apostrophes; updated date on homepage + +2009-09-30 Martin Gieseking <martin.gieseking@uos.de> + + * src/DvisvgmSpecialHandler.cpp: + added optional depth parameter to special dvisvgm:raw + + * doc/dvisvgm.txt.in: + added dvisvgm:raw example to man page + + * LGPL-2.1.txt, NEWS, README: + updated README and NEWS, and added file with LGPL license text + + * Makefile.am, configure.ac, fedora/dvisvgm.spec, src/Doxyfile: + increased version number to 0.8.5 + +2009-09-17 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS: + added cretdit to John Bowman for sending a patch for the already fixed + clipping bug + + * src/PsSpecialHandler.h: + increased the default linewidth to 0.5 + + * fedora/dvisvgm.spec: + updated spec file and fixed typo on website + + * doc/dvisvgm.txt.in: + minor changes of the documentation + +2009-09-11 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, src/CmdLineParserBase.cpp, src/FontCache.cpp, + src/SVGFontTraceEmitter.cpp: + fixed memory bug in tracer module (issue #21) + + * NEWS, doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/SpecialManager.cpp, + src/SpecialManager.h, src/dvisvgm.cpp, src/options.xml: + added option --progress for enabling a progress indicator (feature #22) + + * src/FileSystem.cpp, src/MetafontWrapper.cpp: + Windows: Metafont is now called via CreateProcess() + +2009-09-10 Martin Gieseking <martin.gieseking@uos.de> + + * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DVIToSVG.cpp, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SpecialHandler.h, + src/SpecialManager.cpp, src/TpicSpecialHandler.cpp, + src/TpicSpecialHandler.h: + refactored prefixes methods of the SpecialHandlers (ticket #20) + + * NEWS, doc/dvisvgm.txt.in, src/FileSystem.cpp, src/FileSystem.h, + src/FontCache.cpp, src/FontCache.h, src/dvisvgm.cpp: + option --cache prints additional information about the cached fonts + (feature #7) + + * src/FileSystem.cpp, src/FontCache.cpp: + fixed Windows-related bug in FileSystem::collect + +2009-09-06 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, README: + updated NEWS and README + +2009-09-04 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, fedora/dvisvgm.spec, src/Doxyfile: + increased version number to 0.8.4 + + * src/BoundingBox.cpp, src/BoundingBox.h, src/PsSpecialHandler.cpp: + linewidths are now considered properly in computation of bounding box + (issue #13) + + * src/dvisvgm.cpp: + fixed evaluation of option --help + + * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/CommandLine.cpp, + src/InputBuffer.h, src/InputReader.h, src/psdefs.psc, + tests/CommandLineTest.h: + improved the command line parser to make it more POSIX-compliant + (feature #17) + +2009-09-01 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp, src/psdefs.psc: + fixed flattened clipping path bug (issue #11) + +2009-08-31 Martin Gieseking <martin.gieseking@uos.de> + + * src/Makefile.am: + added error checks; disallow numeric optional arguments w/o default + value + +2009-08-28 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, src/PSInterpreter.cpp, src/PsSpecialHandler.cpp, src/dvisvgm.cpp, + src/psdefs.psc: + added evaluation of PS 'show' operator in order to evaluate PSTricks + Type 3 fonts properly + + * fedora/dvisvgm.spec: + updated spec file and homepage to latest release + +2009-08-27 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, configure.ac, doc/dvisvgm.txt.in, src/CmdLineParserBase.cpp, + src/CommandLine.cpp, src/Doxyfile, src/dvisvgm.cpp, src/getopt.c, + src/getopt.h, src/getopt1.c, src/options.xml: + replaced option --cache=? by --cache; increased version number to 0.8.3 + +2009-08-26 Martin Gieseking <martin.gieseking@uos.de> + + * fedora/dvisvgm-0.8.1-potrace.patch, fedora/dvisvgm-gs.patch, + fedora/dvisvgm-potrace.patch, fedora/dvisvgm.spec: + updated Fedora files + + * configure.ac, fedora/dvisvgm.spec, src/Ghostscript.cpp, + src/Ghostscript.h, src/Makefile.am: + improved Ghostscript and potrace linking checks to simplify usage of + external devel files + + * NEWS, configure.ac, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/PsSpecialHandler.cpp, + src/SpecialManager.cpp, src/SpecialManager.h: + PS prologue files referenced in first page are now always loaded + +2009-08-24 Martin Gieseking <martin.gieseking@uos.de> + + * src/CommandLine.cpp, src/CommandLine.h: + speed up printing help by using puts() instead of C++ streams + +2009-08-21 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontMap.cpp: + fixed memory bug in FontMap + + * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Makefile.am, + src/dvisvgm.cpp, src/options.xml, tests/CommandLineTest.h, + tests/Makefile.am: + improved CmdLineParserBase and replaced gengetopt-based parser + + * NEWS, configure.ac, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, + src/Doxyfile: + increased version number to 0.8.2 + +2009-08-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/InputReader.cpp, src/InputReader.h: + added method parseUInt() + + * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/options.xml: + added files for replacement of gengetopt (not active yet) + + * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h: + finished cmdline parser + + * COPYING: + added copy of file COPYING + +2009-08-17 Martin Gieseking <martin.gieseking@uos.de> + + * tests/Makefile.am: + added include path to fix broken distcheck + + * COPYING, LICENSE, Makefile.am, README, doc/dvisvgm.txt.in, + src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, + src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, + src/Calculator.cpp, src/Calculator.h, src/CharmapTranslator.cpp, + src/CharmapTranslator.h, src/Color.cpp, src/Color.h, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DLLoader.cpp, + src/DLLoader.h, src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, + src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Directory.cpp, + src/Directory.h, src/DvisvgmSpecialHandler.cpp, + src/DvisvgmSpecialHandler.h, src/EmSpecialHandler.cpp, + src/EmSpecialHandler.h, src/FileFinder.cpp, src/FileFinder.h, + src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, src/Font.h, + src/FontCache.cpp, src/FontCache.h, src/FontEmitter.h, + src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, + src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, + src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, + src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, + src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/Ghostscript.cpp, + src/Ghostscript.h, src/GraphicPath.h, src/InputBuffer.cpp, + src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, + src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, + src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, + src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageSize.cpp, + src/PageSize.h, src/Pair.h, src/PsSpecialHandler.cpp, + src/PsSpecialHandler.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/SVGTree.cpp, + src/SVGTree.h, src/SpecialActions.h, src/SpecialHandler.h, + src/SpecialManager.cpp, src/SpecialManager.h, src/StreamCounter.h, + src/StreamReader.cpp, src/StreamReader.h, src/TFM.cpp, src/TFM.h, + src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/VFActions.h, + src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, + src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, + src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, + src/dvisvgm.cpp, src/inttypes.h, src/macros.h, src/psdefs.psc, + src/types.h, tests/CalculatorTest.h, tests/ColorSpecialTest.h, + tests/DirectoryTest.h, tests/FileFinderTest.h, tests/FontManagerTest.h, + tests/FontMapTest.h, tests/GraphicPathTest.h, tests/MatrixTest.h, + tests/PageSizeTest.h, tests/SplittedCharInputBufferTest.h, + tests/StreamCounterTest.h, tests/StreamInputBufferTest.h, + tests/VectorStreamTest.h: + changed license to GPL version 3 or later + +2009-08-10 Martin Gieseking <martin.gieseking@uos.de> + + * fedora/dvisvgm-0.8.1-potrace.patch, fedora/dvisvgm.spec: + added spec file and patch for Fedora builds + + * Makefile.am, configure.ac, src/Makefile.am, src/tests/CalculatorTest.h, + src/tests/ColorSpecialTest.h, src/tests/DirectoryTest.h, + src/tests/FileFinderTest.h, src/tests/FontManagerTest.h, + src/tests/FontMapTest.h, src/tests/GraphicPathTest.h, + src/tests/MatrixTest.h, src/tests/PageSizeTest.h, + src/tests/SplittedCharInputBufferTest.h, src/tests/StreamCounterTest.h, + src/tests/StreamInputBufferTest.h, src/tests/VectorStreamTest.h, + src/tests/dvipdfm_test.map, src/tests/dvips_test.map, + tests/CalculatorTest.h, tests/ColorSpecialTest.h, tests/DirectoryTest.h, + tests/FileFinderTest.h, tests/FontManagerTest.h, tests/FontMapTest.h, + tests/GraphicPathTest.h, tests/Makefile.am, tests/MatrixTest.h, + tests/PageSizeTest.h, tests/SplittedCharInputBufferTest.h, + tests/StreamCounterTest.h, tests/StreamInputBufferTest.h, + tests/VectorStreamTest.h, tests/dvipdfm_test.map, tests/dvips_test.map: + moved tests from src/tests to ./tests + + * tests/Makefile.am: + added generated file test-all.cpp to CLEANFILES + +2009-08-02 Martin Gieseking <martin.gieseking@uos.de> + + * LICENSE, Makefile.am, src/Ghostscript.cpp: + modified package to be compatible with prerequisites of Fedora + +2009-07-30 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, src/DVIToSVG.cpp: + added target triplet to version string in SVG output + + * src/DVIToSVGActions.cpp, src/Ghostscript.cpp, src/Ghostscript.h, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: + added Ghostscript revision info to output of dvisvgm -l + +2009-07-29 Martin Gieseking <martin.gieseking@uos.de> + + * src/psdefs.psc: + added vim tag to psdefs.psc + +2009-07-28 Martin Gieseking <martin.gieseking@uos.de> + + * src/PsSpecialHandler.cpp: + added evaluation of more psfile parameters; fixed psfile bounding box + bug + + * NEWS, configure.ac, src/Doxyfile: + updated version number to 0.8.1 + + * NEWS, src/FileSystem.cpp, src/FontEngine.cpp, src/FontManager.cpp, + src/Ghostscript.cpp, src/PageSize.cpp, src/dvisvgm.cpp: + fixed bug related to unsigned/size_t mismatch on x64 systems + + * src/psdefs.psc: + cleaned up VC++ build files; added batch file to generate cmdline.c; + added generated file psdefs.psc for convenience + +2009-07-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/DLLoader.cpp, src/InputReader.cpp, src/PSInterpreter.cpp: + changes to make VC happy; fixed potential memory bug + + * NEWS, README: + fixed typos; updated homepage/manpage + + * src/DVIReader.h, src/InputBuffer.cpp, src/InputBuffer.h, + src/InputReader.cpp, src/InputReader.h, src/Matrix.cpp, src/Matrix.h, + src/PSInterpreter.h: + replaced size_t parameters by unsigned + +2009-07-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/PSInterpreter.cpp: + some clean-ups + +2009-07-22 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, README, doc/dvisvgm.txt.in, src/BoundingBox.cpp, + src/BoundingBox.h, src/GraphicPath.h, src/PSInterpreter.cpp, + src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: + fixed clipping bug; updated homepage, README, NEWS + + * src/TpicSpecialHandler.cpp: + fixed reintroduced bug in TPIC handler + +2009-07-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/DvisvgmSpecialHandler.cpp, src/InputBuffer.cpp, src/InputReader.cpp, + src/InputReader.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, + src/tests/StreamInputBufferTest.h: + implemented psfile special; fixed some bugs + + * src/PsSpecialHandler.cpp, src/SVGTree.cpp: + fixed bbox bug; added missing file + +2009-07-19 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, doc/dvisvgm.txt.in, src/BoundingBox.cpp, + src/BoundingBox.h, src/Color.cpp, src/Color.h, src/DLLoader.cpp, + src/DLLoader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Doxyfile, + src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, + src/FileFinder.cpp, src/FontEncoding.cpp, src/Ghostscript.cpp, + src/Ghostscript.h, src/GraphicPath.h, src/InputBuffer.cpp, + src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, + src/Makefile.am, src/Matrix.cpp, src/Matrix.h, src/PSInterpreter.cpp, + src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, + src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/SVGTree.h, + src/SpecialActions.h, src/TpicSpecialHandler.cpp, + src/TransformationMatrix.cpp, src/TransformationMatrix.h, + src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, + src/iapi.h, src/ierrors.h, src/tests/GraphicPathTest.h, + src/tests/MatrixTest.h, src/tests/SplittedCharInputBufferTest.h, + src/tests/StreamInputBufferTest.h: + transplanted PS functionality to default branch + +2009-06-01 Martin Gieseking <martin.gieseking@uos.de> + + * src/GFReader.cpp, src/GFReader.h: + removed error method, use Message::estream instead + + * src/InputBuffer.cpp, src/InputBuffer.h, src/Makefile.am: + transplanted changes to InputBuffer from branch 'pages' + + * src/Bitmap.cpp, src/Bitmap.h: + transplanted changes to Bitmap from branch 'pages' + + * src/DVIReader.cpp, src/DVIReader.h: + transplanted changes to DVIReader from branch 'pages' + + * src/FileSystem.cpp, src/FileSystem.h: + transplanted changes to FileSystem from branch 'pages' + + * src/VFReader.cpp: + transplanted changes to VFReader from branch 'pages' + + * src/GFTracer.cpp: + transplanted changes to GFTracer from branch 'pages' + + * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, + src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, + src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/SpecialHandler.h, + src/SpecialManager.cpp, src/SpecialManager.h, src/TpicSpecialHandler.cpp, + src/TpicSpecialHandler.h: + transplanted changes to SpecialHandlers from branch 'pages' + +2009-04-24 Martin Gieseking <martin.gieseking@uos.de> + + * src/TpicSpecialHandler.cpp: + fixed TPIC handler bug that could caused unwanted color fills of + ellipses due to a missing call of reset() + + * NEWS, configure.ac, src/Doxyfile: + increased version number to 0.7.3 + + * src/FontCache.h: + increased version of font cache files to ensure their recreation due to + the previously fixed shorthand path command bug + +2009-04-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontGlyph.cpp: + fixed bug in computation of shorthand path command + +2009-04-06 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontMap.cpp: + fixed bug in FontMap that causes a segfault if extension in given font + file is missing (reported by Armin Geisse) + +2009-04-02 Martin Gieseking <martin.gieseking@uos.de> + + * configure.ac, doc/dvisvgm.txt.in, src/MetafontWrapper.cpp, + src/dvisvgm.cpp: + prepared release 0.7.2 (removed inclusions of debug.h, adapted homepage + and manpage) + +2009-03-31 Martin Gieseking <martin.gieseking@uos.de> + + * src/MetafontWrapper.cpp, src/MetafontWrapper.h: + ported fix in MetafontWrapper back to default branch + +2009-03-25 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVG.cpp, src/DVIToSVG.h, src/FontGlyph.cpp, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/dvisvgm.cpp: + replaced Metafont magnification variable and its setters by a public + class variable + + * src/Doxyfile: + added doxygen files + + * src/SVGFontTraceEmitter.cpp: + fixed closing bracket "bug" when writing the currently traced character + to the terminal + +2009-03-24 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, src/FontCache.cpp, src/FontGlyph.cpp, src/FontGlyph.h, + src/GFGlyphTracer.cpp, src/Pair.h, src/SVGFontEmitter.cpp: + use of shorthand path commands has been implemented + + * src/FontGlyph.cpp: + fixed potential bug in Glyph::optimizeCommands() + + * src/FontGlyph.cpp: + fixed memory bug in Glyph::optimizeCommands() + +2009-03-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontCache.cpp: + cache files are being compressed now to reduce the file size + +2009-03-19 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, doc/dvisvgm.txt.in, src/FontEmitter.h, src/GFGlyphTracer.cpp, + src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/dvisvgm.cpp, + src/options.ggo: + added option --trace-all that forces tracing of all glyphs of all + currently used bitmap fonts + + * src/FontCache.cpp, src/SVGFontTraceEmitter.cpp: + don't read existing cache file if --trace-all is given (trace complete + font and then write cache file instead) + +2009-03-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontCache.cpp: + fixed bug in read/write functions of FontCache + + * src/DVIToSVG.cpp, src/TFM.cpp, src/TFM.h: + added firstChar()/lastChar() to TFM class, removed unnecessary mag + member variable and its setter + +2009-03-17 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/FileSystem.cpp, + src/FileSystem.h, src/FontCache.cpp, src/FontCache.h, src/FontGlyph.h, + src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/Makefile.am, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/dvisvgm.cpp: + completed font caching support + + * doc/dvisvgm.txt.in, src/dvisvgm.cpp: + added option variant --cache=? to display the default cache directory + + * src/FontCache.cpp: + reduced size of cache file format by using variable integer sizes + +2009-03-16 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, configure.ac, doc/dvisvgm.txt.in, src/DVIToSVG.cpp, + src/FileSystem.cpp, src/FileSystem.h, src/FontCache.cpp, src/FontCache.h, + src/FontGlyph.cpp, src/FontGlyph.h, src/GFGlyphTracer.cpp, + src/GFGlyphTracer.h, src/GFTracer.cpp, src/options.ggo: + first additions to support font caching; not working yet + +2009-03-11 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/FontEmitter.h, src/SVGFontEmitter.cpp, + src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, + src/SVGFontTraceEmitter.h: + improved font embedding algorithm in case of --no-fonts (identical + glyphs in different sizes are now referenced rather than duplicated) + +2009-03-10 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/Font.h, + src/SVGFontEmitter.cpp, src/SVGFontTraceEmitter.cpp: + all glyph sizes are now computed correctly in conjuction with option + --no-fonts + +2009-03-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/BgColorSpecialHandler.cpp, src/SpecialManager.cpp, + src/TpicSpecialHandler.cpp: + adapted Code to make VC happy + + * src/types.h: + minor changes to homepage and .hgignore + + * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp: + fixed transformation bug (transformations are now applied properly to + the page) + +2009-03-08 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, README, src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, + src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, src/Makefile.am, + src/TpicSpecialHandler.cpp: + added bgcolor support, updated homepage, fixed color handler bug + + * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h: + added missing background color handler + +2009-03-06 Martin Gieseking <martin.gieseking@uos.de> + + * src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h: + implemented arc drawing of tpic special set + + * src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h: + implemented splines of tpic specials + +2009-03-03 Martin Gieseking <martin.gieseking@uos.de> + + * src/BoundingBox.cpp, src/BoundingBox.h, src/Color.cpp, + src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DVIActions.h, + src/DVIBBoxActions.h, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/EmSpecialHandler.cpp, + src/Makefile.am, src/SpecialActions.h, src/SpecialHandler.h, + src/TpicSpecialHandler.cpp: + improved computation of the bounding box (works with specials now); + added dummy function for background color assignments + + * doc/Makefile.am, doc/dvisvgm.txt.in, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/DvisvgmSpecialHandler.cpp, + src/DvisvgmSpecialHandler.h, src/InputBuffer.cpp, src/InputBuffer.h, + src/SpecialActions.h: + implemented the dvisvgm specials raw, image, and bbox + + * doc/dvisvgm.txt.in, src/DvisvgmSpecialHandler.cpp, + src/DvisvgmSpecialHandler.h: + minor code improvements; comments added + +2009-02-26 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am, doc/dvisvgm.txt, doc/dvisvgm.txt.in: + removed generated file, added dvisvgm.txt.in + + * doc/Makefile.am, doc/dvisvgm.txt.in: + improved manpage + +2009-02-25 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, + src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, + src/SpecialActions.h, src/TpicSpecialHandler.cpp: + renamed appendInPage() to appendToPage + +2009-02-24 Martin Gieseking <martin.gieseking@uos.de> + + * src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, + src/DVIToSVGActions.cpp, src/DvisvgmSpecialHandler.cpp, + src/DvisvgmSpecialHandler.h, src/EmSpecialHandler.cpp, + src/EmSpecialHandler.h, src/Makefile.am, src/SpecialColorHandler.cpp, + src/SpecialColorHandler.h, src/SpecialDvisvgmHandler.cpp, + src/SpecialDvisvgmHandler.h, src/SpecialEmHandler.cpp, + src/SpecialEmHandler.h, src/SpecialHandler.h, src/SpecialHtmlHandler.h, + src/SpecialManager.cpp, src/SpecialManager.h, + src/tests/ColorSpecialTest.h: + improved SpecialHandler is now able to handle unprefixed specials + + * NEWS, src/Color.cpp, src/Color.h, src/DVIToSVGActions.cpp, + src/Makefile.am, src/Pair.h, src/SpecialHandler.h, + src/SpecialManager.cpp, src/SpecialManager.h, src/TpicSpecialHandler.cpp, + src/TpicSpecialHandler.h: + first tpic implementations; not complete yet + + * NEWS, doc/dvisvgm.1.in, src/TpicSpecialHandler.cpp: + few additions to tpic handler + +2009-02-23 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, configure.ac, doc/dvisvgm.1.in, src/DVIBBoxActions.h, + src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/FontEmitter.h, src/FontEngine.cpp, + src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, + src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/XMLNode.cpp, + src/XMLNode.h, src/dvisvgm.cpp, src/options.ggo, + src/tests/ColorSpecialTest.h: + added option --no-fonts wich uses path elements instead of fonts + +2009-02-20 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, doc/dvisvgm.1.in, src/Color.cpp, src/Color.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Makefile.am, + src/SpecialActions.h, src/SpecialColorHandler.cpp, + src/SpecialDvisvgmHandler.cpp, src/SpecialDvisvgmHandler.h, + src/SpecialEmHandler.cpp, src/SpecialEmHandler.h, + src/SpecialHtmlHandler.h, src/VerbSpecialHandler.cpp, + src/VerbSpecialHandler.h: + fixed bug in color handler, added skeletons of dvisvgm/hyperref special + handlers + +2009-02-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/Color.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, + src/Makefile.am, src/SpecialActions.h, src/SpecialColorHandler.cpp, + src/SpecialEmHandler.cpp: + added color support to emTeX specials, removed Color class + + * NEWS, src/SpecialActions.h, src/tests/ColorSpecialTest.h: + adapted color test to new interface, added emtex info + +2009-02-17 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp: + made DVICommand local to executeCommand, removed unnecessary if + statement + +2009-02-14 Martin Gieseking <martin.gieseking@uos.de> + + * src/Color.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h: + finished color support + + * src/dvisvgm.cpp: + fixed incorrect behavior of option -V/--version + + * NEWS, configure.ac: + increased version number to 0.6.2, updated NEWS + + * doc/dvisvgm.1.in, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/dvisvgm.cpp, src/options.ggo: + added option --no-style + + * NEWS, configure.ac: + prepared release of version 0.7 + +2009-02-13 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile.am, configure.ac, src/tests/DirectoryTest.h: + removed rpm support + + * prepare: + added administrative files + + * src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h: + reverted to previous version, removed dependency on Color class + + * src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Makefile.am, + src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, + src/SpecialManager.h: + color specials are now processed by DVIToSVGActions, but don't create + any results yet + + * prepare: + updated administrative files + + * src/ColorSpecialHandler.cpp, src/Makefile.am, + src/tests/ColorSpecialTest.h: + added tests for ColorSpecialHandler + +2009-02-12 martin@xps <martin@xps> + + * src/inttypes.h: + added rudimentary files for writing of SWF files; not ready yet + +2009-02-10 Martin Gieseking <martin.gieseking@uos.de> + + * src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, + src/Makefile.am: + replaced RGB arrays by Color class + +2009-02-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/TransformationMatrix.cpp: + made y-coordinate of cmdline-option -t optional + +2009-02-06 Martin Gieseking <martin.gieseking@uos.de> + + * doc/dvisvgm.1.in, src/ColorSpecialHandler.h, src/DVIToSVG.cpp, + src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, + src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, + src/dvisvgm.cpp, src/options.ggo: + added option --list-specials that lists all registered special handlers + + * src/FileFinder.cpp: + changed lookup order of font maps + +2009-02-05 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/dvisvgm.cpp, src/options.ggo: + added optional prefix list to commandline option --no-specials + + * src/DVIToSVGActions.cpp: + replaced special ignore list evaluation algorithm + +2009-02-04 Martin Gieseking <martin.gieseking@uos.de> + + * src/FileFinder.cpp: + added option for additional loading of user maps + + * src/FontMap.cpp: + added output of font encoding in write method + +2009-02-03 Martin Gieseking <martin.gieseking@uos.de> + + * src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/SpecialHandler.h, + src/SpecialManager.cpp, src/SpecialManager.h, src/options.ggo: + more color special implementation (color constants), still not ready + + * src/FileFinder.cpp, src/FileFinder.h, src/dvisvgm.cpp: + option -m/--map-file is now evaluated properly + + * map/cork-lm.map: + removed deprecated map subdirectory + +2009-02-02 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, src/FileFinder.cpp: + fixed buggy call of maketfm/makemf in Windows version + + * src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/Makefile.am, + src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h: + added special support skeletons; not working yet + + * src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h: + some refactorings in color handler + +2009-01-30 Martin Gieseking <martin.gieseking@uos.de> + + * src/dvisvgm.cpp: + prevented writing zero-length svg files; simplified main code by using + auto pointers + + * NEWS, src/DVIReader.cpp, src/DVIReader.h: + fixed magnification bug + +2009-01-29 Martin Gieseking <martin.gieseking@uos.de> + + * src/FileFinder.cpp: + adapted Windows version to new release + +2009-01-28 Martin Gieseking <martin.gieseking@uos.de> + + * src/FileFinder.cpp, src/FileFinder.h, src/Makefile.am, + src/tests/DirectoryTest.h, src/tests/FileFinderTest.h, + src/tests/FontManagerTest.h, src/tests/KPSFileFinderTest.h: + refactored FileFinder (implementation as singleton) + + * src/dvisvgm.cpp: + use new initialisation of FileFinder + + * src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h: + improved GFTracer to support unscaled results + + * src/FontMap.cpp, src/Makefile.am, src/tests/FontMapTest.h, + src/tests/dvipdfm_test.map, src/tests/dvips_test.map: + extensions to FontMap almost complete but not finished yet + + * src/Calculator.cpp, src/DVIToSVG.cpp, src/FontEncoding.cpp, + src/FontMap.cpp, src/SVGFontEmitter.cpp, src/SVGFontTraceEmitter.cpp: + replaced comparisions with "" with calls of empty() + + * src/FileFinder.cpp, src/FontMap.cpp, src/FontMap.h, + src/tests/FontMapTest.h, src/tests/dvips_test.map: + FontMap now supports dvips and dvipdfm maps + + * NEWS, configure.ac, doc/dvisvgm.1.in: + adapted configuration and documentation to new dvips map file support + +2009-01-27 Martin Gieseking <martin.gieseking@uos.de> + + * src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFTracer.cpp, + src/GFTracer.h, src/Makefile.am, src/SVGFontTraceEmitter.cpp, + src/SVGFontTraceEmitter.h: + made GFTracer a generic class with template methods + +2009-01-26 Martin Gieseking <martin.gieseking@uos.de> + + * src/Bitmap.cpp, src/Bitmap.h, src/GFReader.cpp, src/GFReader.h, + src/GFTracer.cpp, src/Makefile.am: + improvements to GF handling, first skeletton of gf->metapost (gfprint) + + * src/InputBuffer.h: + fixed incompatible types bug + +2009-01-25 Martin Gieseking <martin.gieseking@uos.de> + + * src/InputBuffer.cpp, src/InputBuffer.h: + added missing include + + * src/FontMap.cpp, src/FontMap.h: + started redesign of FontMap, not complete yet + + * src/CharmapTranslator.cpp, src/DVIToSVG.cpp, src/FileFinder.cpp, + src/FileFinder.h, src/Font.cpp, src/FontEncoding.cpp, + src/FontManager.cpp, src/KPSFileFinder.cpp, src/KPSFileFinder.h, + src/Makefile.am, src/MetafontWrapper.cpp, src/TFM.cpp, src/dvisvgm.cpp: + renamed KPSFileFinder to FileFinder + + * src/FontMap.cpp: + basic dvips font map support, not complete yet + +2009-01-23 Martin Gieseking <martin.gieseking@uos.de> + + * doc/Makefile.am, doc/dvisvgm.1.in: + manpage updates + +2009-01-22 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontMap.cpp: + forgot to remove address operator + + * src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/dvisvgm.cpp: + added support for MiKTeX' new COM interface + + * src/DVIReader.cpp, src/FontManager.cpp, src/KPSFileFinder.cpp: + memory leak fixed + + * src/KPSFileFinder.cpp: + fixed throwing of COM exception + + * Makefile.am, NEWS, README, configure.ac, potracelib/Makefile.am: + updated version info to 0.6 + + * src/tests/CalculatorTest.h, src/tests/DirectoryTest.h, + src/tests/FontManagerTest.h, src/tests/FontMapTest.h, + src/tests/KPSFileFinderTest.h, src/tests/PageSizeTest.h, + src/tests/StreamCounterTest.h, src/tests/VectorStreamTest.h: + updated tests + + * doc/dvisvgm.1.in, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, + src/BoundingBox.h, src/Calculator.cpp, src/Calculator.h, + src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/DVIActions.cpp, + src/DVIActions.h, src/DVIBBoxActions.h, src/DVIReader.cpp, + src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Directory.cpp, + src/Directory.h, src/FileFinder.cpp, src/FileFinder.h, + src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, src/Font.h, + src/FontEmitter.h, src/FontEncoding.cpp, src/FontEncoding.h, + src/FontEngine.cpp, src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, + src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, + src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, + src/InputBuffer.cpp, src/InputBuffer.h, src/KPSFileFinder.cpp, + src/KPSFileFinder.h, src/Makefile.am, src/Matrix.cpp, src/Matrix.h, + src/Message.cpp, src/Message.h, src/MessageException.h, + src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PSInterpreter.cpp, + src/PSInterpreter.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, + src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, + src/StreamCounter.h, src/StreamReader.cpp, src/StreamReader.h, + src/TFM.cpp, src/TFM.h, src/TransformationMatrix.cpp, + src/TransformationMatrix.h, src/VFActions.h, src/VFReader.cpp, + src/VFReader.h, src/VectorStream.h, src/XMLDocTypeNode.h, + src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, + src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, + src/options.ggo, src/types.h: + updated file header comments + + * configure.ac: + added test whether dvipdfm.map is available + +2009-01-21 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, + src/FontEncoding.cpp, src/FontGlyph.cpp: + fixed bugs in handling of font encodings and virtual fonts + + * src/Calculator.cpp, src/DVIReader.cpp, src/DVIToSVGActions.cpp, + src/Directory.cpp, src/FontEncoding.cpp, src/FontEngine.cpp, + src/FontManager.cpp, src/FontMap.cpp, src/KPSFileFinder.cpp, + src/MetafontWrapper.cpp, src/PageSize.cpp, src/StreamReader.cpp, + src/TFM.cpp, src/TransformationMatrix.cpp, src/VFReader.cpp, + src/XMLDocument.cpp, src/XMLNode.cpp: + added in/out attributes to parameter documentation + +2009-01-20 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp, src/DVIToSVG.cpp, src/Font.h, src/FontEncoding.cpp, + src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, + src/FontGlyph.cpp, src/FontGlyph.h, src/FontManager.cpp, + src/FontManager.h, src/InputBuffer.cpp, src/InputBuffer.h, + src/SVGFontEmitter.cpp, src/SVGFontEmitter.h: + first working version with font encoding support + + * src/FontEngine.cpp, src/FontEngine.h, src/SVGFontEmitter.cpp: + fixed glyph positioning bug occured in conjunction with font encoding + + * src/SVGFontEmitter.cpp: + fixed memory bug + +2009-01-19 Martin Gieseking <martin.gieseking@uos.de> + + * src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, + src/FontEngine.h, src/FontManager.cpp, src/FontManager.h, + src/FontMap.cpp, src/FontMap.h, src/KPSFileFinder.cpp, + src/KPSFileFinder.h: + more encoding implementations, not complete yet + + * src/DVIReader.cpp, src/FontEncoding.cpp, src/FontEncoding.h, + src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, + src/FontManager.h, src/FontMap.cpp: + partly working mapping support, but yet too slow + +2009-01-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/TransformationMatrix.cpp: + fixed bug in argument assignment of transformation command M + +2009-01-15 Martin Gieseking <martin.gieseking@uos.de> + + * src/TransformationMatrix.cpp: + removed a dangerous loop remained from previous code + +2009-01-14 Martin Gieseking <martin.gieseking@uos.de> + + * potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, + potracelib/curve.h, potracelib/decompose.c, potracelib/decompose.h, + potracelib/lists.h, potracelib/potracelib.c, potracelib/potracelib.h, + potracelib/progress.h, potracelib/trace.c, potracelib/trace.h: + updated libpotrace to version 1.8 + + * src/FontEncoding.cpp, src/FontEncoding.h, src/InputBuffer.cpp, + src/InputBuffer.h, src/Makefile.am: + added basic skeleton for handling of font encodings + + * src/FileSystem.cpp, src/FileSystem.h: + const string parameters + + * src/dvisvgm.cpp: + updated copyright string + + * src/KPSFileFinder.cpp: + added enc-file support + +2009-01-13 Martin Gieseking <martin.gieseking@uos.de> + + * src/CharmapTranslator.cpp: + fixed crash on loading corrupt pfb-files + +2008-06-18 Martin Gieseking <martin.gieseking@uos.de> + + * src/Makefile.am: + adapted to latest gengetopt version + +2008-04-07 Martin Gieseking <martin.gieseking@uos.de> + + * src/Makefile.am: + added missing include path + + * src/DVIReader.cpp: + minor change + +2007-03-26 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, src/CharmapTranslator.cpp, src/CharmapTranslator.h, + src/DVIActions.h, src/DVIReader.cpp, src/DVIToSVG.cpp, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Font.h, + src/FontManager.cpp, src/Makefile.am, src/SVGFontTraceEmitter.cpp, + src/SVGFontTraceEmitter.h: + redesigned DVIActions and CharmapTranslator + + * src/DVIActions.cpp, src/DVIReader.cpp, src/DVIReader.h, + src/FontManager.cpp, src/tests/FontManagerTest.h: + few minor changes + +2007-03-25 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIActions.cpp, src/DVIActions.h, src/DVIBBoxActions.h, + src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Font.cpp, src/Font.h, + src/FontManager.cpp, src/FontManager.h, src/StreamReader.cpp, + src/StreamReader.h, src/VFActions.h, src/VFReader.cpp, src/VFReader.h, + src/VectorStream.h: + first working version 0.5, release candidate 1 + + * src/DVIReader.cpp, src/DVIReader.h, src/VFActions.h: + minor fixes + +2007-03-23 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp, src/FontManager.cpp, src/FontManager.h, + src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/VFReader.cpp: + more vf implementations, not complete yet + +2007-03-22 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, doc/Makefile.in, src/DVIReader.cpp, src/DVIReader.h, + src/DVIToSVG.cpp, src/DVIToSVG.h, src/FileSystem.cpp, src/FileSystem.h, + src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Makefile.am, + src/dvisvgm.cpp, src/tests/DirectoryTest.h, src/tests/FontManagerTest.h: + reintegrated font map initialization into KPSFileFinderm adapted some + tests + + * src/DVIReader.cpp, src/Font.cpp, src/Font.h, src/FontManager.cpp, + src/VFActions.h, src/VFReader.cpp, src/VFReader.h: + more vf implementations + +2007-03-21 Martin Gieseking <martin.gieseking@uos.de> + + * AUTHORS, Makefile.am, README, potracelib/Makefile.am, src/Directory.cpp, + src/Directory.h, src/KPSFileFinder.cpp, src/Makefile, src/Makefile.am, + src/Makefile.in, src/SVGFontTraceEmitter.cpp, src/test-all.cpp, + src/tests/DirectoryTest.h: + implemented Directory class for Linux, added DirectoryTest + + * src/Calculator.cpp, src/DVIReader.cpp, src/Directory.cpp, src/Font.h, + src/FontManager.cpp, src/Makefile, src/Makefile.am, src/Makefile.in, + src/MetafontWrapper.cpp, src/VFReader.cpp, src/VectorStream.h, + src/test-all.cpp, src/tests/VectorStreamTest.h: + removed redundant code and commented code fragments, added + VectorInputStream class + + * src/Directory.cpp, src/Directory.h, src/KPSFileFinder.cpp, + src/KPSFileFinder.h, src/dvisvgm.cpp: + completed MiKTeX font map file look-up, fixed bug in Directory class + + * src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/dvisvgm.cpp: + implemented options -n and -m + +2007-03-20 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, doc/Makefile, doc/Makefile.in, doc/dvisvgm.1.in, + src/DVIReader.cpp, src/DVIToSVG.cpp, src/Font.cpp, src/Font.h, + src/FontManager.cpp, src/KPSFileFinder.cpp, src/Makefile, + src/Makefile.am, src/Makefile.in, src/VFReader.cpp, src/dvisvgm.cpp, + src/test-all.cpp, src/tests/KPSFileFinderTest.h: + added KPSFileFinderTest, added EmptyFont, fixed compilation error + + * src/Directory.cpp, src/Directory.h, src/FileSystem.cpp, src/FontMap.cpp, + src/FontMap.h, src/KPSFileFinder.cpp: + more changes for MiKTeX support + +2007-03-19 Martin Gieseking <martin.gieseking@uos.de> + + * src/CharmapTranslator.cpp, src/DVIToSVG.cpp, src/FontManager.cpp, + src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Makefile, + src/Makefile.am, src/Makefile.in, src/MetafontWrapper.cpp, src/TFM.cpp: + added mktexFOO support and font map lookups to KPSFileFinder + + * src/KPSFileFinder.cpp: + bug fixed, font maps work now + + * src/Font.cpp, src/Font.h, src/FontManager.cpp, src/FontMap.cpp, + src/FontMap.h, src/KPSFileFinder.cpp: + made sources comaptible with MikTeX + +2007-03-16 Martin Gieseking <martin.gieseking@uos.de> + + * src/Font.cpp, src/Font.h, src/FontManager.cpp, src/FontMap.cpp, + src/FontMap.h, src/KPSFileFinder.cpp, src/Makefile, src/Makefile.am, + src/Makefile.in, src/StreamReader.cpp, src/TFM.cpp, src/options.ggo, + src/tests/FontMapTest.h: + more coding in the font department, not finished yet + +2007-03-09 Martin Gieseking <martin.gieseking@uos.de> + + * src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/DVIReader.cpp, + src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/Font.cpp, + src/FontManager.cpp, src/GFTracer.cpp, src/KPSFileFinder.cpp, + src/KPSFileFinder.h, src/Makefile, src/Makefile.am, src/Makefile.in, + src/MetafontWrapper.cpp, src/MetafontWrapper.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, + src/StreamReader.cpp, src/StreamReader.h, src/TFM.cpp, src/TFM.h, + src/VFReader.cpp, src/VFReader.h, src/dvisvgm.cpp, src/options.ggo, + src/test-all.cpp: + refactorings: extracted StreamReader class, replaced generic FileFinder + support by KPSFileFinder calls + +2007-03-08 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIActions.h, src/DVIBBoxActions.h, src/DVIReader.cpp, + src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/Font.cpp, src/Font.h, src/FontManager.cpp, + src/FontManager.h, src/KPSFileFinder.cpp, src/KPSFileFinder.h, + src/Makefile, src/Makefile.am, src/Makefile.in, src/Message.cpp, + src/dvisvgm.cpp, src/macros.h, src/test-all.cpp: + first unstable version with redesigned font handling + + * COPYING, Makefile, Makefile.am, Makefile.in, Martins_svg_neu.svg, NEWS, + aclocal.m4, cmdline.c, config.guess, config.h, config.h.in, + config.status, config.sub, configure.ac, depcomp, doc/Makefile, + doc/dvisvgm.1, doc/dvisvgm.1.in, gpl.txt, install-sh, missing, + src/FontManager.cpp, src/FontManager.h, src/Makefile.am, + src/VFReader.cpp, src/tests/FontManagerTest.h, stamp-h1, table.txt: + removed some garbage from the repository, added initial FontManagerTest + + * doc/dvisvgm.1, src/FontEngine.h, src/dvisvgm.cpp, + src/tests/FontManagerTest.h: + minor changes + + * src/DVIBBoxReader.cpp, src/DVIBBoxReader.h, src/Font.cpp, src/Font.h, + src/StreamCounter.h, src/dvisvgm.cpp: + fixed memory bug + + * src/DVIReader.cpp, src/DVIToSVGActions.cpp, src/Font.h, src/Makefile, + src/Makefile.am, src/Makefile.in, src/VFActions.h, src/VFReader.cpp, + src/VFReader.h, src/dvisvgm.cpp: + plugged VFReader and its actions into the code (not usable yet) + +2007-03-07 Martin Gieseking <martin.gieseking@uos.de> + + * src/Font.cpp, src/Font.h: + added Font classes (not yet error-free) + +2007-03-06 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.h, src/DVIToSVG.cpp, src/FontManager.cpp, + src/FontManager.h: + added FontManager skeleton, fixed bug in makehead + +2007-03-03 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp, src/FontManager.cpp, src/VFReader.cpp: + added some more skeleton code + +2007-03-02 Martin Gieseking <martin.gieseking@uos.de> + + * src/DVIReader.cpp, src/Makefile, src/Makefile.in, src/VFReader.cpp, + src/VFReader.h, src/options.ggo: + added skeleton of VFReader + +2007-01-10 Martin Gieseking <martin.gieseking@uos.de> + + * src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, + src/Calculator.cpp, src/Calculator.h, src/CharmapTranslator.cpp, + src/CharmapTranslator.h, src/DVIActions.h, src/DVIBBoxActions.h, + src/DVIBBoxReader.cpp, src/DVIBBoxReader.h, src/DVIReader.cpp, + src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/FileFinder.cpp, + src/FileFinder.h, src/FileSystem.cpp, src/FileSystem.h, + src/FontEmitter.h, src/FontEngine.cpp, src/FontEngine.h, + src/FontGlyph.cpp, src/FontGlyph.h, src/FontMap.cpp, src/FontMap.h, + src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, + src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Makefile, + src/Makefile.am, src/Makefile.in, src/Matrix.cpp, src/Matrix.h, + src/Message.cpp, src/Message.h, src/MessageException.h, + src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PSInterpreter.cpp, + src/PSInterpreter.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, + src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, + src/StreamCounter.h, src/TFM.cpp, src/TFM.h, + src/TransformationMatrix.cpp, src/TransformationMatrix.h, + src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, + src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, + src/cmdline.c, src/cmdline.h, src/dvisvgm.cpp, src/getopt.c, + src/getopt.h, src/getopt1.c, src/gzstream.cpp, src/gzstream.h, + src/macros.h, src/miktex-core.def, src/miktex-kps.def, src/miktex-kps.h, + src/options.ggo, src/test-all.cpp, src/tests/CalculatorTest.h, + src/tests/PageSizeTest.h, src/tests/StreamCounterTest.h, src/types.h: + moved dir + + * INSTALL, Makefile.am, NEWS, README, configure.ac, doc/Makefile, + doc/Makefile.am, doc/Makefile.in, doc/dvisvgm.1, doc/dvisvgm.1.in, + gzstream/COPYING.LIB, gzstream/Makefile, gzstream/README, + gzstream/gzstream.cpp, gzstream/gzstream.h, gzstream/index.html, + gzstream/logo.gif, gzstream/test_gunzip.C, gzstream/test_gzip.C, + gzstream/version, map/cork-lm.map, potracelib/Makefile.am, + potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, + potracelib/curve.h, potracelib/decompose.c, potracelib/decompose.h, + potracelib/lists.h, potracelib/potracelib.c, potracelib/potracelib.h, + potracelib/progress.h, potracelib/trace.c, potracelib/trace.h: + moved sources + + * src/cmdline.c, src/cmdline.h: + remove unnecessary files + +2007-01-09 Martin Gieseking <martin.gieseking@uos.de> + + * INSTALL, Makefile.am, NEWS, README, configure.ac, doc/Makefile, + doc/Makefile.am, doc/Makefile.in, doc/dvisvgm.1, doc/dvisvgm.1.in, + gzstream/COPYING.LIB, gzstream/Makefile, gzstream/README, + gzstream/gzstream.cpp, gzstream/gzstream.h, gzstream/index.html, + gzstream/logo.gif, gzstream/test_gunzip.C, gzstream/test_gzip.C, + gzstream/version, potracelib/Makefile.am, potracelib/auxiliary.h, + potracelib/bitmap.h, potracelib/curve.c, potracelib/curve.h, + potracelib/decompose.c, potracelib/decompose.h, potracelib/lists.h, + potracelib/potracelib.c, potracelib/potracelib.h, potracelib/progress.h, + potracelib/trace.c, potracelib/trace.h, src/Bitmap.cpp, src/Bitmap.h, + src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.cpp, + src/Calculator.h, src/CharmapTranslator.cpp, src/CharmapTranslator.h, + src/DVIActions.h, src/DVIBBoxActions.h, src/DVIBBoxReader.cpp, + src/DVIBBoxReader.h, src/DVIReader.cpp, src/DVIReader.h, + src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/FileFinder.cpp, src/FileFinder.h, + src/FileSystem.cpp, src/FileSystem.h, src/FontEmitter.h, + src/FontEngine.cpp, src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, + src/FontMap.cpp, src/FontMap.h, src/GFReader.cpp, src/GFReader.h, + src/GFTracer.cpp, src/GFTracer.h, src/KPSFileFinder.cpp, + src/KPSFileFinder.h, src/Makefile, src/Makefile.am, src/Makefile.in, + src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, + src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, + src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageSize.cpp, + src/PageSize.h, src/Pair.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, + src/StreamCounter.h, src/TFM.cpp, src/TFM.h, + src/TransformationMatrix.cpp, src/TransformationMatrix.h, + src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, + src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, + src/cmdline.c, src/cmdline.h, src/dvisvgm.cpp, src/getopt.c, + src/getopt.h, src/getopt1.c, src/gzstream.cpp, src/gzstream.h, + src/macros.h, src/miktex-core.def, src/miktex-kps.def, src/miktex-kps.h, + src/options.ggo, src/test-all.cpp, src/tests/CalculatorTest.h, + src/tests/PageSizeTest.h, src/tests/StreamCounterTest.h, src/types.h: + moved files to trunk subfolder + + * map/cork-lm.map: + moved files to trunk + +2007-01-05 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile, Makefile.am, Makefile.in, README, config.status, configure.ac, + potracelib/Makefile.am, potracelib/bitops.h, potracelib/flate.c, + potracelib/flate.h, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, + src/BoundingBox.h, src/Calculator.cpp, src/Calculator.h, + src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/DVIActions.h, + src/DVIBBoxActions.h, src/DVIBBoxReader.cpp, src/DVIBBoxReader.h, + src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/FileFinder.cpp, + src/FileFinder.h, src/FileSystem.cpp, src/FileSystem.h, + src/FontEmitter.h, src/FontEngine.cpp, src/FontEngine.h, + src/FontGlyph.cpp, src/FontGlyph.h, src/FontMap.cpp, src/FontMap.h, + src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, + src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Makefile.am, + src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, + src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, + src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageSize.cpp, + src/PageSize.h, src/Pair.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, + src/StreamCounter.h, src/TFM.cpp, src/TFM.h, + src/TransformationMatrix.cpp, src/TransformationMatrix.h, + src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, + src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, + src/dvisvgm.cpp, src/macros.h, src/test-all.cpp, src/types.h: + minor modifications + +2007-01-03 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, src/KPSFileFinder.cpp: + updated homepage + + * Makefile, Makefile.am, Makefile.in, config.h, config.h.in, + config.status, configure, configure.ac, doc/Makefile, + potracelib/Makefile.am, potracelib/auxiliary.h, potracelib/bitmap.h, + potracelib/bitops.h, potracelib/curve.c, potracelib/curve.h, + potracelib/decompose.c, potracelib/decompose.h, potracelib/flate.c, + potracelib/flate.h, potracelib/lists.h, potracelib/potracelib.c, + potracelib/potracelib.h, potracelib/progress.h, potracelib/trace.c, + potracelib/trace.h, src/Makefile, src/Makefile.am, src/Makefile.in: + added potracelib to distribution + + * configure: + removed configure from repository + +2006-12-31 Martin Gieseking <martin.gieseking@uos.de> + + * NEWS, configure.ac, src/DVIToSVG.cpp, src/FileSystem.cpp, + src/FontEngine.cpp, src/GFTracer.cpp, src/KPSFileFinder.cpp, + src/Matrix.h, src/Message.cpp, src/PageSize.cpp, + src/TransformationMatrix.cpp, src/dvisvgm.cpp: + updated to MikTeX 2.5 support + + * Makefile, config.status, configure, configure.ac, doc/Makefile, + doc/dvisvgm.1, src/FileSystem.cpp, src/FontEngine.cpp, + src/KPSFileFinder.cpp, src/Makefile, src/dvisvgm.cpp, src/test-all.cpp: + some minor fixes + + * src/KPSFileFinder.cpp: + fixed namepsace bug + +2006-08-01 Martin Gieseking <martin.gieseking@uos.de> + + * Makefile, Makefile.in, NEWS, aclocal.m4, autom4te.cache/output.0, + autom4te.cache/requests, autom4te.cache/traces.0, config.h, config.log, + config.status, configure, configure.ac, doc/Makefile, doc/Makefile.in, + doc/dvisvgm.1, src/FontEngine.cpp, src/Makefile, src/Makefile.in, + src/cmdline.c, src/cmdline.h, src/dvisvgm.cpp: + added support for freetype version >= 2.1.1 + + * configure.ac: + enabled svn keyword expansion + +2006-04-12 Martin Gieseking <martin.gieseking@uos.de> + + * COPYING, INSTALL, Makefile, Makefile.am, Makefile.in, + Martins_svg_neu.svg, NEWS, README, aclocal.m4, autom4te.cache/output.0, + autom4te.cache/requests, autom4te.cache/traces.0, cmdline.c, + config.guess, config.h, config.h.in, config.log, config.status, + config.sub, configure, configure.ac, depcomp, doc/Makefile, + doc/Makefile.am, doc/Makefile.in, doc/dvisvgm.1, doc/dvisvgm.1.in, + gpl.txt, gzstream/COPYING.LIB, gzstream/Makefile, gzstream/README, + gzstream/gzstream.cpp, gzstream/gzstream.h, gzstream/index.html, + gzstream/logo.gif, gzstream/test_gunzip.C, gzstream/test_gzip.C, + gzstream/version, install-sh, map/cork-lm.map, missing, src/Bitmap.cpp, + src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.cpp, + src/Calculator.h, src/CharmapTranslator.cpp, src/CharmapTranslator.h, + src/DVIActions.h, src/DVIBBoxActions.h, src/DVIBBoxReader.cpp, + src/DVIBBoxReader.h, src/DVIReader.cpp, src/DVIReader.h, + src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, + src/DVIToSVGActions.h, src/FileFinder.cpp, src/FileFinder.h, + src/FileSystem.cpp, src/FileSystem.h, src/FontEmitter.h, + src/FontEngine.cpp, src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, + src/FontMap.cpp, src/FontMap.h, src/GFReader.cpp, src/GFReader.h, + src/GFTracer.cpp, src/GFTracer.h, src/KPSFileFinder.cpp, + src/KPSFileFinder.h, src/Makefile, src/Makefile.am, src/Makefile.in, + src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, + src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, + src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageSize.cpp, + src/PageSize.h, src/Pair.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, + src/StreamCounter.h, src/TFM.cpp, src/TFM.h, + src/TransformationMatrix.cpp, src/TransformationMatrix.h, + src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, + src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, + src/cmdline.c, src/cmdline.h, src/dvisvgm.cpp, src/getopt.c, + src/getopt.h, src/getopt1.c, src/gzstream.cpp, src/gzstream.h, + src/lshort-cm.dvi, src/lshort-cm.svg, src/lshort-cm.svgz, src/lshort.dvi, + src/lshort.svg, src/lshort.svgz, src/macros.h, src/miktex-core.def, + src/miktex-kps.def, src/miktex-kps.h, src/options.ggo, src/test-all.cpp, + src/tests/CalculatorTest.h, src/tests/PageSizeTest.h, + src/tests/StreamCounterTest.h, src/types.h, stamp-h1, table.txt: + initial import + + * src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, + src/Calculator.cpp, src/Calculator.h, src/CharmapTranslator.cpp, + src/CharmapTranslator.h, src/DVIActions.h, src/DVIBBoxActions.h, + src/DVIBBoxReader.cpp, src/DVIBBoxReader.h, src/DVIReader.cpp, + src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, + src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/FileFinder.cpp, + src/FileFinder.h, src/FileSystem.cpp, src/FileSystem.h, + src/FontEmitter.h, src/FontEngine.cpp, src/FontEngine.h, + src/FontGlyph.cpp, src/FontGlyph.h, src/FontMap.cpp, src/FontMap.h, + src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, + src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Message.cpp, + src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, + src/MetafontWrapper.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, + src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, + src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, + src/StreamCounter.h, src/TFM.cpp, src/TFM.h, + src/TransformationMatrix.cpp, src/TransformationMatrix.h, + src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, + src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, + src/dvisvgm.cpp, src/macros.h, src/test-all.cpp, + src/tests/CalculatorTest.h, src/tests/PageSizeTest.h, + src/tests/StreamCounterTest.h, src/types.h: + changed keyword tags + + * src/lshort-cm.dvi, src/lshort-cm.svg, src/lshort-cm.svgz, + src/lshort.dvi, src/lshort.svg, src/lshort.svgz: + removed files that need not be version controlled + diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.am b/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.am index f8026835a6f..af42a3e9bb4 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.am +++ b/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.am @@ -1,5 +1,5 @@ ## This file is part of dvisvgm -## Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> +## Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ## ## Process this file with automake. diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.in b/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.in index abcf887032b..307bd6106a8 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.in +++ b/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.in @@ -163,8 +163,8 @@ am__define_uniq_tagged_files = \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` DIST_SUBDIRS = $(SUBDIRS) -am__DIST_COMMON = $(srcdir)/Makefile.in AUTHORS COPYING INSTALL NEWS \ - README +am__DIST_COMMON = $(srcdir)/Makefile.in AUTHORS COPYING ChangeLog \ + INSTALL NEWS README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/NEWS b/Build/source/texk/dvisvgm/dvisvgm-src/NEWS index 5c11387cd0b..a3ae16653ba 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/NEWS +++ b/Build/source/texk/dvisvgm/dvisvgm-src/NEWS @@ -1,3 +1,25 @@ +dvisvgm-2.13 (2022-01-20) +- allow for conversion of multiple EPS files given on the command-line +- added variables n and N to option --output representing the current file + number and total number of files given on the command-line, respectively +- fixed selection of hash algorithm +- improved computation of glyph height and depth +- extended several paragraphs of the manual page with more detailed information +- SVG optimizer: simplify transform attributes also when collapsing groups +- updated bundled xxHash library to version 0.8.1 +- updated bundled gtest to version 1.11 + +dvisvgm-2.12 (2021-08-16) +- added transparency support of SVG elements created outside the PS handler + (GH issue #148) +- fixed spacing issue caused by unexpected newline characters in SVG output +- fixed PS error occurred when defining (yet unsupported) PS shading patterns +- fixed issue in color handling of PS tiling patterns (GH issue #158) +- fixed displaced graphics occurred if PDF MediaBox is not located at the origin +- fixed handling of root directories of file paths +- improved handling of drive letters (Windows only) +- several code refactorings and improvements + dvisvgm-2.11.1 (2021-01-21) - fixed possible ambiguity of GID to charcode mappings (GH issue #147) - refactored representation of token objects in calculator class diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/README b/Build/source/texk/dvisvgm/dvisvgm-src/README index e5a2d98c8ad..2d2a3af843f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/README +++ b/Build/source/texk/dvisvgm/dvisvgm-src/README @@ -130,7 +130,7 @@ ADDITIONAL INFORMATION COPYRIGHT - Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> + Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> 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 diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/config.h.in b/Build/source/texk/dvisvgm/dvisvgm-src/config.h.in new file mode 100644 index 00000000000..a794f4e6744 --- /dev/null +++ b/Build/source/texk/dvisvgm/dvisvgm-src/config.h.in @@ -0,0 +1,162 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Set to 1 if PostScript support should be disabled */ +#undef DISABLE_GS + +/* Define if WOFF support is disabled */ +#undef DISABLE_WOFF + +/* Define to 1 if `TIOCGWINSZ' requires <sys/ioctl.h>. */ +#undef GWINSZ_IN_SYS_IOCTL + +/* define if the compiler supports basic C++11 syntax */ +#undef HAVE_CXX11 + +/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'. + */ +#undef HAVE_DIRENT_H + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the `ftime' function. */ +#undef HAVE_FTIME + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the <inttypes.h> header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `dl' library (-ldl). */ +#undef HAVE_LIBDL + +/* Define to 1 if you have the `gs' library (-lgs). */ +#undef HAVE_LIBGS + +/* Define to 1 if you have the <libintl.h> header file. */ +#undef HAVE_LIBINTL_H + +/* Define to 1 if you have the `kpathsea' library (-lkpathsea). */ +#undef HAVE_LIBKPATHSEA + +/* Define to 1 if you have the `ttfautohint' library (-lttfautohint). */ +#undef HAVE_LIBTTFAUTOHINT + +/* Define to 1 if you have the `z' library (-lz). */ +#undef HAVE_LIBZ + +/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */ +#undef HAVE_NDIR_H + +/* Define to 1 if you have the <openssl/md5.h> header file. */ +#undef HAVE_OPENSSL_MD5_H + +/* Define to 1 if you have the `sigaction' function. */ +#undef HAVE_SIGACTION + +/* Define to 1 if `stat' has the bug that it succeeds when given the + zero-length file name argument. */ +#undef HAVE_STAT_EMPTY_STRING_BUG + +/* Define to 1 if stdbool.h conforms to C99. */ +#undef HAVE_STDBOOL_H + +/* Define to 1 if you have the <stdint.h> header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the <stdlib.h> header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the <string.h> header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'. + */ +#undef HAVE_SYS_DIR_H + +/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'. + */ +#undef HAVE_SYS_NDIR_H + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the <sys/timeb.h> header file. */ +#undef HAVE_SYS_TIMEB_H + +/* Define to 1 if you have the <sys/time.h> header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the <sys/types.h> header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the <ttfautohint.h> header file. */ +#undef HAVE_TTFAUTOHINT_H + +/* Define to 1 if you have the `umask' function. */ +#undef HAVE_UMASK + +/* Define to 1 if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `uselocale' function. */ +#undef HAVE_USELOCALE + +/* Define to 1 if you have the <xlocale.h> header file. */ +#undef HAVE_XLOCALE_H + +/* Define to 1 if the system has the type `_Bool'. */ +#undef HAVE__BOOL + +/* Define to 1 if the kpathsea headers are not C++ safe. */ +#undef KPSE_CXX_UNSAFE + +/* Define to 1 if `lstat' dereferences a symlink specified with a trailing + slash. */ +#undef LSTAT_FOLLOWS_SLASHED_SYMLINK + +/* Define to the sub-directory where 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 + +/* The machine triplet of the target system */ +#undef TARGET_SYSTEM + +/* Define to 1 if your <sys/time.h> declares `struct tm'. */ +#undef TM_IN_SYS_TIME + +/* Version number of package */ +#undef VERSION + +/* Define to `unsigned int' if <sys/types.h> does not define. */ +#undef size_t diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/configure.ac b/Build/source/texk/dvisvgm/dvisvgm-src/configure.ac index 9437cd5002b..edd12a938f9 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/configure.ac +++ b/Build/source/texk/dvisvgm/dvisvgm-src/configure.ac @@ -1,11 +1,11 @@ # This file is part of dvisvgm -# Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> +# Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> # # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT([dvisvgm],[2.11.1],[martin.gieseking@uos.de]) -DATE="January 2021" +AC_INIT([dvisvgm],[2.13],[martin.gieseking@uos.de]) +DATE="January 2022" AC_CONFIG_SRCDIR(src) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_MACRO_DIR([m4]) diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.am b/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.am index dfdc0483b21..1dd6434df5f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.am +++ b/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.am @@ -1,5 +1,5 @@ ## This file is part of dvisvgm -## Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> +## Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ## ## Process this file with automake. @@ -73,6 +73,7 @@ dvisvgm-article.xml: dvisvgm.txt $(TWEAK_DB_ARTICLE) dvisvgm.sty: dvisvgm-man.xml $(GEN_DBLATEX_STY) xsltproc -o dvisvgm.sty $(GEN_DBLATEX_STY) $< +.NOTPARALLEL: dvisvgm.txt: dvisvgm.txt.in ../configure.ac sed -e 's/@VERSION[@]/@VERSION@/g' -e 's/@PACKAGE_BUGREPORT[@]/@PACKAGE_BUGREPORT@/g' $< >$@ if [ $< -nt ../configure.ac ]; \ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.in b/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.in index 8efa4e75542..f4ca0d3ef25 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.in +++ b/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.in @@ -306,6 +306,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -625,6 +626,7 @@ uninstall-man: uninstall-man1 @BUILD_MANPAGE_TRUE@dvisvgm.sty: dvisvgm-man.xml $(GEN_DBLATEX_STY) @BUILD_MANPAGE_TRUE@ xsltproc -o dvisvgm.sty $(GEN_DBLATEX_STY) $< +@BUILD_MANPAGE_TRUE@.NOTPARALLEL: @BUILD_MANPAGE_TRUE@dvisvgm.txt: dvisvgm.txt.in ../configure.ac @BUILD_MANPAGE_TRUE@ sed -e 's/@VERSION[@]/@VERSION@/g' -e 's/@PACKAGE_BUGREPORT[@]/@PACKAGE_BUGREPORT@/g' $< >$@ @BUILD_MANPAGE_TRUE@ if [ $< -nt ../configure.ac ]; \ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-man.xsl b/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-man.xsl index a42a9293600..48c47c49f36 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-man.xsl +++ b/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-man.xsl @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- This file is part of dvisvgm --> -<!-- Copyright (C) 2015-2021 Martin Gieseking <martin.gieseking@uos.de> --> +<!-- Copyright (C) 2015-2022 Martin Gieseking <martin.gieseking@uos.de> --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!-- output monospaced text in bold --> <xsl:template match="literal"> diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-pdf.xsl b/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-pdf.xsl index dd676ef67b0..25ec379129e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-pdf.xsl +++ b/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-pdf.xsl @@ -1,6 +1,6 @@ <?xml version='1.0' encoding="iso-8859-1"?> <!-- This file is part of dvisvgm --> -<!-- Copyright (C) 2015-2021 Martin Gieseking <martin.gieseking@uos.de> --> +<!-- Copyright (C) 2015-2022 Martin Gieseking <martin.gieseking@uos.de> --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="xetex.font"> <xsl:text>\setmainfont{Source Serif Pro} </xsl:text> diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.1 b/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.1 index ba8b102cc9c..73a0443b68c 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.1 +++ b/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.1 @@ -2,12 +2,12 @@ .\" Title: dvisvgm .\" Author: Martin Gieseking <martin.gieseking@uos.de> .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 2021-01-03 +.\" Date: 2022-01-18 .\" Manual: dvisvgm Manual -.\" Source: dvisvgm 2.11.1 +.\" Source: dvisvgm 2.13 .\" Language: English .\" -.TH "DVISVGM" "1" "2021\-01\-03" "dvisvgm 2\&.11\&.1" "dvisvgm Manual" +.TH "DVISVGM" "1" "2022\-01\-18" "dvisvgm 2\&.13" "dvisvgm Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -31,11 +31,11 @@ dvisvgm \- converts DVI and EPS files to the XML\-based SVG format .SH "SYNOPSIS" .sp -\fBdvisvgm\fR [ \fIoptions\fR ] \fIfile\fR [\&.dvi] +\fBdvisvgm\fR [\fIoptions\fR] \fIfile\fR[\&.dvi] .sp -\fBdvisvgm\fR \-\-eps [ \fIoptions\fR ] \fIfile\fR [\&.eps] +\fBdvisvgm\fR \-\-eps [\fIoptions\fR] \fIfile1\fR[\&.eps] \fIfile2\fR[\&.eps] \&... .sp -\fBdvisvgm\fR \-\-pdf [ \fIoptions\fR ] \fIfile\fR [\&.pdf] +\fBdvisvgm\fR \-\-pdf [\fIoptions\fR] \fIfile\fR[\&.pdf] .SH "DESCRIPTION" .sp The command\-line utility \fBdvisvgm\fR converts DVI files, as generated by TeX/LaTeX, to the XML\-based scalable vector graphics format SVG\&. It supports the classic DVI version 2 as well as version 3 (created by pTeX in vertical mode), and the XeTeX versions 5 to 7 which are also known as XDV\&. Besides the basic DVI commands, dvisvgm also evaluates many so\-called \fIspecials\fR which heavily extend the capabilities of the plain DVI format\&. For a more detailed overview, see section \fBSupported Specials\fR below\&. @@ -46,7 +46,7 @@ SVG is a vector\-based graphics format and therefore dvisvgm tries to convert th .sp However, TeX\(cqs main source for font descriptions is Metafont, which produces bitmap output (GF files)\&. That\(cqs why not all obtainable TeX fonts are available in a scalable format\&. In these cases, dvisvgm tries to vectorize Metafont\(cqs output by tracing the glyph bitmaps\&. The results are not as perfect as most (manually optimized) PFB or OTF counterparts, but are nonetheless really nice in most cases\&. .sp -When running dvisvgm without option \fB\-\-no\-fonts\fR, it creates \fIfont\fR elements (\fB<font>\fR\&...\fB</font>\fR) to embed the font data into the SVG files\&. Unfortunately, only few SVG renderers support these elements yet\&. Most web browsers and vector graphics applications don\(cqt evaluate them properly so that the text components of the resulting graphics might look strange\&. In order to create more compatible SVG files, command\-line option \fB\-\-no\-fonts\fR can be given to replace the font elements by plain graphics paths\&. Most web browsers (but only few external SVG renderers) also suppport WOFF and WOFF2 fonts that can be used instead of the default SVG fonts\&. Option \fB\-\-font\-format\fR offers the functionality to change the format applied to the fonts being embedded\&. This, however, only works when converting DVI files\&. Text present in PDF and PostScript files is always converted to path elements\&. +When running dvisvgm without option \fB\-\-no\-fonts\fR, it creates \fIfont\fR elements (\fB<font>\fR\&...\fB</font>\fR) to embed the font data into the SVG files\&. Unfortunately, only few SVG renderers support these elements yet\&. Most web browsers and vector graphics applications don\(cqt evaluate them properly so that the text components of the resulting graphics might look strange\&. In order to create more compatible SVG files, command\-line option \fB\-\-no\-fonts\fR can be given to replace the font elements by plain graphics paths\&. Most web browsers (but only few external SVG renderers) also support WOFF and WOFF2 fonts that can be used instead of the default SVG fonts\&. Option \fB\-\-font\-format\fR offers the functionality to change the format applied to the fonts being embedded\&. This, however, only works when converting DVI files\&. Text present in PDF and PostScript files is always converted to path elements\&. .SH "OPTIONS" .sp dvisvgm provides a POSIX\-compliant command\-line interface with short and long option names\&. They may be given before and/or after the name of the file to be converted\&. Also, the order of specifying the options is not significant, i\&.e\&. you can add them in any order without changing dvisvgm\(cqs behavior\&. Certain options accept or require additional parameters which are directly appended to or separated by whitespace from a short option (e\&.g\&. \fB\-v0\fR or \fB\-v 0\fR)\&. Long options require an additional equals sign (\fB=\fR) between option name and argument but without any surrounding whitespace (e\&.g\&. \fB\-\-verbosity=0\fR)\&. Multiple short options that don\(cqt expect a further parameter can be combined after a single dash (e\&.g\&. \fB\-ejs\fR rather than \fB\-e \-j \-s\fR)\&. @@ -301,7 +301,7 @@ Adds comments with further information about selected data to the SVG file\&. Cu .PP \fB\-E, \-\-eps\fR .RS 4 -If this option is given, dvisvgm does not expect a DVI but an EPS input file, and tries to convert it to SVG\&. In order to do so, a single +If this option is given, dvisvgm does not expect a DVI but a single or multiple EPS input files, and tries to convert them to SVG\&. In order to do so, a single \fIpsfile\fR special command is created and forwarded to the PostScript special handler\&. This option is only available if dvisvgm was built with PostScript support enabled, and requires Ghostscript to be available\&. See option \fB\-\-libgs\fR @@ -506,10 +506,10 @@ creates yellow filled rectangles with blue frames\&. .PP \fB\-l, \-\-list\-specials\fR .RS 4 -Prints a list of registered special handlers and exits\&. Each handler processes a set of special statements belonging to the same category\&. In most cases, the categories are identified by the prefix of the special statements\&. It\(cqs usually a leading string followed by a colon or a blank, e\&.g\&. +Prints a list of registered special handlers and exits\&. Each handler processes a set of special statements belonging to the same category\&. In most cases, these categories are identified by the prefix of the special statements which is usually a leading string followed by a colon or a blank, e\&.g\&. \fIcolor\fR or -\fIps\fR\&. The listed handler names, however, don\(cqt need to match these prefixes, e\&.g\&. if there is no common prefix or if functionality is split into separate handlers in order to allow to disable them separately with option +\fIps\fR\&. The listed handler names, however, don\(cqt need to match these prefixes, e\&.g\&. if there is no common prefix or if functionality is split into separate handlers in order to allow them to be disabled separately using option \fB\-\-no\-specials\fR\&. All special statements not covered by one of the special handlers are silently ignored\&. .RE .PP @@ -662,21 +662,30 @@ expression, it\(cqs assigned to the attribute\&. Otherwise, the matrix expressio .PP \fB\-o, \-\-output\fR=\fIpattern\fR .RS 4 -Sets the pattern specifying the names of the generated SVG files\&. Parameter +Sets the pattern that determines the names of the generated SVG files\&. The required parameter \fIpattern\fR -is a string that may contain static character sequences as well as the variables +may consist of an arbitrary sequence of characters which make up the filenames\&. With the exception of the following mentioned variables and expressions, all characters are treated as static parts of the filenames and are therefore identical for all pages processed during a run of dvisvgm\&. The strings \fB%f\fR, \fB%p\fR, \fB%P\fR, +\fB%n\fR, +\fB%N\fR, \fB%hd\fR, \fB%ho\fR, and -\fB%hc\fR\&. +\fB%hc\fR +are variables that can be used as part of the pattern\&. \fB%f\fR expands to the base name of the DVI file, i\&.e\&. the filename without suffix, \fB%p\fR is the current page number, and \fB%P\fR -the total number of pages in the DVI file\&. An optional number (0\-9) given directly after the percent sign specifies the minimal number of digits to be written\&. If a particular value consists of less digits, the number is padded with leading zeros\&. Example: +the total number of pages in the DVI file\&. The variables +\fB%n\fR +and +\fB%N\fR +expand to the number of the current file being converted (starting at 1) and the total number of files given, respectively\&. +.sp +An optional number (0\-9) specified directly after the percent sign of a variable holding a numeric value denotes the minimal number of digits to be created\&. If a particular value consists of less digits, the number is padded with leading zeros\&. Example: \fB%3p\fR enforces 3 digits for the current page number (001, 002, etc\&.)\&. Without an explicit width specifier, \fB%p\fR @@ -703,7 +712,7 @@ and \fB%hc\fR are only set if option \fB\-\-page\-hashes\fR -is present\&. Otherwise, it\(cqs empty\&. For further information, see the description of option +is present\&. Otherwise, they are empty\&. For further information, see the description of option \fB\-\-page\-hashes\fR below\&. .sp @@ -839,7 +848,7 @@ degrees around the page center\&. This option is equivalent to .PP \fB\-R, \-\-relative\fR .RS 4 -SVG allows to define graphics paths by a sequence of absolute and/or relative path commands, i\&.e\&. each command expects either absolute coordinates or coordinates relative to the current drawing position\&. By default, dvisvgm creates paths made up of absolute commands\&. If option +SVG allows you to define graphics paths by a sequence of absolute and/or relative path commands, i\&.e\&. each command expects either absolute coordinates or coordinates relative to the current drawing position\&. By default, dvisvgm creates paths made up of absolute commands\&. If option \fB\-\-relative\fR is given, relative commands are created instead\&. This slightly reduces the size of the SVG files in most cases\&. .RE @@ -867,7 +876,7 @@ In some cases, dvisvgm needs to create temporary files to work properly\&. These \fB/tmp\fR on Linux systems\&. Option \fB\-\-tmpdir\fR -allows to specify a different location if necessary for some reason\&. Please note that dvisvgm does not create this folder, so you must ensure that it actually exists before running dvisvgm\&. +can be used to specify a different location\&. Please note that dvisvgm does not create this folder if it doesn\(cqt exist\&. Therefore, you must ensure that it\(cqs actually present before running dvisvgm\&. .sp If the optional parameter \fIpath\fR @@ -1162,11 +1171,16 @@ attributes are omitted\&. .RE .SH "SUPPORTED SPECIALS" .sp -dvisvgm supports several sets of \fIspecial commands\fR that can be used to enrich DVI files with additional features, like color, graphics, and hyperlinks\&. The evaluation of special commands is delegated to dedicated handlers provided by dvisvgm\&. Each handler is responsible for all special statements of the same command set, i\&.e\&. commands beginning with the same prefix\&. To get a list of the actually provided special handlers, use option \fB\-\-list\-specials\fR (see above)\&. This section gives an overview of the special commands currently supported\&. +dvisvgm supports several \fIspecial commands\fR that enrich the DVI command set with additional instructions for features, like color, graphics, and hyperlinks\&. The term \fIspecial command\fR, or just \fIspecial\fR, originates from the TeX command \fB\especial{\&...}\fR which does almost nothing\&. TeX only forwards the whole command to the DVI file and delegates its execution to the DVI driver\&. The DVI driver can then decide to either process or ignore it, depending on the supported statements\&. The parameter of TeX\(cqs \fB\especial\fR command is given in curly braces and may consist of an arbitrary character sequence representing the actual instruction, for example \fBcolor Red\fR\&. +.sp ++ dvisvgm delegates the evaluation of special commands to dedicated handlers\&. Each handler is responsible for all special statements of the same command set, i\&.e\&. commands usually \(en but not necessarily \(en beginning with a common prefix\&. For example, all PDF specials start with the prefix \fBpdf:\fR, while the TPIC special set consists of 13 different commands without common identifier\&. The PDF specials are processed by dvisvgm\(cqs \fIpdf\fR handler, the TPIC ones by the \fItpic\fR handler\&. To get a list of the actually provided special handlers, use option \fB\-\-list\-specials\fR (see above)\&. The following list gives an overview of the special sets currently supported\&. The names of the handlers can also be used to disable the processing of individual sets of specials\&. For further information on this, see option \fB\-\-no\-specials\fR\&. .PP \fBbgcolor\fR .RS 4 -Special statement for changing the background/page color\&. Since SVG 1\&.1 doesn\(cqt support background colors, dvisvgm inserts a rectangle of the chosen color into the generated SVG document\&. This rectangle always gets the same size as the selected or computed bounding box\&. This background color command is part of the color special set but is handled separately in order to let the user turn it off\&. For an overview of the command syntax, see the documentation of dvips, for instance\&. +Special statements for changing the background/page color\&. Currently, dvisvgm only supports the +\fBbackground\fR +statement as specified in the +dvips manual (\m[blue]https://tug.org/texinfohtml/dvips.html#Color-specifications\m[])\&. Since SVG 1\&.1 doesn\(cqt support background colors, dvisvgm inserts a rectangle of the chosen color into the generated SVG document\&. This rectangle always gets the same size as the selected or computed bounding box\&. This background color command is part of the color special set but is handled separately in order to let the user turn it off\&. .RE .PP \fBcolor\fR @@ -1364,7 +1378,7 @@ emTeX (\m[blue]https://ctan.org/pkg/emtex\m[])\&. The hyperref specification defines several variants on how to mark hyperlinked areas in a DVI file\&. dvisvgm supports the plain HyperTeX special constructs as created with hyperref package option \fIhypertex\fR\&. By default, all linked areas of the document are marked by a rectangle\&. Option \fB\-\-linkmark\fR -allows to change this behavior\&. See above for further details\&. Information on syntax and semantics of the HyperTeX specials can be found in the +allows you to change this behavior\&. See above for further details\&. Information on syntax and semantics of the HyperTeX specials can be found in the hyperref manual (\m[blue]https://ctan.org/pkg/hyperref\m[])\&. .RE .PP @@ -1692,4 +1706,4 @@ Please report bugs using the bug tracker at GitHub (\m[blue]https://github.com/m Written by Martin Gieseking <\m[blue]\fBmartin\&.gieseking@uos\&.de\fR\m[]> .SH "COPYING" .sp -Copyright \(co 2005\-2021 Martin Gieseking\&. Free use of this software is granted under the terms of the GNU General Public License (GPL) version 3 or, (at your option) any later version\&. +Copyright \(co 2005\-2022 Martin Gieseking\&. Free use of this software is granted under the terms of the GNU General Public License (GPL) version 3 or, (at your option) any later version\&. diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.txt.in b/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.txt.in index 739f6e5c16d..1fdd5b551bf 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.txt.in +++ b/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.txt.in @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////// // This file is part of dvisvgm -- a fast DVI to SVG converter // -// Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> // +// Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> // // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License as // @@ -22,7 +22,7 @@ Martin Gieseking <@PACKAGE_BUGREPORT@> :man source: dvisvgm :man version: @VERSION@ :man manual: dvisvgm Manual -:revdate: 2021-01-03 19:25 +0100 +:revdate: 2022-01-18 10:32 +0100 Name ---- @@ -31,11 +31,11 @@ dvisvgm - converts DVI and EPS files to the XML-based SVG format Synopsis -------- -*dvisvgm* [ 'options' ] 'file' [.dvi] +*dvisvgm* ['options'] 'file'[.dvi] -*dvisvgm* --eps [ 'options' ] 'file' [.eps] +*dvisvgm* --eps ['options'] 'file1'[.eps] 'file2'[.eps] ... -*dvisvgm* --pdf [ 'options' ] 'file' [.pdf] +*dvisvgm* --pdf ['options'] 'file'[.pdf] Description @@ -69,7 +69,7 @@ to embed the font data into the SVG files. Unfortunately, only few SVG renderers elements yet. Most web browsers and vector graphics applications don't evaluate them properly so that the text components of the resulting graphics might look strange. In order to create more compatible SVG files, command-line option *--no-fonts* can be given to replace the font elements -by plain graphics paths. Most web browsers (but only few external SVG renderers) also suppport +by plain graphics paths. Most web browsers (but only few external SVG renderers) also support WOFF and WOFF2 fonts that can be used instead of the default SVG fonts. Option *--font-format* offers the functionality to change the format applied to the fonts being embedded. This, however, only works when converting DVI files. Text present in PDF and PostScript files is always @@ -207,9 +207,9 @@ Adds comments with further information about selected data to the SVG file. Curr font elements and font CSS rules related to native fonts are annotated. *-E, --eps*:: -If this option is given, dvisvgm does not expect a DVI but an EPS input file, and tries to convert -it to SVG. In order to do so, a single 'psfile' special command is created and forwarded to the -PostScript special handler. +If this option is given, dvisvgm does not expect a DVI but a single or multiple EPS input files, +and tries to convert them to SVG. In order to do so, a single 'psfile' special command is created +and forwarded to the PostScript special handler. This option is only available if dvisvgm was built with PostScript support enabled, and requires Ghostscript to be available. See option *--libgs* for further information. @@ -356,12 +356,12 @@ yellow filled rectangles with blue frames. *-l, --list-specials*:: Prints a list of registered special handlers and exits. Each handler processes a set of special -statements belonging to the same category. In most cases, the categories are identified by the -prefix of the special statements. It's usually a leading string followed by a colon or a blank, +statements belonging to the same category. In most cases, these categories are identified by the +prefix of the special statements which is usually a leading string followed by a colon or a blank, e.g. 'color' or 'ps'. The listed handler names, however, don't need to match these prefixes, e.g. if there is no common prefix or if functionality is split into separate handlers in order to allow -to disable them separately with option *--no-specials*. All special statements not covered by one -of the special handlers are silently ignored. +them to be disabled separately using option *--no-specials*. All special statements not covered by +one of the special handlers are silently ignored. *-M, --mag*='factor':: Sets the magnification factor applied in conjunction with Metafont calls prior tracing the glyphs. @@ -454,14 +454,21 @@ The following list describes the currently available optimizer modules. expression is used. *-o, --output*='pattern':: -Sets the pattern specifying the names of the generated SVG files. Parameter 'pattern' is a string -that may contain static character sequences as well as the variables +%f+, +%p+, +%P+, +%hd+, -+%ho+, and +%hc+. +%f+ expands to the base name of the DVI file, i.e. the filename without -suffix, +%p+ is the current page number, and +%P+ the total number of pages in the DVI file. An -optional number (0-9) given directly after the percent sign specifies the minimal number of digits -to be written. If a particular value consists of less digits, the number is padded with leading -zeros. Example: +%3p+ enforces 3 digits for the current page number (001, 002, etc.). Without an -explicit width specifier, +%p+ gets the same number of digits as +%P+. +Sets the pattern that determines the names of the generated SVG files. The required parameter +'pattern' may consist of an arbitrary sequence of characters which make up the filenames. With the +exception of the following mentioned variables and expressions, all characters are treated as static +parts of the filenames and are therefore identical for all pages processed during a run of dvisvgm. +The strings +%f+, +%p+, +%P+, +%n+, +%N+, +%hd+, +%ho+, and +%hc+ are variables that can be used as +part of the pattern. +%f+ expands to the base name of the DVI file, i.e. the filename without suffix, ++%p+ is the current page number, and +%P+ the total number of pages in the DVI file. The variables ++%n+ and +%N+ expand to the number of the current file being converted (starting at 1) and the total +number of files given, respectively. ++ +An optional number (0-9) specified directly after the percent sign of a variable holding a numeric +value denotes the minimal number of digits to be created. If a particular value consists of less +digits, the number is padded with leading zeros. +Example: +%3p+ enforces 3 digits for the current page number (001, 002, etc.). Without an explicit +width specifier, +%p+ gets the same number of digits as +%P+. + If you need more control over the numbering, you can use arithmetic expressions as part of a pattern. The syntax is +%(+'expr'+)+ where 'expr' may contain additions, subtractions, multiplications, and @@ -471,7 +478,8 @@ where the numbering starts with 0 rather than 1. + The variables +%hX+ contain different hash values computed from the DVI page data and the options given on the command-line. +%hd+ and +%hc+ are only set if option *--page-hashes* is present. -Otherwise, it's empty. For further information, see the description of option *--page-hashes* below. +Otherwise, they are empty. For further information, see the description of option *--page-hashes* +below. + The default pattern is +%f-%p.svg+ if the DVI file consists of more than one page, and +%f.svg+ otherwise. That means, a DVI file 'foo.dvi' is converted to 'foo.svg' if 'foo.dvi' @@ -563,7 +571,7 @@ Rotates the page content clockwise by 'angle' degrees around the page center. This option is equivalent to *-TR*'angle'. *-R, --relative*:: -SVG allows to define graphics paths by a sequence of absolute and/or relative path commands, +SVG allows you to define graphics paths by a sequence of absolute and/or relative path commands, i.e. each command expects either absolute coordinates or coordinates relative to the current drawing position. By default, dvisvgm creates paths made up of absolute commands. If option *--relative* is given, relative commands are created instead. This slightly reduces @@ -578,10 +586,10 @@ is 'stdin.svg' which can be changed with option *--output*. Don't write the SVG output to a file but redirect it to *stdout*. *--tmpdir*[='path']:: -In some cases, dvisvgm needs to create temporary files to work properly. These files go to -the system's temporary folder by default, e.g. +/tmp+ on Linux systems. Option *--tmpdir* -allows to specify a different location if necessary for some reason. Please note that dvisvgm -does not create this folder, so you must ensure that it actually exists before running dvisvgm. +In some cases, dvisvgm needs to create temporary files to work properly. These files go to the +system's temporary folder by default, e.g. +/tmp+ on Linux systems. Option *--tmpdir* can be used +to specify a different location. Please note that dvisvgm does not create this folder if it doesn't +exist. Therefore, you must ensure that it's actually present before running dvisvgm. + If the optional parameter 'path' is omitted, dvisvgm prints the location of the system's temp folder and exits. @@ -708,19 +716,30 @@ graphics accordingly. If a negative zoom factor is given, the 'width' and 'heigh [[specials]] Supported Specials ------------------ -dvisvgm supports several sets of 'special commands' that can be used to enrich DVI files with additional -features, like color, graphics, and hyperlinks. The evaluation of special commands is delegated to dedicated -handlers provided by dvisvgm. Each handler is responsible for all special statements of the same command set, -i.e. commands beginning with the same prefix. To get a list of the actually provided special handlers, use -option *--list-specials* (see above). This section gives an overview of the special commands currently -supported. +dvisvgm supports several 'special commands' that enrich the DVI command set with additional instructions +for features, like color, graphics, and hyperlinks. The term 'special command', or just 'special', originates +from the TeX command +\special{...}+ which does almost nothing. TeX only forwards the whole command to the +DVI file and delegates its execution to the DVI driver. The DVI driver can then decide to either process or +ignore it, depending on the supported statements. The parameter of TeX's +\special+ command is given in curly +braces and may consist of an arbitrary character sequence representing the actual instruction, for example ++color Red+. ++ +dvisvgm delegates the evaluation of special commands to dedicated handlers. Each handler is responsible for +all special statements of the same command set, i.e. commands usually – but not necessarily – +beginning with a common prefix. For example, all PDF specials start with the prefix +pdf:+, while the TPIC +special set consists of 13 different commands without common identifier. The PDF specials are processed by +dvisvgm's 'pdf' handler, the TPIC ones by the 'tpic' handler. To get a list of the actually provided special +handlers, use option *--list-specials* (see above). The following list gives an overview of the special sets +currently supported. The names of the handlers can also be used to disable the processing of individual sets +of specials. For further information on this, see option *--no-specials*. *bgcolor*:: -Special statement for changing the background/page color. Since SVG 1.1 doesn't support background colors, -dvisvgm inserts a rectangle of the chosen color into the generated SVG document. This rectangle always gets -the same size as the selected or computed bounding box. This background color command is part of the color -special set but is handled separately in order to let the user turn it off. For an overview of the command -syntax, see the documentation of dvips, for instance. +Special statements for changing the background/page color. Currently, dvisvgm only supports the +background+ +statement as specified in the https://tug.org/texinfohtml/dvips.html#Color-specifications[dvips manual]. +Since SVG 1.1 doesn't support background colors, dvisvgm inserts a rectangle of the chosen color into the +generated SVG document. This rectangle always gets the same size as the selected or computed bounding box. +This background color command is part of the color special set but is handled separately in order to let +the user turn it off. *color*:: Statements of this command set provide instructions to change the text/paint color. For an overview of the @@ -835,7 +854,7 @@ https://ctan.org/pkg/emtex[emTeX]. *html*:: The hyperref specification defines several variants on how to mark hyperlinked areas in a DVI file. dvisvgm supports the plain HyperTeX special constructs as created with hyperref package option 'hypertex'. -By default, all linked areas of the document are marked by a rectangle. Option *--linkmark* allows to change +By default, all linked areas of the document are marked by a rectangle. Option *--linkmark* allows you to change this behavior. See above for further details. Information on syntax and semantics of the HyperTeX specials can be found in the https://ctan.org/pkg/hyperref[hyperref manual]. @@ -1001,7 +1020,7 @@ Written by {author} <{email}> Copying ------- -Copyright (C) 2005-2021 Martin Gieseking. Free use of this software is +Copyright (C) 2005-2022 Martin Gieseking. Free use of this software is granted under the terms of the GNU General Public License (GPL) version 3 or, (at your option) any later version. diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-db-refentry.xsl b/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-db-refentry.xsl index fc77008ed1e..cfaffaab713 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-db-refentry.xsl +++ b/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-db-refentry.xsl @@ -1,6 +1,6 @@ <?xml version="1.0"?> <!-- This file is part of dvisvgm --> -<!-- Copyright (C) 2015-2021 Martin Gieseking <martin.gieseking@uos.de> --> +<!-- Copyright (C) 2015-2022 Martin Gieseking <martin.gieseking@uos.de> --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times" diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-pdf.xsl b/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-pdf.xsl index d4e3c8b0c1f..1d08432e7f6 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-pdf.xsl +++ b/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-pdf.xsl @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- This file is part of dvisvgm --> -<!-- Copyright (C) 2015-2021 Martin Gieseking <martin.gieseking@uos.de> --> +<!-- Copyright (C) 2015-2022 Martin Gieseking <martin.gieseking@uos.de> --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output doctype-public="-//OASIS//DTD DocBook XML V4.5//EN" doctype-system="http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"/> diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-tex.py b/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-tex.py index 3f34d94e654..68a649e5597 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-tex.py +++ b/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-tex.py @@ -10,9 +10,9 @@ def main (latex_file, stdout): lines = infile.readlines() for line in lines: if re.match(r'(.*\\def)|(.*\\href)', line) == None: - line = re.sub(r'([a-zA-Z0-9]+)/', r'\1\slash{}', line) + line = re.sub(r'([a-zA-Z0-9]+)/', r'\1\\slash{}', line) line = re.sub(r'-{}-{}', r'\=/\=/', line) line = re.sub(r'([^a-zA-Z0-9])-{}', r'\1\=/', line) - print >>outfile, line.rstrip() + print(line.rstrip(), file=outfile) os.remove(latex_file_old) return 0 diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/libs/Makefile.am b/Build/source/texk/dvisvgm/dvisvgm-src/libs/Makefile.am index e756a6be097..f98732f04ee 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/libs/Makefile.am +++ b/Build/source/texk/dvisvgm/dvisvgm-src/libs/Makefile.am @@ -1,5 +1,5 @@ ## This file is part of dvisvgm -## Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> +## Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ## ## Process this file with automake. diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/libs/brotli/enc/encode.c b/Build/source/texk/dvisvgm/dvisvgm-src/libs/brotli/enc/encode.c index 8d90937b436..e77009e39ae 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/libs/brotli/enc/encode.c +++ b/Build/source/texk/dvisvgm/dvisvgm-src/libs/brotli/enc/encode.c @@ -1470,8 +1470,8 @@ static size_t MakeUncompressedStream( BROTLI_BOOL BrotliEncoderCompress( int quality, int lgwin, BrotliEncoderMode mode, size_t input_size, - const uint8_t* input_buffer, size_t* encoded_size, - uint8_t* encoded_buffer) { + const uint8_t input_buffer[BROTLI_ARRAY_PARAM(input_size)], size_t* encoded_size, + uint8_t encoded_buffer[BROTLI_ARRAY_PARAM(*encoded_size)]) { BrotliEncoderState* s; size_t out_size = *encoded_size; const uint8_t* input_start = input_buffer; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/libs/ff-woff/fontforge/tmpfile2.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/libs/ff-woff/fontforge/tmpfile2.cpp index 9e4a26dbfb7..d22d03bc3c2 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/libs/ff-woff/fontforge/tmpfile2.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/libs/ff-woff/fontforge/tmpfile2.cpp @@ -3,7 +3,7 @@ * works on POSIX and Windows systems. * License: Revised BSD license used by FontForge * https://github.com/fontforge/fontforge/blob/master/LICENSE -* (C) 2017-2021 Martin Gieseking <martin.gieseking@uos.de> */ +* (C) 2017-2022 Martin Gieseking <martin.gieseking@uos.de> */ #include <cstdio> #include <cstdlib> diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxh3.h b/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxh3.h index 7e83e6418af..f7dc1959b57 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxh3.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxh3.h @@ -42,7 +42,7 @@ * but it is still provided for compatibility with source code * which used to include it directly. * - * Programs are now highly discourage to include xxh3.h. + * Programs are now highly discouraged to include xxh3.h. * Include `xxhash.h` instead, which is the officially supported interface. * * In the future, xxh3.h will start to generate warnings, then errors, diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxhash.h b/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxhash.h index 2d56d23c5d0..08ab7945723 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxhash.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxhash.h @@ -32,7 +32,12 @@ * - xxHash homepage: https://www.xxhash.com * - xxHash source repository: https://github.com/Cyan4973/xxHash */ - +/*! + * @mainpage xxHash + * + * @file xxhash.h + * xxHash prototypes and implementation + */ /* TODO: update */ /* Notice extracted from xxHash homepage: @@ -44,7 +49,7 @@ Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo Name Speed Q.Score Author xxHash 5.4 GB/s 10 CrapWow 3.2 GB/s 2 Andrew -MumurHash 3a 2.7 GB/s 10 Austin Appleby +MurmurHash 3a 2.7 GB/s 10 Austin Appleby SpookyHash 2.0 GB/s 10 Bob Jenkins SBox 1.4 GB/s 9 Bret Mulvey Lookup3 1.2 GB/s 9 Bob Jenkins @@ -116,29 +121,80 @@ extern "C" { /* * This part deals with the special case where a unit wants to inline xxHash, - * but "xxhash.h" has previously been included without XXH_INLINE_ALL, such - * as part of some previously included *.h header file. + * but "xxhash.h" has previously been included without XXH_INLINE_ALL, + * such as part of some previously included *.h header file. * Without further action, the new include would just be ignored, * and functions would effectively _not_ be inlined (silent failure). * The following macros solve this situation by prefixing all inlined names, * avoiding naming collision with previous inclusions. */ -# ifdef XXH_NAMESPACE -# error "XXH_INLINE_ALL with XXH_NAMESPACE is not supported" - /* - * Note: Alternative: #undef all symbols (it's a pretty large list). - * Without #error: it compiles, but functions are actually not inlined. - */ -# endif + /* Before that, we unconditionally #undef all symbols, + * in case they were already defined with XXH_NAMESPACE. + * They will then be redefined for XXH_INLINE_ALL + */ +# undef XXH_versionNumber + /* XXH32 */ +# undef XXH32 +# undef XXH32_createState +# undef XXH32_freeState +# undef XXH32_reset +# undef XXH32_update +# undef XXH32_digest +# undef XXH32_copyState +# undef XXH32_canonicalFromHash +# undef XXH32_hashFromCanonical + /* XXH64 */ +# undef XXH64 +# undef XXH64_createState +# undef XXH64_freeState +# undef XXH64_reset +# undef XXH64_update +# undef XXH64_digest +# undef XXH64_copyState +# undef XXH64_canonicalFromHash +# undef XXH64_hashFromCanonical + /* XXH3_64bits */ +# undef XXH3_64bits +# undef XXH3_64bits_withSecret +# undef XXH3_64bits_withSeed +# undef XXH3_64bits_withSecretandSeed +# undef XXH3_createState +# undef XXH3_freeState +# undef XXH3_copyState +# undef XXH3_64bits_reset +# undef XXH3_64bits_reset_withSeed +# undef XXH3_64bits_reset_withSecret +# undef XXH3_64bits_update +# undef XXH3_64bits_digest +# undef XXH3_generateSecret + /* XXH3_128bits */ +# undef XXH128 +# undef XXH3_128bits +# undef XXH3_128bits_withSeed +# undef XXH3_128bits_withSecret +# undef XXH3_128bits_reset +# undef XXH3_128bits_reset_withSeed +# undef XXH3_128bits_reset_withSecret +# undef XXH3_128bits_reset_withSecretandSeed +# undef XXH3_128bits_update +# undef XXH3_128bits_digest +# undef XXH128_isEqual +# undef XXH128_cmp +# undef XXH128_canonicalFromHash +# undef XXH128_hashFromCanonical + /* Finally, free the namespace itself */ +# undef XXH_NAMESPACE + + /* employ the namespace for XXH_INLINE_ALL */ # define XXH_NAMESPACE XXH_INLINE_ /* - * Some identifiers (enums, type names) are not symbols, but they must - * still be renamed to avoid redeclaration. + * Some identifiers (enums, type names) are not symbols, + * but they must nonetheless be renamed to avoid redeclaration. * Alternative solution: do not redeclare them. - * However, this requires some #ifdefs, and is a more dispersed action. - * Meanwhile, renaming can be achieved in a single block + * However, this requires some #ifdefs, and has a more dispersed impact. + * Meanwhile, renaming can be achieved in a single place. */ -# define XXH_IPREF(Id) XXH_INLINE_ ## Id +# define XXH_IPREF(Id) XXH_NAMESPACE ## Id # define XXH_OK XXH_IPREF(XXH_OK) # define XXH_ERROR XXH_IPREF(XXH_ERROR) # define XXH_errorcode XXH_IPREF(XXH_errorcode) @@ -165,6 +221,12 @@ extern "C" { #ifndef XXHASH_H_5627135585666179 #define XXHASH_H_5627135585666179 1 + +/*! + * @defgroup public Public API + * Contains details on the public xxHash functions. + * @{ + */ /* specific declaration modes for Windows */ #if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API) # if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT)) @@ -178,8 +240,9 @@ extern "C" { # endif #endif +#ifdef XXH_DOXYGEN /*! - * XXH_NAMESPACE, aka Namespace Emulation: + * @brief Emulate a namespace by transparently prefixing all symbols. * * If you want to include _and expose_ xxHash functions from within your own * library, but also want to avoid symbol collisions with other libraries which @@ -191,6 +254,10 @@ extern "C" { * includes `xxhash.h`: Regular symbol names will be automatically translated * by this header. */ +# define XXH_NAMESPACE /* YOUR NAME HERE */ +# undef XXH_NAMESPACE +#endif + #ifdef XXH_NAMESPACE # define XXH_CAT(A,B) A##B # define XXH_NAME2(A,B) XXH_CAT(A,B) @@ -219,23 +286,28 @@ extern "C" { # define XXH3_64bits XXH_NAME2(XXH_NAMESPACE, XXH3_64bits) # define XXH3_64bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecret) # define XXH3_64bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSeed) +# define XXH3_64bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecretandSeed) # define XXH3_createState XXH_NAME2(XXH_NAMESPACE, XXH3_createState) # define XXH3_freeState XXH_NAME2(XXH_NAMESPACE, XXH3_freeState) # define XXH3_copyState XXH_NAME2(XXH_NAMESPACE, XXH3_copyState) # define XXH3_64bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset) # define XXH3_64bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSeed) # define XXH3_64bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecret) +# define XXH3_64bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecretandSeed) # define XXH3_64bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_update) # define XXH3_64bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_digest) # define XXH3_generateSecret XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret) +# define XXH3_generateSecret_fromSeed XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret_fromSeed) /* XXH3_128bits */ # define XXH128 XXH_NAME2(XXH_NAMESPACE, XXH128) # define XXH3_128bits XXH_NAME2(XXH_NAMESPACE, XXH3_128bits) # define XXH3_128bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSeed) # define XXH3_128bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecret) +# define XXH3_128bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecretandSeed) # define XXH3_128bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset) # define XXH3_128bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSeed) # define XXH3_128bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecret) +# define XXH3_128bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecretandSeed) # define XXH3_128bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_update) # define XXH3_128bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_digest) # define XXH128_isEqual XXH_NAME2(XXH_NAMESPACE, XXH128_isEqual) @@ -250,13 +322,22 @@ extern "C" { ***************************************/ #define XXH_VERSION_MAJOR 0 #define XXH_VERSION_MINOR 8 -#define XXH_VERSION_RELEASE 0 +#define XXH_VERSION_RELEASE 1 #define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE) + +/*! + * @brief Obtains the xxHash version. + * + * This is mostly useful when xxHash is compiled as a shared library, + * since the returned value comes from the library, as opposed to header file. + * + * @return `XXH_VERSION_NUMBER` of the invoked library. + */ XXH_PUBLIC_API unsigned XXH_versionNumber (void); /* **************************** -* Definitions +* Common basic types ******************************/ #include <stddef.h> /* size_t */ typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; @@ -265,11 +346,20 @@ typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; /*-********************************************************************** * 32-bit hash ************************************************************************/ -#if !defined (__VMS) \ +#if defined(XXH_DOXYGEN) /* Don't show <stdint.h> include */ +/*! + * @brief An unsigned 32-bit integer. + * + * Not necessarily defined to `uint32_t` but functionally equivalent. + */ +typedef uint32_t XXH32_hash_t; + +#elif !defined (__VMS) \ && (defined (__cplusplus) \ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) # include <stdint.h> typedef uint32_t XXH32_hash_t; + #else # include <limits.h> # if UINT_MAX == 0xFFFFFFFFUL @@ -284,22 +374,48 @@ typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; #endif /*! - * XXH32(): - * Calculate the 32-bit hash of sequence "length" bytes stored at memory address "input". - * The memory between input & input+length must be valid (allocated and read-accessible). - * "seed" can be used to alter the result predictably. - * Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark): 5.4 GB/s + * @} + * + * @defgroup xxh32_family XXH32 family + * @ingroup public + * Contains functions used in the classic 32-bit xxHash algorithm. * - * Note: XXH3 provides competitive speed for both 32-bit and 64-bit systems, - * and offers true 64/128 bit hash results. It provides a superior level of - * dispersion, and greatly reduces the risks of collisions. + * @note + * XXH32 is useful for older platforms, with no or poor 64-bit performance. + * Note that @ref xxh3_family provides competitive speed + * for both 32-bit and 64-bit systems, and offers true 64/128 bit hash results. + * + * @see @ref xxh64_family, @ref xxh3_family : Other xxHash families + * @see @ref xxh32_impl for implementation details + * @{ */ -XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed); -/******* Streaming *******/ +/*! + * @brief Calculates the 32-bit hash of @p input using xxHash32. + * + * Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark): 5.4 GB/s + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 32-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 32-bit hash value. + * + * @see + * XXH64(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128(): + * Direct equivalents for the other variants of xxHash. + * @see + * XXH32_createState(), XXH32_update(), XXH32_digest(): Streaming version. + */ +XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed); -/* - * Streaming functions generate the xxHash value from an incrememtal input. +/*! + * Streaming functions generate the xxHash value from an incremental input. * This method is slower than single-call functions, due to state management. * For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized. * @@ -319,15 +435,117 @@ XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_ * digest, and generate new hash values later on by invoking `XXH*_digest()`. * * When done, release the state using `XXH*_freeState()`. + * + * Example code for incrementally hashing a file: + * @code{.c} + * #include <stdio.h> + * #include <xxhash.h> + * #define BUFFER_SIZE 256 + * + * // Note: XXH64 and XXH3 use the same interface. + * XXH32_hash_t + * hashFile(FILE* stream) + * { + * XXH32_state_t* state; + * unsigned char buf[BUFFER_SIZE]; + * size_t amt; + * XXH32_hash_t hash; + * + * state = XXH32_createState(); // Create a state + * assert(state != NULL); // Error check here + * XXH32_reset(state, 0xbaad5eed); // Reset state with our seed + * while ((amt = fread(buf, 1, sizeof(buf), stream)) != 0) { + * XXH32_update(state, buf, amt); // Hash the file in chunks + * } + * hash = XXH32_digest(state); // Finalize the hash + * XXH32_freeState(state); // Clean up + * return hash; + * } + * @endcode + */ + +/*! + * @typedef struct XXH32_state_s XXH32_state_t + * @brief The opaque state struct for the XXH32 streaming API. + * + * @see XXH32_state_s for details. */ +typedef struct XXH32_state_s XXH32_state_t; -typedef struct XXH32_state_s XXH32_state_t; /* incomplete type */ +/*! + * @brief Allocates an @ref XXH32_state_t. + * + * Must be freed with XXH32_freeState(). + * @return An allocated XXH32_state_t on success, `NULL` on failure. + */ XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void); +/*! + * @brief Frees an @ref XXH32_state_t. + * + * Must be allocated with XXH32_createState(). + * @param statePtr A pointer to an @ref XXH32_state_t allocated with @ref XXH32_createState(). + * @return XXH_OK. + */ XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr); +/*! + * @brief Copies one @ref XXH32_state_t to another. + * + * @param dst_state The state to copy to. + * @param src_state The state to copy from. + * @pre + * @p dst_state and @p src_state must not be `NULL` and must not overlap. + */ XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state); +/*! + * @brief Resets an @ref XXH32_state_t to begin a new hash. + * + * This function resets and seeds a state. Call it before @ref XXH32_update(). + * + * @param statePtr The state struct to reset. + * @param seed The 32-bit seed to alter the hash result predictably. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, XXH32_hash_t seed); + +/*! + * @brief Consumes a block of @p input to an @ref XXH32_state_t. + * + * Call this to incrementally consume blocks of data. + * + * @param statePtr The state struct to update. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length); + +/*! + * @brief Returns the calculated hash value from an @ref XXH32_state_t. + * + * @note + * Calling XXH32_digest() will not affect @p statePtr, so you can update, + * digest, and update again. + * + * @param statePtr The state struct to calculate the hash from. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return The calculated xxHash32 value from that state. + */ XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr); /******* Canonical representation *******/ @@ -351,41 +569,151 @@ XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr); * canonical format. */ -typedef struct { unsigned char digest[4]; } XXH32_canonical_t; +/*! + * @brief Canonical (big endian) representation of @ref XXH32_hash_t. + */ +typedef struct { + unsigned char digest[4]; /*!< Hash bytes, big endian */ +} XXH32_canonical_t; + +/*! + * @brief Converts an @ref XXH32_hash_t to a big endian @ref XXH32_canonical_t. + * + * @param dst The @ref XXH32_canonical_t pointer to be stored to. + * @param hash The @ref XXH32_hash_t to be converted. + * + * @pre + * @p dst must not be `NULL`. + */ XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash); + +/*! + * @brief Converts an @ref XXH32_canonical_t to a native @ref XXH32_hash_t. + * + * @param src The @ref XXH32_canonical_t to convert. + * + * @pre + * @p src must not be `NULL`. + * + * @return The converted hash. + */ XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src); +#ifdef __has_attribute +# define XXH_HAS_ATTRIBUTE(x) __has_attribute(x) +#else +# define XXH_HAS_ATTRIBUTE(x) 0 +#endif + +/* C-language Attributes are added in C23. */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute) +# define XXH_HAS_C_ATTRIBUTE(x) __has_c_attribute(x) +#else +# define XXH_HAS_C_ATTRIBUTE(x) 0 +#endif + +#if defined(__cplusplus) && defined(__has_cpp_attribute) +# define XXH_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define XXH_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +/* +Define XXH_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute +introduced in CPP17 and C23. +CPP17 : https://en.cppreference.com/w/cpp/language/attributes/fallthrough +C23 : https://en.cppreference.com/w/c/language/attributes/fallthrough +*/ +#if XXH_HAS_C_ATTRIBUTE(x) +# define XXH_FALLTHROUGH [[fallthrough]] +#elif XXH_HAS_CPP_ATTRIBUTE(x) +# define XXH_FALLTHROUGH [[fallthrough]] +#elif XXH_HAS_ATTRIBUTE(__fallthrough__) +# define XXH_FALLTHROUGH __attribute__ ((fallthrough)) +#else +# define XXH_FALLTHROUGH +#endif + +/*! + * @} + * @ingroup public + * @{ + */ + #ifndef XXH_NO_LONG_LONG /*-********************************************************************** * 64-bit hash ************************************************************************/ -#if !defined (__VMS) \ +#if defined(XXH_DOXYGEN) /* don't include <stdint.h> */ +/*! + * @brief An unsigned 64-bit integer. + * + * Not necessarily defined to `uint64_t` but functionally equivalent. + */ +typedef uint64_t XXH64_hash_t; +#elif !defined (__VMS) \ && (defined (__cplusplus) \ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) -# include <stdint.h> - typedef uint64_t XXH64_hash_t; +# include <stdint.h> + typedef uint64_t XXH64_hash_t; #else - /* the following type must have a width of 64-bit */ - typedef unsigned long long XXH64_hash_t; +# include <limits.h> +# if defined(__LP64__) && ULONG_MAX == 0xFFFFFFFFFFFFFFFFULL + /* LP64 ABI says uint64_t is unsigned long */ + typedef unsigned long XXH64_hash_t; +# else + /* the following type must have a width of 64-bit */ + typedef unsigned long long XXH64_hash_t; +# endif #endif /*! - * XXH64(): - * Returns the 64-bit hash of sequence of length @length stored at memory - * address @input. - * @seed can be used to alter the result predictably. + * @} + * + * @defgroup xxh64_family XXH64 family + * @ingroup public + * @{ + * Contains functions used in the classic 64-bit xxHash algorithm. + * + * @note + * XXH3 provides competitive speed for both 32-bit and 64-bit systems, + * and offers true 64/128 bit hash results. + * It provides better speed for systems with vector processing capabilities. + */ + + +/*! + * @brief Calculates the 64-bit hash of @p input using xxHash64. * * This function usually runs faster on 64-bit systems, but slower on 32-bit * systems (see benchmark). * - * Note: XXH3 provides competitive speed for both 32-bit and 64-bit systems, - * and offers true 64/128 bit hash results. It provides a superior level of - * dispersion, and greatly reduces the risks of collisions. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 64-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 64-bit hash. + * + * @see + * XXH32(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128(): + * Direct equivalents for the other variants of xxHash. + * @see + * XXH64_createState(), XXH64_update(), XXH64_digest(): Streaming version. */ -XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t length, XXH64_hash_t seed); +XXH_PUBLIC_API XXH64_hash_t XXH64(const void* input, size_t length, XXH64_hash_t seed); /******* Streaming *******/ +/*! + * @brief The opaque state struct for the XXH64 streaming API. + * + * @see XXH64_state_s for details. + */ typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */ XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void); XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr); @@ -400,13 +728,14 @@ typedef struct { unsigned char digest[sizeof(XXH64_hash_t)]; } XXH64_canonical_t XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash); XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src); - -/*-********************************************************************** -* XXH3 64-bit variant -************************************************************************/ - -/* ************************************************************************ - * XXH3 is a new hash algorithm featuring: +/*! + * @} + * ************************************************************************ + * @defgroup xxh3_family XXH3 family + * @ingroup public + * @{ + * + * XXH3 is a more recent hash algorithm featuring: * - Improved speed for both small and large inputs * - True 64-bit and 128-bit outputs * - SIMD acceleration @@ -416,46 +745,38 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src * * https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html * - * In general, expect XXH3 to run about ~2x faster on large inputs and >3x - * faster on small ones compared to XXH64, though exact differences depend on - * the platform. - * - * The algorithm is portable: Like XXH32 and XXH64, it generates the same hash - * on all platforms. - * - * It benefits greatly from SIMD and 64-bit arithmetic, but does not require it. + * Compared to XXH64, expect XXH3 to run approximately + * ~2x faster on large inputs and >3x faster on small ones, + * exact differences vary depending on platform. * - * Almost all 32-bit and 64-bit targets that can run XXH32 smoothly can run - * XXH3 at competitive speeds, even if XXH64 runs slowly. Further details are - * explained in the implementation. + * XXH3's speed benefits greatly from SIMD and 64-bit arithmetic, + * but does not require it. + * Any 32-bit and 64-bit targets that can run XXH32 smoothly + * can run XXH3 at competitive speeds, even without vector support. + * Further details are explained in the implementation. * * Optimized implementations are provided for AVX512, AVX2, SSE2, NEON, POWER8, - * ZVector and scalar targets. This can be controlled with the XXH_VECTOR macro. + * ZVector and scalar targets. This can be controlled via the XXH_VECTOR macro. + * + * XXH3 implementation is portable: + * it has a generic C90 formulation that can be compiled on any platform, + * all implementations generage exactly the same hash value on all platforms. + * Starting from v0.8.0, it's also labelled "stable", meaning that + * any future version will also generate the same hash value. * * XXH3 offers 2 variants, _64bits and _128bits. - * When only 64 bits are needed, prefer calling the _64bits variant, as it - * reduces the amount of mixing, resulting in faster speed on small inputs. * + * When only 64 bits are needed, prefer invoking the _64bits variant, as it + * reduces the amount of mixing, resulting in faster speed on small inputs. * It's also generally simpler to manipulate a scalar return type than a struct. * - * The 128-bit version adds additional strength, but it is slightly slower. - * - * The XXH3 algorithm is still in development. - * The results it produces may still change in future versions. - * - * Results produced by v0.7.x are not comparable with results from v0.7.y. - * However, the API is completely stable, and it can safely be used for - * ephemeral data (local sessions). - * - * Avoid storing values in long-term storage until the algorithm is finalized. - * XXH3's return values will be officially finalized upon reaching v0.8.0. - * - * After which, return values of XXH3 and XXH128 will no longer change in - * future versions. - * * The API supports one-shot hashing, streaming mode, and custom secrets. */ +/*-********************************************************************** +* XXH3 64-bit variant +************************************************************************/ + /* XXH3_64bits(): * default 64-bit variant, using default secret and default seed of 0. * It's the fastest variant. */ @@ -470,20 +791,32 @@ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* data, size_t len); */ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void* data, size_t len, XXH64_hash_t seed); +/*! + * The bare minimum size for a custom secret. + * + * @see + * XXH3_64bits_withSecret(), XXH3_64bits_reset_withSecret(), + * XXH3_128bits_withSecret(), XXH3_128bits_reset_withSecret(). + */ +#define XXH3_SECRET_SIZE_MIN 136 + /* * XXH3_64bits_withSecret(): * It's possible to provide any blob of bytes as a "secret" to generate the hash. * This makes it more difficult for an external actor to prepare an intentional collision. * The main condition is that secretSize *must* be large enough (>= XXH3_SECRET_SIZE_MIN). - * However, the quality of produced hash values depends on secret's entropy. - * Technically, the secret must look like a bunch of random bytes. + * However, the quality of the secret impacts the dispersion of the hash algorithm. + * Therefore, the secret _must_ look like a bunch of random bytes. * Avoid "trivial" or structured data such as repeated sequences or a text document. - * Whenever unsure about the "randomness" of the blob of bytes, - * consider relabelling it as a "custom seed" instead, - * and employ "XXH3_generateSecret()" (see below) - * to generate a high entropy secret derived from the custom seed. + * Whenever in doubt about the "randomness" of the blob of bytes, + * consider employing "XXH3_generateSecret()" instead (see below). + * It will generate a proper high entropy secret derived from the blob of bytes. + * Another advantage of using XXH3_generateSecret() is that + * it guarantees that all bits within the initial blob of bytes + * will impact every bit of the output. + * This is not necessarily the case when using the blob of bytes directly + * because, when hashing _small_ inputs, only a portion of the secret is employed. */ -#define XXH3_SECRET_SIZE_MIN 136 XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize); @@ -494,6 +827,12 @@ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* data, size_t len, * As a consequence, streaming is slower than one-shot hashing. * For better performance, prefer one-shot functions whenever applicable. */ + +/*! + * @brief The state struct for the XXH3 streaming API. + * + * @see XXH3_state_s for details. + */ typedef struct XXH3_state_s XXH3_state_t; XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void); XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr); @@ -533,9 +872,15 @@ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* statePtr); * XXH3 128-bit variant ************************************************************************/ +/*! + * @brief The return value from 128-bit hashes. + * + * Stored in little endian order, although the fields themselves are in native + * endianness. + */ typedef struct { - XXH64_hash_t low64; - XXH64_hash_t high64; + XXH64_hash_t low64; /*!< `value & 0xFFFFFFFFFFFFFFFF` */ + XXH64_hash_t high64; /*!< `value >> 64` */ } XXH128_hash_t; XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* data, size_t len); @@ -592,6 +937,9 @@ XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t* #endif /* XXH_NO_LONG_LONG */ +/*! + * @} + */ #endif /* XXHASH_H_5627135585666179 */ @@ -612,36 +960,57 @@ XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t* * Never **ever** access their members directly. */ +/*! + * @internal + * @brief Structure for XXH32 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH32_state_t. + * Do not access the members of this struct directly. + * @see XXH64_state_s, XXH3_state_s + */ struct XXH32_state_s { - XXH32_hash_t total_len_32; - XXH32_hash_t large_len; - XXH32_hash_t v1; - XXH32_hash_t v2; - XXH32_hash_t v3; - XXH32_hash_t v4; - XXH32_hash_t mem32[4]; - XXH32_hash_t memsize; - XXH32_hash_t reserved; /* never read nor write, might be removed in a future version */ + XXH32_hash_t total_len_32; /*!< Total length hashed, modulo 2^32 */ + XXH32_hash_t large_len; /*!< Whether the hash is >= 16 (handles @ref total_len_32 overflow) */ + XXH32_hash_t v[4]; /*!< Accumulator lanes */ + XXH32_hash_t mem32[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[16]. */ + XXH32_hash_t memsize; /*!< Amount of data in @ref mem32 */ + XXH32_hash_t reserved; /*!< Reserved field. Do not read or write to it, it may be removed. */ }; /* typedef'd to XXH32_state_t */ #ifndef XXH_NO_LONG_LONG /* defined when there is no 64-bit support */ +/*! + * @internal + * @brief Structure for XXH64 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH64_state_t. + * Do not access the members of this struct directly. + * @see XXH32_state_s, XXH3_state_s + */ struct XXH64_state_s { - XXH64_hash_t total_len; - XXH64_hash_t v1; - XXH64_hash_t v2; - XXH64_hash_t v3; - XXH64_hash_t v4; - XXH64_hash_t mem64[4]; - XXH32_hash_t memsize; - XXH32_hash_t reserved32; /* required for padding anyway */ - XXH64_hash_t reserved64; /* never read nor write, might be removed in a future version */ + XXH64_hash_t total_len; /*!< Total length hashed. This is always 64-bit. */ + XXH64_hash_t v[4]; /*!< Accumulator lanes */ + XXH64_hash_t mem64[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[32]. */ + XXH32_hash_t memsize; /*!< Amount of data in @ref mem64 */ + XXH32_hash_t reserved32; /*!< Reserved field, needed for padding anyways*/ + XXH64_hash_t reserved64; /*!< Reserved field. Do not read or write to it, it may be removed. */ }; /* typedef'd to XXH64_state_t */ -#if defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11+ */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* >= C11 */ # include <stdalign.h> # define XXH_ALIGN(n) alignas(n) +#elif defined(__cplusplus) && (__cplusplus >= 201103L) /* >= C++11 */ +/* In C++ alignas() is a keyword */ +# define XXH_ALIGN(n) alignas(n) #elif defined(__GNUC__) # define XXH_ALIGN(n) __attribute__ ((aligned(n))) #elif defined(_MSC_VER) @@ -652,35 +1021,88 @@ struct XXH64_state_s { /* Old GCC versions only accept the attribute after the type in structures. */ #if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) /* C11+ */ \ + && ! (defined(__cplusplus) && (__cplusplus >= 201103L)) /* >= C++11 */ \ && defined(__GNUC__) # define XXH_ALIGN_MEMBER(align, type) type XXH_ALIGN(align) #else # define XXH_ALIGN_MEMBER(align, type) XXH_ALIGN(align) type #endif +/*! + * @brief The size of the internal XXH3 buffer. + * + * This is the optimal update size for incremental hashing. + * + * @see XXH3_64b_update(), XXH3_128b_update(). + */ #define XXH3_INTERNALBUFFER_SIZE 256 + +/*! + * @brief Default size of the secret buffer (and @ref XXH3_kSecret). + * + * This is the size used in @ref XXH3_kSecret and the seeded functions. + * + * Not to be confused with @ref XXH3_SECRET_SIZE_MIN. + */ #define XXH3_SECRET_DEFAULT_SIZE 192 + +/*! + * @internal + * @brief Structure for XXH3 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. + * Otherwise it is an opaque type. + * Never use this definition in combination with dynamic library. + * This allows fields to safely be changed in the future. + * + * @note ** This structure has a strict alignment requirement of 64 bytes!! ** + * Do not allocate this with `malloc()` or `new`, + * it will not be sufficiently aligned. + * Use @ref XXH3_createState() and @ref XXH3_freeState(), or stack allocation. + * + * Typedef'd to @ref XXH3_state_t. + * Do never access the members of this struct directly. + * + * @see XXH3_INITSTATE() for stack initialization. + * @see XXH3_createState(), XXH3_freeState(). + * @see XXH32_state_s, XXH64_state_s + */ struct XXH3_state_s { XXH_ALIGN_MEMBER(64, XXH64_hash_t acc[8]); - /* used to store a custom secret generated from a seed */ + /*!< The 8 accumulators. Similar to `vN` in @ref XXH32_state_s::v1 and @ref XXH64_state_s */ XXH_ALIGN_MEMBER(64, unsigned char customSecret[XXH3_SECRET_DEFAULT_SIZE]); + /*!< Used to store a custom secret generated from a seed. */ XXH_ALIGN_MEMBER(64, unsigned char buffer[XXH3_INTERNALBUFFER_SIZE]); + /*!< The internal buffer. @see XXH32_state_s::mem32 */ XXH32_hash_t bufferedSize; - XXH32_hash_t reserved32; + /*!< The amount of memory in @ref buffer, @see XXH32_state_s::memsize */ + XXH32_hash_t useSeed; + /*!< Reserved field. Needed for padding on 64-bit. */ size_t nbStripesSoFar; + /*!< Number or stripes processed. */ XXH64_hash_t totalLen; + /*!< Total length hashed. 64-bit even on 32-bit targets. */ size_t nbStripesPerBlock; + /*!< Number of stripes per block. */ size_t secretLimit; + /*!< Size of @ref customSecret or @ref extSecret */ XXH64_hash_t seed; + /*!< Seed for _withSeed variants. Must be zero otherwise, @see XXH3_INITSTATE() */ XXH64_hash_t reserved64; - const unsigned char* extSecret; /* reference to external secret; - * if == NULL, use .customSecret instead */ + /*!< Reserved field. */ + const unsigned char* extSecret; + /*!< Reference to an external secret for the _withSecret variants, NULL + * for other variants. */ /* note: there may be some padding at the end due to alignment on 64 bytes */ }; /* typedef'd to XXH3_state_t */ #undef XXH_ALIGN_MEMBER -/* When the XXH3_state_t structure is merely emplaced on stack, +/*! + * @brief Initializes a stack-allocated `XXH3_state_s`. + * + * When the @ref XXH3_state_t structure is merely emplaced on stack, * it should be initialized with XXH3_INITSTATE() or a memset() * in case its first reset uses XXH3_NNbits_reset_withSeed(). * This init can be omitted if the first reset uses default or _withSecret mode. @@ -691,6 +1113,12 @@ struct XXH3_state_s { #define XXH3_INITSTATE(XXH3_state_ptr) { (XXH3_state_ptr)->seed = 0; } +/* XXH128() : + * simple alias to pre-selected XXH3_128bits variant + */ +XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t seed); + + /* === Experimental API === */ /* Symbols defined below must be considered tied to a specific library version. */ @@ -703,36 +1131,92 @@ struct XXH3_state_s { * as it becomes much more difficult for an external actor to guess how to impact the calculation logic. * * The function accepts as input a custom seed of any length and any content, - * and derives from it a high-entropy secret of length XXH3_SECRET_DEFAULT_SIZE - * into an already allocated buffer secretBuffer. - * The generated secret is _always_ XXH_SECRET_DEFAULT_SIZE bytes long. + * and derives from it a high-entropy secret of length @secretSize + * into an already allocated buffer @secretBuffer. + * @secretSize must be >= XXH3_SECRET_SIZE_MIN * * The generated secret can then be used with any `*_withSecret()` variant. * Functions `XXH3_128bits_withSecret()`, `XXH3_64bits_withSecret()`, * `XXH3_128bits_reset_withSecret()` and `XXH3_64bits_reset_withSecret()` * are part of this list. They all accept a `secret` parameter - * which must be very long for implementation reasons (>= XXH3_SECRET_SIZE_MIN) + * which must be large enough for implementation reasons (>= XXH3_SECRET_SIZE_MIN) * _and_ feature very high entropy (consist of random-looking bytes). * These conditions can be a high bar to meet, so - * this function can be used to generate a secret of proper quality. + * XXH3_generateSecret() can be employed to ensure proper quality. * * customSeed can be anything. It can have any size, even small ones, - * and its content can be anything, even stupidly "low entropy" source such as a bunch of zeroes. - * The resulting `secret` will nonetheless provide all expected qualities. + * and its content can be anything, even "poor entropy" sources such as a bunch of zeroes. + * The resulting `secret` will nonetheless provide all required qualities. * - * Supplying NULL as the customSeed copies the default secret into `secretBuffer`. * When customSeedSize > 0, supplying NULL as customSeed is undefined behavior. */ -XXH_PUBLIC_API void XXH3_generateSecret(void* secretBuffer, const void* customSeed, size_t customSeedSize); +XXH_PUBLIC_API XXH_errorcode XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSeed, size_t customSeedSize); -/* simple short-cut to pre-selected XXH3_128bits variant */ -XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t seed); +/* + * XXH3_generateSecret_fromSeed(): + * + * Generate the same secret as the _withSeed() variants. + * + * The resulting secret has a length of XXH3_SECRET_DEFAULT_SIZE (necessarily). + * @secretBuffer must be already allocated, of size at least XXH3_SECRET_DEFAULT_SIZE bytes. + * + * The generated secret can be used in combination with + *`*_withSecret()` and `_withSecretandSeed()` variants. + * This generator is notably useful in combination with `_withSecretandSeed()`, + * as a way to emulate a faster `_withSeed()` variant. + */ +XXH_PUBLIC_API void XXH3_generateSecret_fromSeed(void* secretBuffer, XXH64_hash_t seed); +/* + * *_withSecretandSeed() : + * These variants generate hash values using either + * @seed for "short" keys (< XXH3_MIDSIZE_MAX = 240 bytes) + * or @secret for "large" keys (>= XXH3_MIDSIZE_MAX). + * + * This generally benefits speed, compared to `_withSeed()` or `_withSecret()`. + * `_withSeed()` has to generate the secret on the fly for "large" keys. + * It's fast, but can be perceptible for "not so large" keys (< 1 KB). + * `_withSecret()` has to generate the masks on the fly for "small" keys, + * which requires more instructions than _withSeed() variants. + * Therefore, _withSecretandSeed variant combines the best of both worlds. + * + * When @secret has been generated by XXH3_generateSecret_fromSeed(), + * this variant produces *exactly* the same results as `_withSeed()` variant, + * hence offering only a pure speed benefit on "large" input, + * by skipping the need to regenerate the secret for every large input. + * + * Another usage scenario is to hash the secret to a 64-bit hash value, + * for example with XXH3_64bits(), which then becomes the seed, + * and then employ both the seed and the secret in _withSecretandSeed(). + * On top of speed, an added benefit is that each bit in the secret + * has a 50% chance to swap each bit in the output, + * via its impact to the seed. + * This is not guaranteed when using the secret directly in "small data" scenarios, + * because only portions of the secret are employed for small data. + */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecretandSeed(const void* data, size_t len, + const void* secret, size_t secretSize, + XXH64_hash_t seed); -#endif /* XXH_NO_LONG_LONG */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecretandSeed(const void* data, size_t len, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + + +#endif /* XXH_NO_LONG_LONG */ #if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) # define XXH_IMPLEMENTATION #endif @@ -774,8 +1258,24 @@ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t s /* ************************************* * Tuning parameters ***************************************/ + /*! - * XXH_FORCE_MEMORY_ACCESS: + * @defgroup tuning Tuning parameters + * @{ + * + * Various macros to control xxHash's behavior. + */ +#ifdef XXH_DOXYGEN +/*! + * @brief Define this to disable 64-bit code. + * + * Useful if only using the @ref xxh32_family and you have a strict C90 compiler. + */ +# define XXH_NO_LONG_LONG +# undef XXH_NO_LONG_LONG /* don't actually */ +/*! + * @brief Controls how unaligned memory is accessed. + * * By default, access to unaligned memory is controlled by `memcpy()`, which is * safe and portable. * @@ -784,58 +1284,65 @@ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t s * * The below switch allow selection of a different access method * in the search for improved performance. - * Method 0 (default): - * Use `memcpy()`. Safe and portable. Default. - * Method 1: - * `__attribute__((packed))` statement. It depends on compiler extensions - * and is therefore not portable. - * This method is safe if your compiler supports it, and *generally* as - * fast or faster than `memcpy`. - * Method 2: - * Direct access via cast. This method doesn't depend on the compiler but - * violates the C standard. - * It can generate buggy code on targets which do not support unaligned - * memory accesses. - * But in some circumstances, it's the only known way to get the most - * performance (example: GCC + ARMv6) - * Method 3: - * Byteshift. This can generate the best code on old compilers which don't + * + * @par Possible options: + * + * - `XXH_FORCE_MEMORY_ACCESS=0` (default): `memcpy` + * @par + * Use `memcpy()`. Safe and portable. Note that most modern compilers will + * eliminate the function call and treat it as an unaligned access. + * + * - `XXH_FORCE_MEMORY_ACCESS=1`: `__attribute__((packed))` + * @par + * Depends on compiler extensions and is therefore not portable. + * This method is safe _if_ your compiler supports it, + * and *generally* as fast or faster than `memcpy`. + * + * - `XXH_FORCE_MEMORY_ACCESS=2`: Direct cast + * @par + * Casts directly and dereferences. This method doesn't depend on the + * compiler, but it violates the C standard as it directly dereferences an + * unaligned pointer. It can generate buggy code on targets which do not + * support unaligned memory accesses, but in some circumstances, it's the + * only known way to get the most performance. + * + * - `XXH_FORCE_MEMORY_ACCESS=3`: Byteshift + * @par + * Also portable. This can generate the best code on old compilers which don't * inline small `memcpy()` calls, and it might also be faster on big-endian - * systems which lack a native byteswap instruction. - * See https://stackoverflow.com/a/32095106/646947 for details. - * Prefer these methods in priority order (0 > 1 > 2 > 3) + * systems which lack a native byteswap instruction. However, some compilers + * will emit literal byteshifts even if the target supports unaligned access. + * . + * + * @warning + * Methods 1 and 2 rely on implementation-defined behavior. Use these with + * care, as what works on one compiler/platform/optimization level may cause + * another to read garbage data or even crash. + * + * See http://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html for details. + * + * Prefer these methods in priority order (0 > 3 > 1 > 2) */ -#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ -# if !defined(__clang__) && defined(__GNUC__) && defined(__ARM_FEATURE_UNALIGNED) && defined(__ARM_ARCH) && (__ARM_ARCH == 6) -# define XXH_FORCE_MEMORY_ACCESS 2 -# elif !defined(__clang__) && ((defined(__INTEL_COMPILER) && !defined(_WIN32)) || \ - (defined(__GNUC__) && (defined(__ARM_ARCH) && __ARM_ARCH >= 7))) -# define XXH_FORCE_MEMORY_ACCESS 1 -# endif -#endif +# define XXH_FORCE_MEMORY_ACCESS 0 /*! - * XXH_ACCEPT_NULL_INPUT_POINTER: - * If the input pointer is NULL, xxHash's default behavior is to dereference it, - * triggering a segfault. - * When this macro is enabled, xxHash actively checks the input for a null pointer. - * If it is, the result for null input pointers is the same as a zero-length input. - */ -#ifndef XXH_ACCEPT_NULL_INPUT_POINTER /* can be defined externally */ -# define XXH_ACCEPT_NULL_INPUT_POINTER 0 -#endif - -/*! - * XXH_FORCE_ALIGN_CHECK: - * This is an important performance trick - * for architectures without decent unaligned memory access performance. - * It checks for input alignment, and when conditions are met, - * uses a "fast path" employing direct 32-bit/64-bit read, - * resulting in _dramatically faster_ read speed. + * @def XXH_FORCE_ALIGN_CHECK + * @brief If defined to non-zero, adds a special path for aligned inputs (XXH32() + * and XXH64() only). + * + * This is an important performance trick for architectures without decent + * unaligned memory access performance. + * + * It checks for input alignment, and when conditions are met, uses a "fast + * path" employing direct 32-bit/64-bit reads, resulting in _dramatically + * faster_ read speed. + * + * The check costs one initial branch per hash, which is generally negligible, + * but not zero. * - * The check costs one initial branch per hash, which is generally negligible, but not zero. - * Moreover, it's not useful to generate binary for an additional code path - * if memory access uses same instruction for both aligned and unaligned adresses. + * Moreover, it's not useful to generate an additional code path if memory + * access uses the same instruction for both aligned and unaligned + * addresses (e.g. x86 and aarch64). * * In these cases, the alignment check can be removed by setting this macro to 0. * Then the code will always use unaligned memory access. @@ -844,17 +1351,11 @@ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t s * * This option does not affect XXH3 (only XXH32 and XXH64). */ -#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ -# if defined(__i386) || defined(__x86_64__) || defined(__aarch64__) \ - || defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64) /* visual */ -# define XXH_FORCE_ALIGN_CHECK 0 -# else -# define XXH_FORCE_ALIGN_CHECK 1 -# endif -#endif +# define XXH_FORCE_ALIGN_CHECK 0 /*! - * XXH_NO_INLINE_HINTS: + * @def XXH_NO_INLINE_HINTS + * @brief When non-zero, sets all functions to `static`. * * By default, xxHash tries to force the compiler to inline almost all internal * functions. @@ -872,6 +1373,63 @@ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t s * When not optimizing (-O0), optimizing for size (-Os, -Oz), or using * -fno-inline with GCC or Clang, this will automatically be defined. */ +# define XXH_NO_INLINE_HINTS 0 + +/*! + * @def XXH32_ENDJMP + * @brief Whether to use a jump for `XXH32_finalize`. + * + * For performance, `XXH32_finalize` uses multiple branches in the finalizer. + * This is generally preferable for performance, + * but depending on exact architecture, a jmp may be preferable. + * + * This setting is only possibly making a difference for very small inputs. + */ +# define XXH32_ENDJMP 0 + +/*! + * @internal + * @brief Redefines old internal names. + * + * For compatibility with code that uses xxHash's internals before the names + * were changed to improve namespacing. There is no other reason to use this. + */ +# define XXH_OLD_NAMES +# undef XXH_OLD_NAMES /* don't actually use, it is ugly. */ +#endif /* XXH_DOXYGEN */ +/*! + * @} + */ + +#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ + /* prefer __packed__ structures (method 1) for gcc on armv7+ and mips */ +# if !defined(__clang__) && \ +( \ + (defined(__INTEL_COMPILER) && !defined(_WIN32)) || \ + ( \ + defined(__GNUC__) && ( \ + (defined(__ARM_ARCH) && __ARM_ARCH >= 7) || \ + ( \ + defined(__mips__) && \ + (__mips <= 5 || __mips_isa_rev < 6) && \ + (!defined(__mips16) || defined(__mips_mips16e2)) \ + ) \ + ) \ + ) \ +) +# define XXH_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ +# if defined(__i386) || defined(__x86_64__) || defined(__aarch64__) \ + || defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64) /* visual */ +# define XXH_FORCE_ALIGN_CHECK 0 +# else +# define XXH_FORCE_ALIGN_CHECK 1 +# endif +#endif + #ifndef XXH_NO_INLINE_HINTS # if defined(__OPTIMIZE_SIZE__) /* -Os, -Oz */ \ || defined(__NO_INLINE__) /* -O0, -fno-inline */ @@ -881,36 +1439,44 @@ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t s # endif #endif +#ifndef XXH32_ENDJMP +/* generally preferable for performance */ +# define XXH32_ENDJMP 0 +#endif + /*! - * XXH_REROLL: - * Whether to reroll XXH32_finalize, and XXH64_finalize, - * instead of using an unrolled jump table/if statement loop. - * - * This is automatically defined on -Os/-Oz on GCC and Clang. + * @defgroup impl Implementation + * @{ */ -#ifndef XXH_REROLL -# if defined(__OPTIMIZE_SIZE__) -# define XXH_REROLL 1 -# else -# define XXH_REROLL 0 -# endif -#endif /* ************************************* * Includes & Memory related functions ***************************************/ -/*! +/* * Modify the local functions below should you wish to use * different memory routines for malloc() and free() */ #include <stdlib.h> +/*! + * @internal + * @brief Modify this function to use a different routine than malloc(). + */ static void* XXH_malloc(size_t s) { return malloc(s); } + +/*! + * @internal + * @brief Modify this function to use a different routine than free(). + */ static void XXH_free(void* p) { free(p); } -/*! and for memcpy() */ #include <string.h> + +/*! + * @internal + * @brief Modify this function to use a different routine than memcpy(). + */ static void* XXH_memcpy(void* dest, const void* src, size_t size) { return memcpy(dest,src,size); @@ -927,19 +1493,19 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size) #endif #if XXH_NO_INLINE_HINTS /* disable inlining hints */ -# if defined(__GNUC__) +# if defined(__GNUC__) || defined(__clang__) # define XXH_FORCE_INLINE static __attribute__((unused)) # else # define XXH_FORCE_INLINE static # endif # define XXH_NO_INLINE static /* enable inlining hints */ +#elif defined(__GNUC__) || defined(__clang__) +# define XXH_FORCE_INLINE static __inline__ __attribute__((always_inline, unused)) +# define XXH_NO_INLINE static __attribute__((noinline)) #elif defined(_MSC_VER) /* Visual Studio */ # define XXH_FORCE_INLINE static __forceinline # define XXH_NO_INLINE static __declspec(noinline) -#elif defined(__GNUC__) -# define XXH_FORCE_INLINE static __inline__ __attribute__((always_inline, unused)) -# define XXH_NO_INLINE static __attribute__((noinline)) #elif defined (__cplusplus) \ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) /* C99 */ # define XXH_FORCE_INLINE static inline @@ -954,7 +1520,11 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size) /* ************************************* * Debug ***************************************/ -/* +/*! + * @ingroup tuning + * @def XXH_DEBUGLEVEL + * @brief Sets the debugging level. + * * XXH_DEBUGLEVEL is expected to be defined externally, typically via the * compiler's command line options. The value must be a number. */ @@ -974,8 +1544,39 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size) #endif /* note: use after variable declarations */ -#define XXH_STATIC_ASSERT(c) do { enum { XXH_sa = 1/(int)(!!(c)) }; } while (0) +#ifndef XXH_STATIC_ASSERT +# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */ +# include <assert.h> +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0) +# elif defined(__cplusplus) && (__cplusplus >= 201103L) /* C++11 */ +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0) +# else +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { struct xxh_sa { char x[(c) ? 1 : -1]; }; } while(0) +# endif +# define XXH_STATIC_ASSERT(c) XXH_STATIC_ASSERT_WITH_MESSAGE((c),#c) +#endif +/*! + * @internal + * @def XXH_COMPILER_GUARD(var) + * @brief Used to prevent unwanted optimizations for @p var. + * + * It uses an empty GCC inline assembly statement with a register constraint + * which forces @p var into a general purpose register (eg eax, ebx, ecx + * on x86) and marks it as modified. + * + * This is used in a few places to avoid unwanted autovectorization (e.g. + * XXH32_round()). All vectorization we want is explicit via intrinsics, + * and _usually_ isn't wanted elsewhere. + * + * We also use it to prevent unwanted constant folding for AArch64 in + * XXH3_initCustomSecret_scalar(). + */ +#if defined(__GNUC__) || defined(__clang__) +# define XXH_COMPILER_GUARD(var) __asm__ __volatile__("" : "+r" (var)) +#else +# define XXH_COMPILER_GUARD(var) ((void)0) +#endif /* ************************************* * Basic Types @@ -998,6 +1599,56 @@ typedef XXH32_hash_t xxh_u32; /* *** Memory access *** */ +/*! + * @internal + * @fn xxh_u32 XXH_read32(const void* ptr) + * @brief Reads an unaligned 32-bit integer from @p ptr in native endianness. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit native endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32(const void* ptr) + * @brief Reads an unaligned 32-bit little endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readBE32(const void* ptr) + * @brief Reads an unaligned 32-bit big endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit big endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32_align(const void* ptr, XXH_alignment align) + * @brief Like @ref XXH_readLE32(), but has an option for aligned reads. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * Note that when @ref XXH_FORCE_ALIGN_CHECK == 0, the @p align parameter is + * always @ref XXH_alignment::XXH_unaligned. + * + * @param ptr The pointer to read from. + * @param align Whether @p ptr is aligned. + * @pre + * If @p align == @ref XXH_alignment::XXH_aligned, @p ptr must be 4 byte + * aligned. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + #if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) /* * Manual byteshift. Best for old compilers which don't inline memcpy. @@ -1032,28 +1683,35 @@ static xxh_u32 XXH_read32(const void* ptr) /* * Portable and safe solution. Generally efficient. - * see: https://stackoverflow.com/a/32095106/646947 + * see: http://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html */ static xxh_u32 XXH_read32(const void* memPtr) { xxh_u32 val; - memcpy(&val, memPtr, sizeof(val)); + XXH_memcpy(&val, memPtr, sizeof(val)); return val; } #endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ -/* *** Endianess *** */ -typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess; +/* *** Endianness *** */ /*! - * XXH_CPU_LITTLE_ENDIAN: + * @ingroup tuning + * @def XXH_CPU_LITTLE_ENDIAN + * @brief Whether the target is little endian. + * * Defined to 1 if the target is little endian, or 0 if it is big endian. * It can be defined externally, for example on the compiler command line. * - * If it is not defined, a runtime check (which is usually constant folded) - * is used instead. + * If it is not defined, + * a runtime check (which is usually constant folded) is used instead. + * + * @note + * This is not necessarily defined to an integer constant. + * + * @see XXH_isLittleEndian() for the runtime check. */ #ifndef XXH_CPU_LITTLE_ENDIAN /* @@ -1068,8 +1726,11 @@ typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess; || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) # define XXH_CPU_LITTLE_ENDIAN 0 # else -/* - * runtime test, presumed to simplify to a constant by compiler +/*! + * @internal + * @brief Runtime check for @ref XXH_CPU_LITTLE_ENDIAN. + * + * Most compilers will constant fold this. */ static int XXH_isLittleEndian(void) { @@ -1098,6 +1759,19 @@ static int XXH_isLittleEndian(void) # define XXH_HAS_BUILTIN(x) 0 #endif +/*! + * @internal + * @def XXH_rotl32(x,r) + * @brief 32-bit rotate left. + * + * @param x The 32-bit integer to be rotated. + * @param r The number of bits to rotate. + * @pre + * @p r > 0 && @p r < 32 + * @note + * @p x and @p r may be evaluated multiple times. + * @return The rotated result. + */ #if !defined(NO_CLANG_BUILTIN) && XXH_HAS_BUILTIN(__builtin_rotateleft32) \ && XXH_HAS_BUILTIN(__builtin_rotateleft64) # define XXH_rotl32 __builtin_rotateleft32 @@ -1111,6 +1785,14 @@ static int XXH_isLittleEndian(void) # define XXH_rotl64(x,r) (((x) << (r)) | ((x) >> (64 - (r)))) #endif +/*! + * @internal + * @fn xxh_u32 XXH_swap32(xxh_u32 x) + * @brief A 32-bit byteswap. + * + * @param x The 32-bit integer to byteswap. + * @return @p x, byteswapped. + */ #if defined(_MSC_VER) /* Visual Studio */ # define XXH_swap32 _byteswap_ulong #elif XXH_GCC_VERSION >= 403 @@ -1129,7 +1811,15 @@ static xxh_u32 XXH_swap32 (xxh_u32 x) /* *************************** * Memory reads *****************************/ -typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment; + +/*! + * @internal + * @brief Enum to indicate whether a pointer is aligned. + */ +typedef enum { + XXH_aligned, /*!< Aligned */ + XXH_unaligned /*!< Possibly unaligned */ +} XXH_alignment; /* * XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. @@ -1182,17 +1872,25 @@ XXH_readLE32_align(const void* ptr, XXH_alignment align) /* ************************************* * Misc ***************************************/ +/*! @ingroup public */ XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; } /* ******************************************************************* * 32-bit hash functions *********************************************************************/ -static const xxh_u32 XXH_PRIME32_1 = 0x9E3779B1U; /* 0b10011110001101110111100110110001 */ -static const xxh_u32 XXH_PRIME32_2 = 0x85EBCA77U; /* 0b10000101111010111100101001110111 */ -static const xxh_u32 XXH_PRIME32_3 = 0xC2B2AE3DU; /* 0b11000010101100101010111000111101 */ -static const xxh_u32 XXH_PRIME32_4 = 0x27D4EB2FU; /* 0b00100111110101001110101100101111 */ -static const xxh_u32 XXH_PRIME32_5 = 0x165667B1U; /* 0b00010110010101100110011110110001 */ +/*! + * @} + * @defgroup xxh32_impl XXH32 implementation + * @ingroup impl + * @{ + */ + /* #define instead of static const, to be used as initializers */ +#define XXH_PRIME32_1 0x9E3779B1U /*!< 0b10011110001101110111100110110001 */ +#define XXH_PRIME32_2 0x85EBCA77U /*!< 0b10000101111010111100101001110111 */ +#define XXH_PRIME32_3 0xC2B2AE3DU /*!< 0b11000010101100101010111000111101 */ +#define XXH_PRIME32_4 0x27D4EB2FU /*!< 0b00100111110101001110101100101111 */ +#define XXH_PRIME32_5 0x165667B1U /*!< 0b00010110010101100110011110110001 */ #ifdef XXH_OLD_NAMES # define PRIME32_1 XXH_PRIME32_1 @@ -1202,18 +1900,28 @@ static const xxh_u32 XXH_PRIME32_5 = 0x165667B1U; /* 0b00010110010101100110011 # define PRIME32_5 XXH_PRIME32_5 #endif +/*! + * @internal + * @brief Normal stripe processing routine. + * + * This shuffles the bits so that any bit from @p input impacts several bits in + * @p acc. + * + * @param acc The accumulator lane. + * @param input The stripe of input to mix. + * @return The mixed accumulator lane. + */ static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input) { acc += input * XXH_PRIME32_2; acc = XXH_rotl32(acc, 13); acc *= XXH_PRIME32_1; -#if defined(__GNUC__) && defined(__SSE4_1__) && !defined(XXH_ENABLE_AUTOVECTORIZE) +#if (defined(__SSE4_1__) || defined(__aarch64__)) && !defined(XXH_ENABLE_AUTOVECTORIZE) /* * UGLY HACK: - * This inline assembly hack forces acc into a normal register. This is the - * only thing that prevents GCC and Clang from autovectorizing the XXH32 - * loop (pragmas and attributes don't work for some resason) without globally - * disabling SSE4.1. + * A compiler fence is the only thing that prevents GCC and Clang from + * autovectorizing the XXH32 loop (pragmas and attributes don't work for some + * reason) without globally disabling SSE4.1. * * The reason we want to avoid vectorization is because despite working on * 4 integers at a time, there are multiple factors slowing XXH32 down on @@ -1238,27 +1946,25 @@ static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input) * can load data, while v3 can multiply. SSE forces them to operate * together. * - * How this hack works: - * __asm__("" // Declare an assembly block but don't declare any instructions - * : // However, as an Input/Output Operand, - * "+r" // constrain a read/write operand (+) as a general purpose register (r). - * (acc) // and set acc as the operand - * ); - * - * Because of the 'r', the compiler has promised that seed will be in a - * general purpose register and the '+' says that it will be 'read/write', - * so it has to assume it has changed. It is like volatile without all the - * loads and stores. - * - * Since the argument has to be in a normal register (not an SSE register), - * each time XXH32_round is called, it is impossible to vectorize. + * This is also enabled on AArch64, as Clang autovectorizes it incorrectly + * and it is pointless writing a NEON implementation that is basically the + * same speed as scalar for XXH32. */ - __asm__("" : "+r" (acc)); + XXH_COMPILER_GUARD(acc); #endif return acc; } -/* mix all bits */ +/*! + * @internal + * @brief Mixes all bits to finalize the hash. + * + * The final mix ensures that all input bits have a chance to impact any bit in + * the output digest, resulting in an unbiased distribution. + * + * @param h32 The hash to avalanche. + * @return The avalanched hash. + */ static xxh_u32 XXH32_avalanche(xxh_u32 h32) { h32 ^= h32 >> 15; @@ -1271,6 +1977,20 @@ static xxh_u32 XXH32_avalanche(xxh_u32 h32) #define XXH_get32bits(p) XXH_readLE32_align(p, align) +/*! + * @internal + * @brief Processes the last 0-15 bytes of @p ptr. + * + * There may be up to 15 bytes remaining to consume from the input. + * This final stage will digest them to ensure that all input bytes are present + * in the final mix. + * + * @param h32 The hash to finalize. + * @param ptr The pointer to the remaining input. + * @param len The remaining length, modulo 16. + * @param align Whether @p ptr is aligned. + * @return The finalized hash. + */ static xxh_u32 XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align) { @@ -1285,8 +2005,10 @@ XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align) h32 = XXH_rotl32(h32, 17) * XXH_PRIME32_4; \ } while (0) - /* Compact rerolled version */ - if (XXH_REROLL) { + if (ptr==NULL) XXH_ASSERT(len == 0); + + /* Compact rerolled version; generally faster */ + if (!XXH32_ENDJMP) { len &= 15; while (len >= 4) { XXH_PROCESS4; @@ -1300,41 +2022,41 @@ XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align) } else { switch(len&15) /* or switch(bEnd - p) */ { case 12: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 8: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 4: XXH_PROCESS4; return XXH32_avalanche(h32); case 13: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 9: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 5: XXH_PROCESS4; XXH_PROCESS1; return XXH32_avalanche(h32); case 14: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 10: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 6: XXH_PROCESS4; XXH_PROCESS1; XXH_PROCESS1; return XXH32_avalanche(h32); case 15: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 11: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 7: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 3: XXH_PROCESS1; - /* fallthrough */ + XXH_FALLTHROUGH; case 2: XXH_PROCESS1; - /* fallthrough */ + XXH_FALLTHROUGH; case 1: XXH_PROCESS1; - /* fallthrough */ + XXH_FALLTHROUGH; case 0: return XXH32_avalanche(h32); } XXH_ASSERT(0); @@ -1350,20 +2072,23 @@ XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align) # undef XXH_PROCESS4 #endif +/*! + * @internal + * @brief The implementation for @ref XXH32(). + * + * @param input , len , seed Directly passed from @ref XXH32(). + * @param align Whether @p input is aligned. + * @return The calculated hash. + */ XXH_FORCE_INLINE xxh_u32 XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment align) { - const xxh_u8* bEnd = input + len; xxh_u32 h32; -#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) - if (input==NULL) { - len=0; - bEnd=input=(const xxh_u8*)(size_t)16; - } -#endif + if (input==NULL) XXH_ASSERT(len == 0); if (len>=16) { + const xxh_u8* const bEnd = input + len; const xxh_u8* const limit = bEnd - 15; xxh_u32 v1 = seed + XXH_PRIME32_1 + XXH_PRIME32_2; xxh_u32 v2 = seed + XXH_PRIME32_2; @@ -1388,7 +2113,7 @@ XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment return XXH32_finalize(h32, input, len&15, align); } - +/*! @ingroup xxh32_family */ XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t seed) { #if 0 @@ -1397,9 +2122,7 @@ XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t s XXH32_reset(&state, seed); XXH32_update(&state, (const xxh_u8*)input, len); return XXH32_digest(&state); - #else - if (XXH_FORCE_ALIGN_CHECK) { if ((((size_t)input) & 3) == 0) { /* Input is 4-bytes aligned, leverage the speed benefit */ return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_aligned); @@ -1412,45 +2135,49 @@ XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t s /******* Hash streaming *******/ - +/*! + * @ingroup xxh32_family + */ XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void) { return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t)); } +/*! @ingroup xxh32_family */ XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr) { XXH_free(statePtr); return XXH_OK; } +/*! @ingroup xxh32_family */ XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState) { - memcpy(dstState, srcState, sizeof(*dstState)); + XXH_memcpy(dstState, srcState, sizeof(*dstState)); } +/*! @ingroup xxh32_family */ XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, XXH32_hash_t seed) { XXH32_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */ memset(&state, 0, sizeof(state)); - state.v1 = seed + XXH_PRIME32_1 + XXH_PRIME32_2; - state.v2 = seed + XXH_PRIME32_2; - state.v3 = seed + 0; - state.v4 = seed - XXH_PRIME32_1; + state.v[0] = seed + XXH_PRIME32_1 + XXH_PRIME32_2; + state.v[1] = seed + XXH_PRIME32_2; + state.v[2] = seed + 0; + state.v[3] = seed - XXH_PRIME32_1; /* do not write into reserved, planned to be removed in a future version */ - memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved)); + XXH_memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved)); return XXH_OK; } +/*! @ingroup xxh32_family */ XXH_PUBLIC_API XXH_errorcode XXH32_update(XXH32_state_t* state, const void* input, size_t len) { - if (input==NULL) -#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) + if (input==NULL) { + XXH_ASSERT(len == 0); return XXH_OK; -#else - return XXH_ERROR; -#endif + } { const xxh_u8* p = (const xxh_u8*)input; const xxh_u8* const bEnd = p + len; @@ -1467,10 +2194,10 @@ XXH32_update(XXH32_state_t* state, const void* input, size_t len) if (state->memsize) { /* some data left from previous update */ XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, 16-state->memsize); { const xxh_u32* p32 = state->mem32; - state->v1 = XXH32_round(state->v1, XXH_readLE32(p32)); p32++; - state->v2 = XXH32_round(state->v2, XXH_readLE32(p32)); p32++; - state->v3 = XXH32_round(state->v3, XXH_readLE32(p32)); p32++; - state->v4 = XXH32_round(state->v4, XXH_readLE32(p32)); + state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p32)); p32++; + state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p32)); p32++; + state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p32)); p32++; + state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p32)); } p += 16-state->memsize; state->memsize = 0; @@ -1478,22 +2205,14 @@ XXH32_update(XXH32_state_t* state, const void* input, size_t len) if (p <= bEnd-16) { const xxh_u8* const limit = bEnd - 16; - xxh_u32 v1 = state->v1; - xxh_u32 v2 = state->v2; - xxh_u32 v3 = state->v3; - xxh_u32 v4 = state->v4; do { - v1 = XXH32_round(v1, XXH_readLE32(p)); p+=4; - v2 = XXH32_round(v2, XXH_readLE32(p)); p+=4; - v3 = XXH32_round(v3, XXH_readLE32(p)); p+=4; - v4 = XXH32_round(v4, XXH_readLE32(p)); p+=4; + state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p)); p+=4; + state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p)); p+=4; + state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p)); p+=4; + state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p)); p+=4; } while (p<=limit); - state->v1 = v1; - state->v2 = v2; - state->v3 = v3; - state->v4 = v4; } if (p < bEnd) { @@ -1506,17 +2225,18 @@ XXH32_update(XXH32_state_t* state, const void* input, size_t len) } -XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* state) +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32_digest(const XXH32_state_t* state) { xxh_u32 h32; if (state->large_len) { - h32 = XXH_rotl32(state->v1, 1) - + XXH_rotl32(state->v2, 7) - + XXH_rotl32(state->v3, 12) - + XXH_rotl32(state->v4, 18); + h32 = XXH_rotl32(state->v[0], 1) + + XXH_rotl32(state->v[1], 7) + + XXH_rotl32(state->v[2], 12) + + XXH_rotl32(state->v[3], 18); } else { - h32 = state->v3 /* == seed */ + XXH_PRIME32_5; + h32 = state->v[2] /* == seed */ + XXH_PRIME32_5; } h32 += state->total_len_32; @@ -1527,7 +2247,8 @@ XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* state) /******* Canonical representation *******/ -/* +/*! + * @ingroup xxh32_family * The default return values from XXH functions are unsigned 32 and 64 bit * integers. * @@ -1544,9 +2265,9 @@ XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t { XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t)); if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash); - memcpy(dst, &hash, sizeof(*dst)); + XXH_memcpy(dst, &hash, sizeof(*dst)); } - +/*! @ingroup xxh32_family */ XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src) { return XXH_readBE32(src); @@ -1558,7 +2279,11 @@ XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src /* ******************************************************************* * 64-bit hash functions *********************************************************************/ - +/*! + * @} + * @ingroup impl + * @{ + */ /******* Memory access *******/ typedef XXH64_hash_t xxh_u64; @@ -1567,35 +2292,6 @@ typedef XXH64_hash_t xxh_u64; # define U64 xxh_u64 #endif -/*! - * XXH_REROLL_XXH64: - * Whether to reroll the XXH64_finalize() loop. - * - * Just like XXH32, we can unroll the XXH64_finalize() loop. This can be a - * performance gain on 64-bit hosts, as only one jump is required. - * - * However, on 32-bit hosts, because arithmetic needs to be done with two 32-bit - * registers, and 64-bit arithmetic needs to be simulated, it isn't beneficial - * to unroll. The code becomes ridiculously large (the largest function in the - * binary on i386!), and rerolling it saves anywhere from 3kB to 20kB. It is - * also slightly faster because it fits into cache better and is more likely - * to be inlined by the compiler. - * - * If XXH_REROLL is defined, this is ignored and the loop is always rerolled. - */ -#ifndef XXH_REROLL_XXH64 -# if (defined(__ILP32__) || defined(_ILP32)) /* ILP32 is often defined on 32-bit GCC family */ \ - || !(defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) /* x86-64 */ \ - || defined(_M_ARM64) || defined(__aarch64__) || defined(__arm64__) /* aarch64 */ \ - || defined(__PPC64__) || defined(__PPC64LE__) || defined(__ppc64__) || defined(__powerpc64__) /* ppc64 */ \ - || defined(__mips64__) || defined(__mips64)) /* mips64 */ \ - || (!defined(SIZE_MAX) || SIZE_MAX < ULLONG_MAX) /* check limits */ -# define XXH_REROLL_XXH64 1 -# else -# define XXH_REROLL_XXH64 0 -# endif -#endif /* !defined(XXH_REROLL_XXH64) */ - #if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) /* * Manual byteshift. Best for old compilers which don't inline memcpy. @@ -1604,7 +2300,10 @@ typedef XXH64_hash_t xxh_u64; #elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) /* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ -static xxh_u64 XXH_read64(const void* memPtr) { return *(const xxh_u64*) memPtr; } +static xxh_u64 XXH_read64(const void* memPtr) +{ + return *(const xxh_u64*) memPtr; +} #elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) @@ -1627,12 +2326,12 @@ static xxh_u64 XXH_read64(const void* ptr) /* * Portable and safe solution. Generally efficient. - * see: https://stackoverflow.com/a/32095106/646947 + * see: http://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html */ static xxh_u64 XXH_read64(const void* memPtr) { xxh_u64 val; - memcpy(&val, memPtr, sizeof(val)); + XXH_memcpy(&val, memPtr, sizeof(val)); return val; } @@ -1643,7 +2342,7 @@ static xxh_u64 XXH_read64(const void* memPtr) #elif XXH_GCC_VERSION >= 403 # define XXH_swap64 __builtin_bswap64 #else -static xxh_u64 XXH_swap64 (xxh_u64 x) +static xxh_u64 XXH_swap64(xxh_u64 x) { return ((x << 56) & 0xff00000000000000ULL) | ((x << 40) & 0x00ff000000000000ULL) | @@ -1709,12 +2408,18 @@ XXH_readLE64_align(const void* ptr, XXH_alignment align) /******* xxh64 *******/ - -static const xxh_u64 XXH_PRIME64_1 = 0x9E3779B185EBCA87ULL; /* 0b1001111000110111011110011011000110000101111010111100101010000111 */ -static const xxh_u64 XXH_PRIME64_2 = 0xC2B2AE3D27D4EB4FULL; /* 0b1100001010110010101011100011110100100111110101001110101101001111 */ -static const xxh_u64 XXH_PRIME64_3 = 0x165667B19E3779F9ULL; /* 0b0001011001010110011001111011000110011110001101110111100111111001 */ -static const xxh_u64 XXH_PRIME64_4 = 0x85EBCA77C2B2AE63ULL; /* 0b1000010111101011110010100111011111000010101100101010111001100011 */ -static const xxh_u64 XXH_PRIME64_5 = 0x27D4EB2F165667C5ULL; /* 0b0010011111010100111010110010111100010110010101100110011111000101 */ +/*! + * @} + * @defgroup xxh64_impl XXH64 implementation + * @ingroup impl + * @{ + */ +/* #define rather that static const, to be used as initializers */ +#define XXH_PRIME64_1 0x9E3779B185EBCA87ULL /*!< 0b1001111000110111011110011011000110000101111010111100101010000111 */ +#define XXH_PRIME64_2 0xC2B2AE3D27D4EB4FULL /*!< 0b1100001010110010101011100011110100100111110101001110101101001111 */ +#define XXH_PRIME64_3 0x165667B19E3779F9ULL /*!< 0b0001011001010110011001111011000110011110001101110111100111111001 */ +#define XXH_PRIME64_4 0x85EBCA77C2B2AE63ULL /*!< 0b1000010111101011110010100111011111000010101100101010111001100011 */ +#define XXH_PRIME64_5 0x27D4EB2F165667C5ULL /*!< 0b0010011111010100111010110010111100010110010101100110011111000101 */ #ifdef XXH_OLD_NAMES # define PRIME64_1 XXH_PRIME64_1 @@ -1756,126 +2461,27 @@ static xxh_u64 XXH64_avalanche(xxh_u64 h64) static xxh_u64 XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align) { -#define XXH_PROCESS1_64 do { \ - h64 ^= (*ptr++) * XXH_PRIME64_5; \ - h64 = XXH_rotl64(h64, 11) * XXH_PRIME64_1; \ -} while (0) - -#define XXH_PROCESS4_64 do { \ - h64 ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1; \ - ptr += 4; \ - h64 = XXH_rotl64(h64, 23) * XXH_PRIME64_2 + XXH_PRIME64_3; \ -} while (0) - -#define XXH_PROCESS8_64 do { \ - xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr)); \ - ptr += 8; \ - h64 ^= k1; \ - h64 = XXH_rotl64(h64,27) * XXH_PRIME64_1 + XXH_PRIME64_4; \ -} while (0) - - /* Rerolled version for 32-bit targets is faster and much smaller. */ - if (XXH_REROLL || XXH_REROLL_XXH64) { - len &= 31; - while (len >= 8) { - XXH_PROCESS8_64; - len -= 8; - } - if (len >= 4) { - XXH_PROCESS4_64; - len -= 4; - } - while (len > 0) { - XXH_PROCESS1_64; - --len; - } - return XXH64_avalanche(h64); - } else { - switch(len & 31) { - case 24: XXH_PROCESS8_64; - /* fallthrough */ - case 16: XXH_PROCESS8_64; - /* fallthrough */ - case 8: XXH_PROCESS8_64; - return XXH64_avalanche(h64); - - case 28: XXH_PROCESS8_64; - /* fallthrough */ - case 20: XXH_PROCESS8_64; - /* fallthrough */ - case 12: XXH_PROCESS8_64; - /* fallthrough */ - case 4: XXH_PROCESS4_64; - return XXH64_avalanche(h64); - - case 25: XXH_PROCESS8_64; - /* fallthrough */ - case 17: XXH_PROCESS8_64; - /* fallthrough */ - case 9: XXH_PROCESS8_64; - XXH_PROCESS1_64; - return XXH64_avalanche(h64); - - case 29: XXH_PROCESS8_64; - /* fallthrough */ - case 21: XXH_PROCESS8_64; - /* fallthrough */ - case 13: XXH_PROCESS8_64; - /* fallthrough */ - case 5: XXH_PROCESS4_64; - XXH_PROCESS1_64; - return XXH64_avalanche(h64); - - case 26: XXH_PROCESS8_64; - /* fallthrough */ - case 18: XXH_PROCESS8_64; - /* fallthrough */ - case 10: XXH_PROCESS8_64; - XXH_PROCESS1_64; - XXH_PROCESS1_64; - return XXH64_avalanche(h64); - - case 30: XXH_PROCESS8_64; - /* fallthrough */ - case 22: XXH_PROCESS8_64; - /* fallthrough */ - case 14: XXH_PROCESS8_64; - /* fallthrough */ - case 6: XXH_PROCESS4_64; - XXH_PROCESS1_64; - XXH_PROCESS1_64; - return XXH64_avalanche(h64); - - case 27: XXH_PROCESS8_64; - /* fallthrough */ - case 19: XXH_PROCESS8_64; - /* fallthrough */ - case 11: XXH_PROCESS8_64; - XXH_PROCESS1_64; - XXH_PROCESS1_64; - XXH_PROCESS1_64; - return XXH64_avalanche(h64); - - case 31: XXH_PROCESS8_64; - /* fallthrough */ - case 23: XXH_PROCESS8_64; - /* fallthrough */ - case 15: XXH_PROCESS8_64; - /* fallthrough */ - case 7: XXH_PROCESS4_64; - /* fallthrough */ - case 3: XXH_PROCESS1_64; - /* fallthrough */ - case 2: XXH_PROCESS1_64; - /* fallthrough */ - case 1: XXH_PROCESS1_64; - /* fallthrough */ - case 0: return XXH64_avalanche(h64); - } + if (ptr==NULL) XXH_ASSERT(len == 0); + len &= 31; + while (len >= 8) { + xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr)); + ptr += 8; + h64 ^= k1; + h64 = XXH_rotl64(h64,27) * XXH_PRIME64_1 + XXH_PRIME64_4; + len -= 8; + } + if (len >= 4) { + h64 ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1; + ptr += 4; + h64 = XXH_rotl64(h64, 23) * XXH_PRIME64_2 + XXH_PRIME64_3; + len -= 4; + } + while (len > 0) { + h64 ^= (*ptr++) * XXH_PRIME64_5; + h64 = XXH_rotl64(h64, 11) * XXH_PRIME64_1; + --len; } - /* impossible to reach */ - XXH_ASSERT(0); - return 0; /* unreachable, but some compilers complain without it */ + return XXH64_avalanche(h64); } #ifdef XXH_OLD_NAMES @@ -1891,18 +2497,12 @@ XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align) XXH_FORCE_INLINE xxh_u64 XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment align) { - const xxh_u8* bEnd = input + len; xxh_u64 h64; - -#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) - if (input==NULL) { - len=0; - bEnd=input=(const xxh_u8*)(size_t)32; - } -#endif + if (input==NULL) XXH_ASSERT(len == 0); if (len>=32) { - const xxh_u8* const limit = bEnd - 32; + const xxh_u8* const bEnd = input + len; + const xxh_u8* const limit = bEnd - 31; xxh_u64 v1 = seed + XXH_PRIME64_1 + XXH_PRIME64_2; xxh_u64 v2 = seed + XXH_PRIME64_2; xxh_u64 v3 = seed + 0; @@ -1913,7 +2513,7 @@ XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment v2 = XXH64_round(v2, XXH_get64bits(input)); input+=8; v3 = XXH64_round(v3, XXH_get64bits(input)); input+=8; v4 = XXH64_round(v4, XXH_get64bits(input)); input+=8; - } while (input<=limit); + } while (input<limit); h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); h64 = XXH64_mergeRound(h64, v1); @@ -1931,6 +2531,7 @@ XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment } +/*! @ingroup xxh64_family */ XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t len, XXH64_hash_t seed) { #if 0 @@ -1939,9 +2540,7 @@ XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t len, XXH64_hash_t s XXH64_reset(&state, seed); XXH64_update(&state, (const xxh_u8*)input, len); return XXH64_digest(&state); - #else - if (XXH_FORCE_ALIGN_CHECK) { if ((((size_t)input) & 7)==0) { /* Input is aligned, let's leverage the speed advantage */ return XXH64_endian_align((const xxh_u8*)input, len, seed, XXH_aligned); @@ -1954,43 +2553,46 @@ XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t len, XXH64_hash_t s /******* Hash Streaming *******/ +/*! @ingroup xxh64_family*/ XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void) { return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t)); } +/*! @ingroup xxh64_family */ XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr) { XXH_free(statePtr); return XXH_OK; } +/*! @ingroup xxh64_family */ XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dstState, const XXH64_state_t* srcState) { - memcpy(dstState, srcState, sizeof(*dstState)); + XXH_memcpy(dstState, srcState, sizeof(*dstState)); } +/*! @ingroup xxh64_family */ XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH64_state_t* statePtr, XXH64_hash_t seed) { XXH64_state_t state; /* use a local state to memcpy() in order to avoid strict-aliasing warnings */ memset(&state, 0, sizeof(state)); - state.v1 = seed + XXH_PRIME64_1 + XXH_PRIME64_2; - state.v2 = seed + XXH_PRIME64_2; - state.v3 = seed + 0; - state.v4 = seed - XXH_PRIME64_1; + state.v[0] = seed + XXH_PRIME64_1 + XXH_PRIME64_2; + state.v[1] = seed + XXH_PRIME64_2; + state.v[2] = seed + 0; + state.v[3] = seed - XXH_PRIME64_1; /* do not write into reserved64, might be removed in a future version */ - memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved64)); + XXH_memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved64)); return XXH_OK; } +/*! @ingroup xxh64_family */ XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* state, const void* input, size_t len) { - if (input==NULL) -#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) + if (input==NULL) { + XXH_ASSERT(len == 0); return XXH_OK; -#else - return XXH_ERROR; -#endif + } { const xxh_u8* p = (const xxh_u8*)input; const xxh_u8* const bEnd = p + len; @@ -2005,32 +2607,24 @@ XXH64_update (XXH64_state_t* state, const void* input, size_t len) if (state->memsize) { /* tmp buffer is full */ XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, 32-state->memsize); - state->v1 = XXH64_round(state->v1, XXH_readLE64(state->mem64+0)); - state->v2 = XXH64_round(state->v2, XXH_readLE64(state->mem64+1)); - state->v3 = XXH64_round(state->v3, XXH_readLE64(state->mem64+2)); - state->v4 = XXH64_round(state->v4, XXH_readLE64(state->mem64+3)); - p += 32-state->memsize; + state->v[0] = XXH64_round(state->v[0], XXH_readLE64(state->mem64+0)); + state->v[1] = XXH64_round(state->v[1], XXH_readLE64(state->mem64+1)); + state->v[2] = XXH64_round(state->v[2], XXH_readLE64(state->mem64+2)); + state->v[3] = XXH64_round(state->v[3], XXH_readLE64(state->mem64+3)); + p += 32 - state->memsize; state->memsize = 0; } if (p+32 <= bEnd) { const xxh_u8* const limit = bEnd - 32; - xxh_u64 v1 = state->v1; - xxh_u64 v2 = state->v2; - xxh_u64 v3 = state->v3; - xxh_u64 v4 = state->v4; do { - v1 = XXH64_round(v1, XXH_readLE64(p)); p+=8; - v2 = XXH64_round(v2, XXH_readLE64(p)); p+=8; - v3 = XXH64_round(v3, XXH_readLE64(p)); p+=8; - v4 = XXH64_round(v4, XXH_readLE64(p)); p+=8; + state->v[0] = XXH64_round(state->v[0], XXH_readLE64(p)); p+=8; + state->v[1] = XXH64_round(state->v[1], XXH_readLE64(p)); p+=8; + state->v[2] = XXH64_round(state->v[2], XXH_readLE64(p)); p+=8; + state->v[3] = XXH64_round(state->v[3], XXH_readLE64(p)); p+=8; } while (p<=limit); - state->v1 = v1; - state->v2 = v2; - state->v3 = v3; - state->v4 = v4; } if (p < bEnd) { @@ -2043,23 +2637,19 @@ XXH64_update (XXH64_state_t* state, const void* input, size_t len) } -XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* state) +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64_digest(const XXH64_state_t* state) { xxh_u64 h64; if (state->total_len >= 32) { - xxh_u64 const v1 = state->v1; - xxh_u64 const v2 = state->v2; - xxh_u64 const v3 = state->v3; - xxh_u64 const v4 = state->v4; - - h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); - h64 = XXH64_mergeRound(h64, v1); - h64 = XXH64_mergeRound(h64, v2); - h64 = XXH64_mergeRound(h64, v3); - h64 = XXH64_mergeRound(h64, v4); + h64 = XXH_rotl64(state->v[0], 1) + XXH_rotl64(state->v[1], 7) + XXH_rotl64(state->v[2], 12) + XXH_rotl64(state->v[3], 18); + h64 = XXH64_mergeRound(h64, state->v[0]); + h64 = XXH64_mergeRound(h64, state->v[1]); + h64 = XXH64_mergeRound(h64, state->v[2]); + h64 = XXH64_mergeRound(h64, state->v[3]); } else { - h64 = state->v3 /*seed*/ + XXH_PRIME64_5; + h64 = state->v[2] /*seed*/ + XXH_PRIME64_5; } h64 += (xxh_u64) state->total_len; @@ -2070,28 +2660,38 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* state) /******* Canonical representation *******/ +/*! @ingroup xxh64_family */ XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash) { XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t)); if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash); - memcpy(dst, &hash, sizeof(*dst)); + XXH_memcpy(dst, &hash, sizeof(*dst)); } +/*! @ingroup xxh64_family */ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src) { return XXH_readBE64(src); } - +#ifndef XXH_NO_XXH3 /* ********************************************************************* * XXH3 * New generation hash designed for speed on small keys and vectorization ************************************************************************ */ +/*! + * @} + * @defgroup xxh3_impl XXH3 implementation + * @ingroup impl + * @{ + */ /* === Compiler specifics === */ -#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */ +#if ((defined(sun) || defined(__sun)) && __cplusplus) /* Solaris includes __STDC_VERSION__ with C++. Tested with GCC 5.5 */ +# define XXH_RESTRICT /* disable */ +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */ # define XXH_RESTRICT restrict #else /* Note: it might be useful to define __restrict or __restrict__ for some C++ compilers */ @@ -2198,12 +2798,62 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src /* ========================================== * Vectorization detection * ========================================== */ -#define XXH_SCALAR 0 /* Portable scalar version */ -#define XXH_SSE2 1 /* SSE2 for Pentium 4 and all x86_64 */ -#define XXH_AVX2 2 /* AVX2 for Haswell and Bulldozer */ -#define XXH_AVX512 3 /* AVX512 for Skylake and Icelake */ -#define XXH_NEON 4 /* NEON for most ARMv7-A and all AArch64 */ -#define XXH_VSX 5 /* VSX and ZVector for POWER8/z13 */ + +#ifdef XXH_DOXYGEN +/*! + * @ingroup tuning + * @brief Overrides the vectorization implementation chosen for XXH3. + * + * Can be defined to 0 to disable SIMD or any of the values mentioned in + * @ref XXH_VECTOR_TYPE. + * + * If this is not defined, it uses predefined macros to determine the best + * implementation. + */ +# define XXH_VECTOR XXH_SCALAR +/*! + * @ingroup tuning + * @brief Possible values for @ref XXH_VECTOR. + * + * Note that these are actually implemented as macros. + * + * If this is not defined, it is detected automatically. + * @ref XXH_X86DISPATCH overrides this. + */ +enum XXH_VECTOR_TYPE /* fake enum */ { + XXH_SCALAR = 0, /*!< Portable scalar version */ + XXH_SSE2 = 1, /*!< + * SSE2 for Pentium 4, Opteron, all x86_64. + * + * @note SSE2 is also guaranteed on Windows 10, macOS, and + * Android x86. + */ + XXH_AVX2 = 2, /*!< AVX2 for Haswell and Bulldozer */ + XXH_AVX512 = 3, /*!< AVX512 for Skylake and Icelake */ + XXH_NEON = 4, /*!< NEON for most ARMv7-A and all AArch64 */ + XXH_VSX = 5, /*!< VSX and ZVector for POWER8/z13 (64-bit) */ +}; +/*! + * @ingroup tuning + * @brief Selects the minimum alignment for XXH3's accumulators. + * + * When using SIMD, this should match the alignment reqired for said vector + * type, so, for example, 32 for AVX2. + * + * Default: Auto detected. + */ +# define XXH_ACC_ALIGN 8 +#endif + +/* Actual definition */ +#ifndef XXH_DOXYGEN +# define XXH_SCALAR 0 +# define XXH_SSE2 1 +# define XXH_AVX2 2 +# define XXH_AVX512 3 +# define XXH_NEON 4 +# define XXH_VSX 5 +#endif #ifndef XXH_VECTOR /* can be defined on command line */ # if defined(__AVX512F__) @@ -2212,10 +2862,13 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src # define XXH_VECTOR XXH_AVX2 # elif defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP == 2)) # define XXH_VECTOR XXH_SSE2 -# elif defined(__GNUC__) /* msvc support maybe later */ \ - && (defined(__ARM_NEON__) || defined(__ARM_NEON)) \ - && (defined(__LITTLE_ENDIAN__) /* We only support little endian NEON */ \ - || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) +# elif ( \ + defined(__ARM_NEON__) || defined(__ARM_NEON) /* gcc */ \ + || defined(_M_ARM64) || defined(_M_ARM_ARMV7VE) /* msvc */ \ + ) && ( \ + defined(_WIN32) || defined(__LITTLE_ENDIAN__) /* little endian only */ \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \ + ) # define XXH_VECTOR XXH_NEON # elif (defined(__PPC64__) && defined(__POWER8_VECTOR__)) \ || (defined(__s390x__) && defined(__VEC__)) \ @@ -2356,7 +3009,7 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src * This is available on ARMv7-A, but is less efficient than a single VZIP.32. */ -/* +/*! * Function-like macro: * void XXH_SPLIT_IN_PLACE(uint64x2_t &in, uint32x2_t &outLo, uint32x2_t &outHi) * { @@ -2367,7 +3020,7 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src */ # if !defined(XXH_NO_VZIP_HACK) /* define to disable */ \ && defined(__GNUC__) \ - && !defined(__aarch64__) && !defined(__arm64__) + && !defined(__aarch64__) && !defined(__arm64__) && !defined(_M_ARM64) # define XXH_SPLIT_IN_PLACE(in, outLo, outHi) \ do { \ /* Undocumented GCC/Clang operand modifier: %e0 = lower D half, %f0 = upper D half */ \ @@ -2429,10 +3082,12 @@ typedef __vector unsigned xxh_u32x4; # endif /* !defined(XXH_VSX_BE) */ # if XXH_VSX_BE -/* A wrapper for POWER9's vec_revb. */ # if defined(__POWER9_VECTOR__) || (defined(__clang__) && defined(__s390x__)) # define XXH_vec_revb vec_revb # else +/*! + * A polyfill for POWER9's vec_revb(). + */ XXH_FORCE_INLINE xxh_u64x2 XXH_vec_revb(xxh_u64x2 val) { xxh_u8x16 const vByteSwap = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, @@ -2442,13 +3097,13 @@ XXH_FORCE_INLINE xxh_u64x2 XXH_vec_revb(xxh_u64x2 val) # endif # endif /* XXH_VSX_BE */ -/* - * Performs an unaligned load and byte swaps it on big endian. +/*! + * Performs an unaligned vector load and byte swaps it on big endian. */ XXH_FORCE_INLINE xxh_u64x2 XXH_vec_loadu(const void *ptr) { xxh_u64x2 ret; - memcpy(&ret, ptr, sizeof(xxh_u64x2)); + XXH_memcpy(&ret, ptr, sizeof(xxh_u64x2)); # if XXH_VSX_BE ret = XXH_vec_revb(ret); # endif @@ -2493,7 +3148,7 @@ XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mule(xxh_u32x4 a, xxh_u32x4 b) #if defined(XXH_NO_PREFETCH) # define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */ #else -# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) /* _mm_prefetch() is not defined outside of x86/x64 */ +# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) /* _mm_prefetch() not defined outside of x86/x64 */ # include <mmintrin.h> /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */ # define XXH_PREFETCH(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0) # elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) ) @@ -2514,7 +3169,7 @@ XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mule(xxh_u32x4 a, xxh_u32x4 b) # error "default keyset is not large enough" #endif -/* Pseudorandom secret taken directly from FARSH */ +/*! Pseudorandom secret taken directly from FARSH. */ XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = { 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c, 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, @@ -2535,23 +3190,29 @@ XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = { # define kSecret XXH3_kSecret #endif -/* - * Calculates a 32-bit to 64-bit long multiply. +#ifdef XXH_DOXYGEN +/*! + * @brief Calculates a 32-bit to 64-bit long multiply. * - * Wraps __emulu on MSVC x86 because it tends to call __allmul when it doesn't + * Implemented as a macro. + * + * Wraps `__emulu` on MSVC x86 because it tends to call `__allmul` when it doesn't * need to (but it shouldn't need to anyways, it is about 7 instructions to do - * a 64x64 multiply...). Since we know that this will _always_ emit MULL, we + * a 64x64 multiply...). Since we know that this will _always_ emit `MULL`, we * use that instead of the normal method. * * If you are compiling for platforms like Thumb-1 and don't have a better option, * you may also want to write your own long multiply routine here. * - * XXH_FORCE_INLINE xxh_u64 XXH_mult32to64(xxh_u64 x, xxh_u64 y) - * { - * return (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF); - * } + * @param x, y Numbers to be multiplied + * @return 64-bit product of the low 32 bits of @p x and @p y. */ -#if defined(_MSC_VER) && defined(_M_IX86) +XXH_FORCE_INLINE xxh_u64 +XXH_mult32to64(xxh_u64 x, xxh_u64 y) +{ + return (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF); +} +#elif defined(_MSC_VER) && defined(_M_IX86) # include <intrin.h> # define XXH_mult32to64(x, y) __emulu((unsigned)(x), (unsigned)(y)) #else @@ -2565,10 +3226,14 @@ XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = { # define XXH_mult32to64(x, y) ((xxh_u64)(xxh_u32)(x) * (xxh_u64)(xxh_u32)(y)) #endif -/* - * Calculates a 64->128-bit long multiply. +/*! + * @brief Calculates a 64->128-bit long multiply. + * + * Uses `__uint128_t` and `_umul128` if available, otherwise uses a scalar + * version. * - * Uses __uint128_t and _umul128 if available, otherwise uses a scalar version. + * @param lhs , rhs The 64-bit integers to be multiplied + * @return The 128-bit result represented in an @ref XXH128_hash_t. */ static XXH128_hash_t XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs) @@ -2617,6 +3282,21 @@ XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs) r128.high64 = product_high; return r128; + /* + * MSVC for ARM64's __umulh method. + * + * This compiles to the same MUL + UMULH as GCC/Clang's __uint128_t method. + */ +#elif defined(_M_ARM64) + +#ifndef _MSC_VER +# pragma intrinsic(__umulh) +#endif + XXH128_hash_t r128; + r128.low64 = lhs * rhs; + r128.high64 = __umulh(lhs, rhs); + return r128; + #else /* * Portable scalar method. Optimized for 32-bit and 64-bit ALUs. @@ -2679,11 +3359,15 @@ XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs) #endif } -/* - * Does a 64-bit to 128-bit multiply, then XOR folds it. +/*! + * @brief Calculates a 64-bit to 128-bit multiply, then XOR folds it. * * The reason for the separate function is to prevent passing too many structs * around by value. This will hopefully inline the multiply, but we don't force it. + * + * @param lhs , rhs The 64-bit integers to multiply + * @return The low 64 bits of the product XOR'd by the high 64 bits. + * @see XXH_mult64to128() */ static xxh_u64 XXH3_mul128_fold64(xxh_u64 lhs, xxh_u64 rhs) @@ -2692,7 +3376,7 @@ XXH3_mul128_fold64(xxh_u64 lhs, xxh_u64 rhs) return product.low64 ^ product.high64; } -/* Seems to produce slightly better code on GCC for some reason. */ +/*! Seems to produce slightly better code on GCC for some reason. */ XXH_FORCE_INLINE xxh_u64 XXH_xorshift64(xxh_u64 v64, int shift) { XXH_ASSERT(0 <= shift && shift < 64); @@ -2787,7 +3471,7 @@ XXH3_len_4to8_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_h { XXH_ASSERT(input != NULL); XXH_ASSERT(secret != NULL); - XXH_ASSERT(4 <= len && len < 8); + XXH_ASSERT(4 <= len && len <= 8); seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32; { xxh_u32 const input1 = XXH_readLE32(input); xxh_u32 const input2 = XXH_readLE32(input + len - 4); @@ -2803,7 +3487,7 @@ XXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_ { XXH_ASSERT(input != NULL); XXH_ASSERT(secret != NULL); - XXH_ASSERT(8 <= len && len <= 16); + XXH_ASSERT(9 <= len && len <= 16); { xxh_u64 const bitflip1 = (XXH_readLE64(secret+24) ^ XXH_readLE64(secret+32)) + seed; xxh_u64 const bitflip2 = (XXH_readLE64(secret+40) ^ XXH_readLE64(secret+48)) - seed; xxh_u64 const input_lo = XXH_readLE64(input) ^ bitflip1; @@ -2873,7 +3557,7 @@ XXH_FORCE_INLINE xxh_u64 XXH3_mix16B(const xxh_u8* XXH_RESTRICT input, * GCC generates much better scalar code than Clang for the rest of XXH3, * which is why finding a more optimal codepath is an interest. */ - __asm__ ("" : "+r" (seed64)); + XXH_COMPILER_GUARD(seed64); #endif { xxh_u64 const input_lo = XXH_readLE64(input); xxh_u64 const input_hi = XXH_readLE64(input+8); @@ -2983,7 +3667,7 @@ XXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len, XXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64) { if (!XXH_CPU_LITTLE_ENDIAN) v64 = XXH_swap64(v64); - memcpy(dst, &v64, sizeof(v64)); + XXH_memcpy(dst, &v64, sizeof(v64)); } /* Several intrinsic functions below are supposed to accept __int64 as argument, @@ -3023,7 +3707,8 @@ XXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64) * Both XXH3_64bits and XXH3_128bits use this subroutine. */ -#if (XXH_VECTOR == XXH_AVX512) || defined(XXH_X86DISPATCH) +#if (XXH_VECTOR == XXH_AVX512) \ + || (defined(XXH_DISPATCH_AVX512) && XXH_DISPATCH_AVX512 != 0) #ifndef XXH_TARGET_AVX512 # define XXH_TARGET_AVX512 /* disable attribute target */ @@ -3034,7 +3719,7 @@ XXH3_accumulate_512_avx512(void* XXH_RESTRICT acc, const void* XXH_RESTRICT input, const void* XXH_RESTRICT secret) { - XXH_ALIGN(64) __m512i* const xacc = (__m512i *) acc; + __m512i* const xacc = (__m512i *) acc; XXH_ASSERT((((size_t)acc) & 63) == 0); XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); @@ -3083,7 +3768,7 @@ XXH3_scrambleAcc_avx512(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) { XXH_ASSERT((((size_t)acc) & 63) == 0); XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); - { XXH_ALIGN(64) __m512i* const xacc = (__m512i*) acc; + { __m512i* const xacc = (__m512i*) acc; const __m512i prime32 = _mm512_set1_epi32((int)XXH_PRIME32_1); /* xacc[0] ^= (xacc[0] >> 47) */ @@ -3110,17 +3795,19 @@ XXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64) XXH_ASSERT(((size_t)customSecret & 63) == 0); (void)(&XXH_writeLE64); { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m512i); - __m512i const seed = _mm512_mask_set1_epi64(_mm512_set1_epi64((xxh_i64)seed64), 0xAA, -(xxh_i64)seed64); + __m512i const seed = _mm512_mask_set1_epi64(_mm512_set1_epi64((xxh_i64)seed64), 0xAA, (xxh_i64)(0U - seed64)); - XXH_ALIGN(64) const __m512i* const src = (const __m512i*) XXH3_kSecret; - XXH_ALIGN(64) __m512i* const dest = ( __m512i*) customSecret; + const __m512i* const src = (const __m512i*) ((const void*) XXH3_kSecret); + __m512i* const dest = ( __m512i*) customSecret; int i; + XXH_ASSERT(((size_t)src & 63) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 63) == 0); for (i=0; i < nbRounds; ++i) { /* GCC has a bug, _mm512_stream_load_si512 accepts 'void*', not 'void const*', - * this will warn "discards ‘const’ qualifier". */ + * this will warn "discards 'const' qualifier". */ union { - XXH_ALIGN(64) const __m512i* cp; - XXH_ALIGN(64) void* p; + const __m512i* cp; + void* p; } remote_const_void; remote_const_void.cp = src + i; dest[i] = _mm512_add_epi64(_mm512_stream_load_si512(remote_const_void.p), seed); @@ -3129,7 +3816,8 @@ XXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64) #endif -#if (XXH_VECTOR == XXH_AVX2) || defined(XXH_X86DISPATCH) +#if (XXH_VECTOR == XXH_AVX2) \ + || (defined(XXH_DISPATCH_AVX2) && XXH_DISPATCH_AVX2 != 0) #ifndef XXH_TARGET_AVX2 # define XXH_TARGET_AVX2 /* disable attribute target */ @@ -3141,7 +3829,7 @@ XXH3_accumulate_512_avx2( void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) { XXH_ASSERT((((size_t)acc) & 31) == 0); - { XXH_ALIGN(32) __m256i* const xacc = (__m256i *) acc; + { __m256i* const xacc = (__m256i *) acc; /* Unaligned. This is mainly for pointer arithmetic, and because * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ const __m256i* const xinput = (const __m256i *) input; @@ -3173,7 +3861,7 @@ XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_scrambleAcc_avx2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) { XXH_ASSERT((((size_t)acc) & 31) == 0); - { XXH_ALIGN(32) __m256i* const xacc = (__m256i*) acc; + { __m256i* const xacc = (__m256i*) acc; /* Unaligned. This is mainly for pointer arithmetic, and because * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ const __m256i* const xsecret = (const __m256i *) secret; @@ -3205,23 +3893,21 @@ XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTR XXH_STATIC_ASSERT(XXH_SEC_ALIGN <= 64); (void)(&XXH_writeLE64); XXH_PREFETCH(customSecret); - { __m256i const seed = _mm256_set_epi64x(-(xxh_i64)seed64, (xxh_i64)seed64, -(xxh_i64)seed64, (xxh_i64)seed64); + { __m256i const seed = _mm256_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64, (xxh_i64)(0U - seed64), (xxh_i64)seed64); - XXH_ALIGN(64) const __m256i* const src = (const __m256i*) XXH3_kSecret; - XXH_ALIGN(64) __m256i* dest = ( __m256i*) customSecret; + const __m256i* const src = (const __m256i*) ((const void*) XXH3_kSecret); + __m256i* dest = ( __m256i*) customSecret; # if defined(__GNUC__) || defined(__clang__) /* * On GCC & Clang, marking 'dest' as modified will cause the compiler: * - do not extract the secret from sse registers in the internal loop * - use less common registers, and avoid pushing these reg into stack - * The asm hack causes Clang to assume that XXH3_kSecretPtr aliases with - * customSecret, and on aarch64, this prevented LDP from merging two - * loads together for free. Putting the loads together before the stores - * properly generates LDP. */ - __asm__("" : "+r" (dest)); + XXH_COMPILER_GUARD(dest); # endif + XXH_ASSERT(((size_t)src & 31) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 31) == 0); /* GCC -O2 need unroll loop manually */ dest[0] = _mm256_add_epi64(_mm256_stream_load_si256(src+0), seed); @@ -3235,6 +3921,7 @@ XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTR #endif +/* x86dispatch always generates SSE2 */ #if (XXH_VECTOR == XXH_SSE2) || defined(XXH_X86DISPATCH) #ifndef XXH_TARGET_SSE2 @@ -3248,7 +3935,7 @@ XXH3_accumulate_512_sse2( void* XXH_RESTRICT acc, { /* SSE2 is just a half-scale version of the AVX2 version. */ XXH_ASSERT((((size_t)acc) & 15) == 0); - { XXH_ALIGN(16) __m128i* const xacc = (__m128i *) acc; + { __m128i* const xacc = (__m128i *) acc; /* Unaligned. This is mainly for pointer arithmetic, and because * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ const __m128i* const xinput = (const __m128i *) input; @@ -3280,7 +3967,7 @@ XXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_scrambleAcc_sse2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) { XXH_ASSERT((((size_t)acc) & 15) == 0); - { XXH_ALIGN(16) __m128i* const xacc = (__m128i*) acc; + { __m128i* const xacc = (__m128i*) acc; /* Unaligned. This is mainly for pointer arithmetic, and because * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ const __m128i* const xsecret = (const __m128i *) secret; @@ -3312,27 +3999,29 @@ XXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_initCustomSecret_sse2(void* XXH_RESTR { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m128i); # if defined(_MSC_VER) && defined(_M_IX86) && _MSC_VER < 1900 - // MSVC 32bit mode does not support _mm_set_epi64x before 2015 - XXH_ALIGN(16) const xxh_i64 seed64x2[2] = { (xxh_i64)seed64, -(xxh_i64)seed64 }; + /* MSVC 32bit mode does not support _mm_set_epi64x before 2015 */ + XXH_ALIGN(16) const xxh_i64 seed64x2[2] = { (xxh_i64)seed64, (xxh_i64)(0U - seed64) }; __m128i const seed = _mm_load_si128((__m128i const*)seed64x2); # else - __m128i const seed = _mm_set_epi64x(-(xxh_i64)seed64, (xxh_i64)seed64); + __m128i const seed = _mm_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64); # endif int i; - XXH_ALIGN(64) const float* const src = (float const*) XXH3_kSecret; - XXH_ALIGN(XXH_SEC_ALIGN) __m128i* dest = (__m128i*) customSecret; + const void* const src16 = XXH3_kSecret; + __m128i* dst16 = (__m128i*) customSecret; # if defined(__GNUC__) || defined(__clang__) /* * On GCC & Clang, marking 'dest' as modified will cause the compiler: * - do not extract the secret from sse registers in the internal loop * - use less common registers, and avoid pushing these reg into stack */ - __asm__("" : "+r" (dest)); + XXH_COMPILER_GUARD(dst16); # endif + XXH_ASSERT(((size_t)src16 & 15) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dst16 & 15) == 0); for (i=0; i < nbRounds; ++i) { - dest[i] = _mm_add_epi64(_mm_castps_si128(_mm_load_ps(src+i*4)), seed); + dst16[i] = _mm_add_epi64(_mm_load_si128((const __m128i *)src16+i), seed); } } } @@ -3347,7 +4036,7 @@ XXH3_accumulate_512_neon( void* XXH_RESTRICT acc, { XXH_ASSERT((((size_t)acc) & 15) == 0); { - XXH_ALIGN(16) uint64x2_t* const xacc = (uint64x2_t *) acc; + uint64x2_t* const xacc = (uint64x2_t *) acc; /* We don't use a uint32x4_t pointer because it causes bus errors on ARMv7. */ uint8_t const* const xinput = (const uint8_t *) input; uint8_t const* const xsecret = (const uint8_t *) secret; @@ -3394,8 +4083,8 @@ XXH3_scrambleAcc_neon(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) uint64x2_t data_vec = veorq_u64 (acc_vec, shifted); /* xacc[i] ^= xsecret[i]; */ - uint8x16_t key_vec = vld1q_u8(xsecret + (i * 16)); - uint64x2_t data_key = veorq_u64(data_vec, vreinterpretq_u64_u8(key_vec)); + uint8x16_t key_vec = vld1q_u8 (xsecret + (i * 16)); + uint64x2_t data_key = veorq_u64 (data_vec, vreinterpretq_u64_u8(key_vec)); /* xacc[i] *= XXH_PRIME32_1 */ uint32x2_t data_key_lo, data_key_hi; @@ -3439,7 +4128,8 @@ XXH3_accumulate_512_vsx( void* XXH_RESTRICT acc, const void* XXH_RESTRICT input, const void* XXH_RESTRICT secret) { - xxh_u64x2* const xacc = (xxh_u64x2*) acc; /* presumed aligned */ + /* presumed aligned */ + unsigned long long* const xacc = (unsigned long long*) acc; xxh_u64x2 const* const xinput = (xxh_u64x2 const*) input; /* no alignment restriction */ xxh_u64x2 const* const xsecret = (xxh_u64x2 const*) secret; /* no alignment restriction */ xxh_u64x2 const v32 = { 32, 32 }; @@ -3454,14 +4144,18 @@ XXH3_accumulate_512_vsx( void* XXH_RESTRICT acc, xxh_u32x4 const shuffled = (xxh_u32x4)vec_rl(data_key, v32); /* product = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)shuffled & 0xFFFFFFFF); */ xxh_u64x2 const product = XXH_vec_mulo((xxh_u32x4)data_key, shuffled); - xacc[i] += product; + /* acc_vec = xacc[i]; */ + xxh_u64x2 acc_vec = vec_xl(0, xacc + 2 * i); + acc_vec += product; /* swap high and low halves */ #ifdef __s390x__ - xacc[i] += vec_permi(data_vec, data_vec, 2); + acc_vec += vec_permi(data_vec, data_vec, 2); #else - xacc[i] += vec_xxpermdi(data_vec, data_vec, 2); + acc_vec += vec_xxpermdi(data_vec, data_vec, 2); #endif + /* xacc[i] = acc_vec; */ + vec_xst(acc_vec, 0, xacc + 2 * i); } } @@ -3504,7 +4198,7 @@ XXH3_accumulate_512_scalar(void* XXH_RESTRICT acc, const void* XXH_RESTRICT input, const void* XXH_RESTRICT secret) { - XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */ + xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */ const xxh_u8* const xinput = (const xxh_u8*) input; /* no alignment restriction */ const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */ size_t i; @@ -3520,7 +4214,7 @@ XXH3_accumulate_512_scalar(void* XXH_RESTRICT acc, XXH_FORCE_INLINE void XXH3_scrambleAcc_scalar(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) { - XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */ + xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */ const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */ size_t i; XXH_ASSERT((((size_t)acc) & (XXH_ACC_ALIGN-1)) == 0); @@ -3574,7 +4268,7 @@ XXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64) * without hack: 2654.4 MB/s * with hack: 3202.9 MB/s */ - __asm__("" : "+r" (kSecretPtr)); + XXH_COMPILER_GUARD(kSecretPtr); #endif /* * Note: in debug mode, this overrides the asm optimization @@ -3739,7 +4433,7 @@ XXH3_mergeAccs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secre * without hack: 2063.7 MB/s * with hack: 2560.7 MB/s */ - __asm__("" : "+r" (result64)); + XXH_COMPILER_GUARD(result64); #endif } @@ -3768,9 +4462,11 @@ XXH3_hashLong_64b_internal(const void* XXH_RESTRICT input, size_t len, } /* - * It's important for performance that XXH3_hashLong is not inlined. + * It's important for performance to transmit secret's size (when it's static) + * so that the compiler can properly optimize the vectorized loop. + * This makes a big performance difference for "medium" keys (<1 KB) when using AVX instruction set. */ -XXH_NO_INLINE XXH64_hash_t +XXH_FORCE_INLINE XXH64_hash_t XXH3_hashLong_64b_withSecret(const void* XXH_RESTRICT input, size_t len, XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) { @@ -3779,11 +4475,10 @@ XXH3_hashLong_64b_withSecret(const void* XXH_RESTRICT input, size_t len, } /* - * It's important for performance that XXH3_hashLong is not inlined. - * Since the function is not inlined, the compiler may not be able to understand that, - * in some scenarios, its `secret` argument is actually a compile time constant. - * This variant enforces that the compiler can detect that, - * and uses this opportunity to streamline the generated code for better performance. + * It's preferable for performance that XXH3_hashLong is not inlined, + * as it results in a smaller function for small data, easier to the instruction cache. + * Note that inside this no_inline function, we do inline the internal loop, + * and provide a statically defined secret size to allow optimization of vector loop. */ XXH_NO_INLINE XXH64_hash_t XXH3_hashLong_64b_default(const void* XXH_RESTRICT input, size_t len, @@ -3863,23 +4558,34 @@ XXH3_64bits_internal(const void* XXH_RESTRICT input, size_t len, /* === Public entry point === */ +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* input, size_t len) { return XXH3_64bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_default); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize) { return XXH3_64bits_internal(input, len, 0, secret, secretSize, XXH3_hashLong_64b_withSecret); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) { return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed); } +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecretandSeed(const void* input, size_t len, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_64b_withSecret(input, len, seed, (const xxh_u8*)secret, secretSize); +} + /* === XXH3 streaming === */ @@ -3948,6 +4654,7 @@ static void XXH_alignedFree(void* p) XXH_free(base); } } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void) { XXH3_state_t* const state = (XXH3_state_t*)XXH_alignedMalloc(sizeof(XXH3_state_t), 64); @@ -3956,22 +4663,24 @@ XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void) return state; } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr) { XXH_alignedFree(statePtr); return XXH_OK; } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API void XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state) { - memcpy(dst_state, src_state, sizeof(*dst_state)); + XXH_memcpy(dst_state, src_state, sizeof(*dst_state)); } static void -XXH3_64bits_reset_internal(XXH3_state_t* statePtr, - XXH64_hash_t seed, - const void* secret, size_t secretSize) +XXH3_reset_internal(XXH3_state_t* statePtr, + XXH64_hash_t seed, + const void* secret, size_t secretSize) { size_t const initStart = offsetof(XXH3_state_t, bufferedSize); size_t const initLength = offsetof(XXH3_state_t, nbStripesPerBlock) - initStart; @@ -3988,37 +4697,54 @@ XXH3_64bits_reset_internal(XXH3_state_t* statePtr, statePtr->acc[6] = XXH_PRIME64_5; statePtr->acc[7] = XXH_PRIME32_1; statePtr->seed = seed; + statePtr->useSeed = (seed != 0); statePtr->extSecret = (const unsigned char*)secret; XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); statePtr->secretLimit = secretSize - XXH_STRIPE_LEN; statePtr->nbStripesPerBlock = statePtr->secretLimit / XXH_SECRET_CONSUME_RATE; } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH3_state_t* statePtr) { if (statePtr == NULL) return XXH_ERROR; - XXH3_64bits_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE); + XXH3_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE); return XXH_OK; } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize) { if (statePtr == NULL) return XXH_ERROR; - XXH3_64bits_reset_internal(statePtr, 0, secret, secretSize); + XXH3_reset_internal(statePtr, 0, secret, secretSize); if (secret == NULL) return XXH_ERROR; if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; return XXH_OK; } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed) { if (statePtr == NULL) return XXH_ERROR; if (seed==0) return XXH3_64bits_reset(statePtr); - if (seed != statePtr->seed) XXH3_initCustomSecret(statePtr->customSecret, seed); - XXH3_64bits_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE); + if ((seed != statePtr->seed) || (statePtr->extSecret != NULL)) + XXH3_initCustomSecret(statePtr->customSecret, seed); + XXH3_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE); + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret, size_t secretSize, XXH64_hash_t seed64) +{ + if (statePtr == NULL) return XXH_ERROR; + if (secret == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + XXH3_reset_internal(statePtr, seed64, secret, secretSize); + statePtr->useSeed = 1; /* always, even if seed64==0 */ return XXH_OK; } @@ -4049,34 +4775,48 @@ XXH3_consumeStripes(xxh_u64* XXH_RESTRICT acc, } } +#ifndef XXH3_STREAM_USE_STACK +# ifndef __clang__ /* clang doesn't need additional stack space */ +# define XXH3_STREAM_USE_STACK 1 +# endif +#endif /* * Both XXH3_64bits_update and XXH3_128bits_update use this routine. */ XXH_FORCE_INLINE XXH_errorcode -XXH3_update(XXH3_state_t* state, - const xxh_u8* input, size_t len, +XXH3_update(XXH3_state_t* XXH_RESTRICT const state, + const xxh_u8* XXH_RESTRICT input, size_t len, XXH3_f_accumulate_512 f_acc512, XXH3_f_scrambleAcc f_scramble) { - if (input==NULL) -#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) + if (input==NULL) { + XXH_ASSERT(len == 0); return XXH_OK; -#else - return XXH_ERROR; -#endif + } + XXH_ASSERT(state != NULL); { const xxh_u8* const bEnd = input + len; const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; - +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* For some reason, gcc and MSVC seem to suffer greatly + * when operating accumulators directly into state. + * Operating into stack space seems to enable proper optimization. + * clang, on the other hand, doesn't seem to need this trick */ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[8]; memcpy(acc, state->acc, sizeof(acc)); +#else + xxh_u64* XXH_RESTRICT const acc = state->acc; +#endif state->totalLen += len; + XXH_ASSERT(state->bufferedSize <= XXH3_INTERNALBUFFER_SIZE); - if (state->bufferedSize + len <= XXH3_INTERNALBUFFER_SIZE) { /* fill in tmp buffer */ + /* small input : just fill in tmp buffer */ + if (state->bufferedSize + len <= XXH3_INTERNALBUFFER_SIZE) { XXH_memcpy(state->buffer + state->bufferedSize, input, len); state->bufferedSize += (XXH32_hash_t)len; return XXH_OK; } - /* total input is now > XXH3_INTERNALBUFFER_SIZE */ + /* total input is now > XXH3_INTERNALBUFFER_SIZE */ #define XXH3_INTERNALBUFFER_STRIPES (XXH3_INTERNALBUFFER_SIZE / XXH_STRIPE_LEN) XXH_STATIC_ASSERT(XXH3_INTERNALBUFFER_SIZE % XXH_STRIPE_LEN == 0); /* clean multiple */ @@ -4088,7 +4828,7 @@ XXH3_update(XXH3_state_t* state, size_t const loadSize = XXH3_INTERNALBUFFER_SIZE - state->bufferedSize; XXH_memcpy(state->buffer + state->bufferedSize, input, loadSize); input += loadSize; - XXH3_consumeStripes(state->acc, + XXH3_consumeStripes(acc, &state->nbStripesSoFar, state->nbStripesPerBlock, state->buffer, XXH3_INTERNALBUFFER_STRIPES, secret, state->secretLimit, @@ -4097,30 +4837,68 @@ XXH3_update(XXH3_state_t* state, } XXH_ASSERT(input < bEnd); - /* Consume input by a multiple of internal buffer size */ - if (input+XXH3_INTERNALBUFFER_SIZE < bEnd) { - const xxh_u8* const limit = bEnd - XXH3_INTERNALBUFFER_SIZE; - do { - XXH3_consumeStripes(state->acc, - &state->nbStripesSoFar, state->nbStripesPerBlock, - input, XXH3_INTERNALBUFFER_STRIPES, - secret, state->secretLimit, - f_acc512, f_scramble); - input += XXH3_INTERNALBUFFER_SIZE; - } while (input<limit); - /* for last partial stripe */ - memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + /* large input to consume : ingest per full block */ + if ((size_t)(bEnd - input) > state->nbStripesPerBlock * XXH_STRIPE_LEN) { + size_t nbStripes = (size_t)(bEnd - 1 - input) / XXH_STRIPE_LEN; + XXH_ASSERT(state->nbStripesPerBlock >= state->nbStripesSoFar); + /* join to current block's end */ + { size_t const nbStripesToEnd = state->nbStripesPerBlock - state->nbStripesSoFar; + XXH_ASSERT(nbStripes <= nbStripes); + XXH3_accumulate(acc, input, secret + state->nbStripesSoFar * XXH_SECRET_CONSUME_RATE, nbStripesToEnd, f_acc512); + f_scramble(acc, secret + state->secretLimit); + state->nbStripesSoFar = 0; + input += nbStripesToEnd * XXH_STRIPE_LEN; + nbStripes -= nbStripesToEnd; + } + /* consume per entire blocks */ + while(nbStripes >= state->nbStripesPerBlock) { + XXH3_accumulate(acc, input, secret, state->nbStripesPerBlock, f_acc512); + f_scramble(acc, secret + state->secretLimit); + input += state->nbStripesPerBlock * XXH_STRIPE_LEN; + nbStripes -= state->nbStripesPerBlock; + } + /* consume last partial block */ + XXH3_accumulate(acc, input, secret, nbStripes, f_acc512); + input += nbStripes * XXH_STRIPE_LEN; + XXH_ASSERT(input < bEnd); /* at least some bytes left */ + state->nbStripesSoFar = nbStripes; + /* buffer predecessor of last partial stripe */ + XXH_memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + XXH_ASSERT(bEnd - input <= XXH_STRIPE_LEN); + } else { + /* content to consume <= block size */ + /* Consume input by a multiple of internal buffer size */ + if (bEnd - input > XXH3_INTERNALBUFFER_SIZE) { + const xxh_u8* const limit = bEnd - XXH3_INTERNALBUFFER_SIZE; + do { + XXH3_consumeStripes(acc, + &state->nbStripesSoFar, state->nbStripesPerBlock, + input, XXH3_INTERNALBUFFER_STRIPES, + secret, state->secretLimit, + f_acc512, f_scramble); + input += XXH3_INTERNALBUFFER_SIZE; + } while (input<limit); + /* buffer predecessor of last partial stripe */ + XXH_memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + } } - XXH_ASSERT(input < bEnd); /* Some remaining input (always) : buffer it */ + XXH_ASSERT(input < bEnd); + XXH_ASSERT(bEnd - input <= XXH3_INTERNALBUFFER_SIZE); + XXH_ASSERT(state->bufferedSize == 0); XXH_memcpy(state->buffer, input, (size_t)(bEnd-input)); state->bufferedSize = (XXH32_hash_t)(bEnd-input); +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* save stack accumulators into state */ + memcpy(state->acc, acc, sizeof(acc)); +#endif } return XXH_OK; } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update(XXH3_state_t* state, const void* input, size_t len) { @@ -4138,7 +4916,7 @@ XXH3_digest_long (XXH64_hash_t* acc, * Digest on a local copy. This way, the state remains unaltered, and it can * continue ingesting more input afterwards. */ - memcpy(acc, state->acc, sizeof(state->acc)); + XXH_memcpy(acc, state->acc, sizeof(state->acc)); if (state->bufferedSize >= XXH_STRIPE_LEN) { size_t const nbStripes = (state->bufferedSize - 1) / XXH_STRIPE_LEN; size_t nbStripesSoFar = state->nbStripesSoFar; @@ -4155,14 +4933,15 @@ XXH3_digest_long (XXH64_hash_t* acc, xxh_u8 lastStripe[XXH_STRIPE_LEN]; size_t const catchupSize = XXH_STRIPE_LEN - state->bufferedSize; XXH_ASSERT(state->bufferedSize > 0); /* there is always some input buffered */ - memcpy(lastStripe, state->buffer + sizeof(state->buffer) - catchupSize, catchupSize); - memcpy(lastStripe + catchupSize, state->buffer, state->bufferedSize); + XXH_memcpy(lastStripe, state->buffer + sizeof(state->buffer) - catchupSize, catchupSize); + XXH_memcpy(lastStripe + catchupSize, state->buffer, state->bufferedSize); XXH3_accumulate_512(acc, lastStripe, secret + state->secretLimit - XXH_SECRET_LASTACC_START); } } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* state) { const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; @@ -4174,57 +4953,13 @@ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* state) (xxh_u64)state->totalLen * XXH_PRIME64_1); } /* totalLen <= XXH3_MIDSIZE_MAX: digesting a short input */ - if (state->seed) + if (state->useSeed) return XXH3_64bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); return XXH3_64bits_withSecret(state->buffer, (size_t)(state->totalLen), secret, state->secretLimit + XXH_STRIPE_LEN); } -#define XXH_MIN(x, y) (((x) > (y)) ? (y) : (x)) - -XXH_PUBLIC_API void -XXH3_generateSecret(void* secretBuffer, const void* customSeed, size_t customSeedSize) -{ - XXH_ASSERT(secretBuffer != NULL); - if (customSeedSize == 0) { - memcpy(secretBuffer, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE); - return; - } - XXH_ASSERT(customSeed != NULL); - - { size_t const segmentSize = sizeof(XXH128_hash_t); - size_t const nbSegments = XXH_SECRET_DEFAULT_SIZE / segmentSize; - XXH128_canonical_t scrambler; - XXH64_hash_t seeds[12]; - size_t segnb; - XXH_ASSERT(nbSegments == 12); - XXH_ASSERT(segmentSize * nbSegments == XXH_SECRET_DEFAULT_SIZE); /* exact multiple */ - XXH128_canonicalFromHash(&scrambler, XXH128(customSeed, customSeedSize, 0)); - - /* - * Copy customSeed to seeds[], truncating or repeating as necessary. - */ - { size_t toFill = XXH_MIN(customSeedSize, sizeof(seeds)); - size_t filled = toFill; - memcpy(seeds, customSeed, toFill); - while (filled < sizeof(seeds)) { - toFill = XXH_MIN(filled, sizeof(seeds) - filled); - memcpy((char*)seeds + filled, seeds, toFill); - filled += toFill; - } } - - /* generate secret */ - memcpy(secretBuffer, &scrambler, sizeof(scrambler)); - for (segnb=1; segnb < nbSegments; segnb++) { - size_t const segmentStart = segnb * segmentSize; - XXH128_canonical_t segment; - XXH128_canonicalFromHash(&segment, - XXH128(&scrambler, sizeof(scrambler), XXH_readLE64(seeds + segnb) + segnb) ); - memcpy((char*)secretBuffer + segmentStart, &segment, sizeof(segment)); - } } -} - /* ========================================== * XXH3 128 bits (a.k.a XXH128) @@ -4526,9 +5261,10 @@ XXH3_hashLong_128b_default(const void* XXH_RESTRICT input, size_t len, } /* - * It's important for performance that XXH3_hashLong is not inlined. + * It's important for performance to pass @secretLen (when it's static) + * to the compiler, so that it can properly optimize the vectorized loop. */ -XXH_NO_INLINE XXH128_hash_t +XXH_FORCE_INLINE XXH128_hash_t XXH3_hashLong_128b_withSecret(const void* XXH_RESTRICT input, size_t len, XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen) @@ -4595,6 +5331,7 @@ XXH3_128bits_internal(const void* input, size_t len, /* === Public XXH128 API === */ +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* input, size_t len) { return XXH3_128bits_internal(input, len, 0, @@ -4602,6 +5339,7 @@ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* input, size_t len) XXH3_hashLong_128b_default); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize) { @@ -4610,6 +5348,7 @@ XXH3_128bits_withSecret(const void* input, size_t len, const void* secret, size_ XXH3_hashLong_128b_withSecret); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) { @@ -4618,6 +5357,16 @@ XXH3_128bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) XXH3_hashLong_128b_withSeed); } +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecretandSeed(const void* input, size_t len, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_128bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_128b_withSecret(input, len, seed, secret, secretSize); +} + +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* input, size_t len, XXH64_hash_t seed) { @@ -4628,46 +5377,39 @@ XXH128(const void* input, size_t len, XXH64_hash_t seed) /* === XXH3 128-bit streaming === */ /* - * All the functions are actually the same as for 64-bit streaming variant. - * The only difference is the finalizatiom routine. + * All initialization and update functions are identical to 64-bit streaming variant. + * The only difference is the finalization routine. */ -static void -XXH3_128bits_reset_internal(XXH3_state_t* statePtr, - XXH64_hash_t seed, - const void* secret, size_t secretSize) -{ - XXH3_64bits_reset_internal(statePtr, seed, secret, secretSize); -} - +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH3_state_t* statePtr) { - if (statePtr == NULL) return XXH_ERROR; - XXH3_128bits_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE); - return XXH_OK; + return XXH3_64bits_reset(statePtr); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize) { - if (statePtr == NULL) return XXH_ERROR; - XXH3_128bits_reset_internal(statePtr, 0, secret, secretSize); - if (secret == NULL) return XXH_ERROR; - if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; - return XXH_OK; + return XXH3_64bits_reset_withSecret(statePtr, secret, secretSize); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed) { - if (statePtr == NULL) return XXH_ERROR; - if (seed==0) return XXH3_128bits_reset(statePtr); - if (seed != statePtr->seed) XXH3_initCustomSecret(statePtr->customSecret, seed); - XXH3_128bits_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE); - return XXH_OK; + return XXH3_64bits_reset_withSeed(statePtr, seed); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + return XXH3_64bits_reset_withSecretandSeed(statePtr, secret, secretSize, seed); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update(XXH3_state_t* state, const void* input, size_t len) { @@ -4675,6 +5417,7 @@ XXH3_128bits_update(XXH3_state_t* state, const void* input, size_t len) XXH3_accumulate_512, XXH3_scrambleAcc); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* state) { const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; @@ -4705,6 +5448,7 @@ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* state) #include <string.h> /* memcmp, memcpy */ /* return : 1 is equal, 0 if different */ +/*! @ingroup xxh3_family */ XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2) { /* note : XXH128_hash_t is compact, it has no padding byte */ @@ -4715,6 +5459,7 @@ XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2) * return : >0 if *h128_1 > *h128_2 * <0 if *h128_1 < *h128_2 * =0 if *h128_1 == *h128_2 */ +/*! @ingroup xxh3_family */ XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2) { XXH128_hash_t const h1 = *(const XXH128_hash_t*)h128_1; @@ -4727,6 +5472,7 @@ XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2) /*====== Canonical representation ======*/ +/*! @ingroup xxh3_family */ XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash) { @@ -4735,10 +5481,11 @@ XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash) hash.high64 = XXH_swap64(hash.high64); hash.low64 = XXH_swap64(hash.low64); } - memcpy(dst, &hash.high64, sizeof(hash.high64)); - memcpy((char*)dst + sizeof(hash.high64), &hash.low64, sizeof(hash.low64)); + XXH_memcpy(dst, &hash.high64, sizeof(hash.high64)); + XXH_memcpy((char*)dst + sizeof(hash.high64), &hash.low64, sizeof(hash.low64)); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t* src) { @@ -4748,6 +5495,69 @@ XXH128_hashFromCanonical(const XXH128_canonical_t* src) return h; } + + +/* ========================================== + * Secret generators + * ========================================== + */ +#define XXH_MIN(x, y) (((x) > (y)) ? (y) : (x)) + +static void XXH3_combine16(void* dst, XXH128_hash_t h128) +{ + XXH_writeLE64( dst, XXH_readLE64(dst) ^ h128.low64 ); + XXH_writeLE64( (char*)dst+8, XXH_readLE64((char*)dst+8) ^ h128.high64 ); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSeed, size_t customSeedSize) +{ + XXH_ASSERT(secretBuffer != NULL); + if (secretBuffer == NULL) return XXH_ERROR; + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + if (customSeedSize == 0) { + customSeed = XXH3_kSecret; + customSeedSize = XXH_SECRET_DEFAULT_SIZE; + } + XXH_ASSERT(customSeed != NULL); + if (customSeed == NULL) return XXH_ERROR; + + /* Fill secretBuffer with a copy of customSeed - repeat as needed */ + { size_t pos = 0; + while (pos < secretSize) { + size_t const toCopy = XXH_MIN((secretSize - pos), customSeedSize); + memcpy((char*)secretBuffer + pos, customSeed, toCopy); + pos += toCopy; + } } + + { size_t const nbSeg16 = secretSize / 16; + size_t n; + XXH128_canonical_t scrambler; + XXH128_canonicalFromHash(&scrambler, XXH128(customSeed, customSeedSize, 0)); + for (n=0; n<nbSeg16; n++) { + XXH128_hash_t const h128 = XXH128(&scrambler, sizeof(scrambler), n); + XXH3_combine16((char*)secretBuffer + n*16, h128); + } + /* last segment */ + XXH3_combine16((char*)secretBuffer + secretSize - 16, XXH128_hashFromCanonical(&scrambler)); + } + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API void +XXH3_generateSecret_fromSeed(void* secretBuffer, XXH64_hash_t seed) +{ + XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; + XXH3_initCustomSecret(secret, seed); + XXH_ASSERT(secretBuffer != NULL); + memcpy(secretBuffer, secret, XXH_SECRET_DEFAULT_SIZE); +} + + + /* Pop our optimization override from above */ #if XXH_VECTOR == XXH_AVX2 /* AVX2 */ \ && defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \ @@ -4757,7 +5567,11 @@ XXH128_hashFromCanonical(const XXH128_canonical_t* src) #endif /* XXH_NO_LONG_LONG */ +#endif /* XXH_NO_XXH3 */ +/*! + * @} + */ #endif /* XXH_IMPLEMENTATION */ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/AGLTable.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/AGLTable.hpp index 67c6dbcea16..c1f682ca851 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/AGLTable.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/AGLTable.hpp @@ -2,7 +2,7 @@ ** AGLTable.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.cpp index d37a89c20cc..bb7f72a8448 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.cpp @@ -2,7 +2,7 @@ ** BasicDVIReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.hpp index a71c547fa55..111283f619b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.hpp @@ -2,7 +2,7 @@ ** BasicDVIReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.cpp index b26ed711494..3a3ec317697 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.cpp @@ -2,7 +2,7 @@ ** Bezier.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.hpp index 18050ca8578..2749797e59d 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.hpp @@ -2,7 +2,7 @@ ** Bezier.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.cpp index acf2c40a80f..2fcf74f6e1c 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.cpp @@ -2,7 +2,7 @@ ** BgColorSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -36,7 +36,7 @@ void BgColorSpecialHandler::preprocess (const string&, std::istream &is, Special if (!_pageColors.empty() && _pageColors.back().first == pageno) _pageColors.back().second = color; else - _pageColors.emplace_back(PageColor(pageno, color)); + _pageColors.emplace_back(pageno, color); } } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.hpp index 07c13437e57..1194f4b793f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.hpp @@ -2,7 +2,7 @@ ** BgColorSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.cpp index c59e4446086..9bdc8813323 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.cpp @@ -2,7 +2,7 @@ ** Bitmap.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.hpp index f0bba3b41ea..dcd6a1f19f0 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.hpp @@ -2,7 +2,7 @@ ** Bitmap.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.cpp index 78f3a19ee58..7276d717dad 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.cpp @@ -2,7 +2,7 @@ ** BoundingBox.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -76,7 +76,7 @@ vector<Length> BoundingBox::extractLengths (string boxstr) { vector<string> lengthStrings = util::split(boxstr, " "); for (const string &lenstr : lengthStrings) { if (!lenstr.empty()) - lengths.emplace_back(Length(lenstr)); + lengths.emplace_back(lenstr); } return lengths; } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.hpp index e3b59ebf5de..339bc7eb41f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.hpp @@ -2,7 +2,7 @@ ** BoundingBox.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.cpp index ae245699c57..17ba2c2d1f3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.cpp @@ -2,7 +2,7 @@ ** CLCommandLine.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.hpp index 9f9814368bc..58001c607f4 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.hpp @@ -2,7 +2,7 @@ ** CLCommandLine.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/CLOption.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/CLOption.hpp index 594610b896f..daaaa3a6373 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/CLOption.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/CLOption.hpp @@ -2,7 +2,7 @@ ** CLOption.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.cpp index 6c9b10ed10c..5979745e4c3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.cpp @@ -2,7 +2,7 @@ ** CMap.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.hpp index 606a401ff72..7a6b24e8333 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.hpp @@ -2,7 +2,7 @@ ** CMap.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.cpp index dfc564f7f2b..ddf3a8fdb16 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.cpp @@ -2,7 +2,7 @@ ** CMapManager.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -119,7 +119,7 @@ const CMap* CMapManager::findCompatibleBaseFontMap (const PhysicalFont *font, co // try to find a compatible encoding CMap - const bool is_unicode_map = bool(dynamic_cast<const UnicodeCMap*>(cmap)); + const bool is_unicode_map = cmap->mapsToUnicode(); const string ro = cmap->getROString(); for (const CharMapIDToEncName &enc : encodings) { for (const CharMapID &id : charmapIDs) { diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.hpp index eab32e76466..8b5ff3cf8ce 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.hpp @@ -2,7 +2,7 @@ ** CMapManager.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.cpp index c56d3bd463a..ff9a76f33ce 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.cpp @@ -2,7 +2,7 @@ ** CMapReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.hpp index 6e9a03ce980..de87c4e4c00 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.hpp @@ -2,7 +2,7 @@ ** CMapReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.cpp index 00490efa045..7a655dcec13 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.cpp @@ -2,7 +2,7 @@ ** Calculator.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.hpp index 50f8fb959cc..9e4002ce72e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.hpp @@ -2,7 +2,7 @@ ** Calculator.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.cpp index 0020b38d047..0132e61af23 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.cpp @@ -2,7 +2,7 @@ ** CharMapID.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.hpp index 8b8890bc3ab..2b97a8e58b9 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.hpp @@ -2,7 +2,7 @@ ** CharMapID.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Character.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Character.hpp index 1e381f93111..6a0e836ccc4 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Character.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Character.hpp @@ -2,7 +2,7 @@ ** Character.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.cpp index 60107be9de4..54d7eb21789 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.cpp @@ -2,7 +2,7 @@ ** Color.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.hpp index 061e3e1236a..19ab9e6d440 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.hpp @@ -2,7 +2,7 @@ ** Color.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.cpp index fed3a985f47..9ea45f4cd4d 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.cpp @@ -2,7 +2,7 @@ ** ColorSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.hpp index 0d90283503d..1e62c8c14bd 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.hpp @@ -2,7 +2,7 @@ ** ColorSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/CommandLine.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/CommandLine.hpp index c4a215b301d..fafd9f5ad3a 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/CommandLine.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/CommandLine.hpp @@ -2,7 +2,7 @@ // It is part of the dvisvgm package and published under the terms // of the GNU General Public License version 3, or (at your option) any later version. // See file COPYING for further details. -// Copyright (C) 2016-2021 Martin Gieseking <martin.gieseking@uos.de> +// Copyright (C) 2016-2022 Martin Gieseking <martin.gieseking@uos.de> #ifndef COMMANDLINE_HPP #define COMMANDLINE_HPP @@ -20,7 +20,7 @@ class CommandLine : public CL::CommandLine { CommandLine () : CL::CommandLine( "This program converts DVI files, as created by TeX/LaTeX, as well as\nEPS and PDF files to the XML-based scalable vector graphics format SVG.", "[options] dvifile\n--eps [options] epsfile\n--pdf [options] pdffile", - "Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de>" + "Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de>" ) {} CommandLine (int argc, char **argv) : CommandLine() { diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.cpp index 064368c24a7..d5d749cc4a9 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.cpp @@ -2,7 +2,7 @@ ** DLLoader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp index 558c27d0c3f..6cb35723ee8 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp @@ -2,7 +2,7 @@ ** DLLoader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIActions.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIActions.hpp index f51120ab772..228b8976868 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIActions.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIActions.hpp @@ -2,7 +2,7 @@ ** DVIActions.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.cpp index 05d87b89086..094dd6e499b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.cpp @@ -2,7 +2,7 @@ ** DVIReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -26,7 +26,6 @@ #include "Font.hpp" #include "FontManager.hpp" #include "HashFunction.hpp" -#include "JFM.hpp" #include "utility.hpp" #include "VectorStream.hpp" @@ -203,11 +202,11 @@ void DVIReader::cmdPop (int) { * @param[in] font current font (corresponding to _currFontNum) * @param[in] c character to typeset */ void DVIReader::putVFChar (Font *font, uint32_t c) { - if (auto vf = dynamic_cast<VirtualFont*>(font)) { // is current font a virtual font? + if (auto vf = font_cast<VirtualFont*>(font)) { // is current font a virtual font? FontManager &fm = FontManager::instance(); const vector<uint8_t> *dvi = vf->getDVI(c); // try to get DVI snippet that represents character c Font *firstFont = fm.vfFirstFont(vf); - if (!dvi && (!firstFont || !dynamic_cast<const JFM*>(firstFont->getMetrics()))) + if (!dvi && (!firstFont || !firstFont->getMetrics()->isJFM())) return; fm.enterVF(vf); // enter VF font number context int savedFontNum = _currFontNum; // save current font number @@ -485,7 +484,7 @@ const Font* DVIReader::defineFont (uint32_t fontnum, const string &name, uint32_ else { // TFM-based font specified by name int id = fm.registerFont(fontnum, name, cs, dsize, ssize); font = fm.getFontById(id); - if (auto vf = dynamic_cast<VirtualFont*>(font)) { + if (auto vf = font_cast<VirtualFont*>(font)) { // read vf file, register its font and character definitions fm.enterVF(vf); ifstream ifs(vf->path(), ios::binary); @@ -592,7 +591,7 @@ void DVIReader::cmdXFontDef (int) { FontManager::instance().registerFont(fontnum, fontname, fontIndex, ptsize, style, color); font = FontManager::instance().getFont(fontnum); } - dviXFontDef(fontnum, dynamic_cast<const NativeFont*>(font)); + dviXFontDef(fontnum, font_cast<const NativeFont*>(font)); } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.hpp index ff8390f5150..f2daf5da8ae 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.hpp @@ -2,7 +2,7 @@ ** DVIReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.cpp index c2defd06fe9..45261b99c06 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.cpp @@ -2,7 +2,7 @@ ** DVIToSVG.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -74,13 +74,10 @@ bool DVIToSVG::COMPUTE_PROGRESS = false; DVIToSVG::HashSettings DVIToSVG::PAGE_HASH_SETTINGS; -DVIToSVG::DVIToSVG (istream &is, SVGOutputBase &out) : DVIReader(is), _out(out) +DVIToSVG::DVIToSVG (istream &is, SVGOutputBase &out) + : DVIReader(is), _out(out), _prevWritingMode(WritingMode::LR) { - _pageHeight = _pageWidth = 0; - _tx = _ty = 0; // no cursor translation - _pageByte = 0; _prevXPos = _prevYPos = numeric_limits<double>::min(); - _prevWritingMode = WritingMode::LR; _actions = util::make_unique<DVIToSVGActions>(*this, _svg); } @@ -362,7 +359,7 @@ void DVIToSVG::embedFonts (XMLElement *svgElement) { unordered_set<const Font*> tracedFonts; // collect unique fonts already traced for (const auto &fontchar : usedCharsMap) { const Font *font = fontchar.first; - if (auto ph_font = dynamic_cast<const PhysicalFont*>(font)) { + if (auto ph_font = font_cast<const PhysicalFont*>(font)) { // Check if glyphs should be traced. Only trace the glyphs of unique fonts, i.e. // avoid retracing the same glyphs again if they are referenced in various sizes. if (TRACE_MODE != 0 && tracedFonts.find(ph_font->uniqueFont()) == tracedFonts.end()) { @@ -481,7 +478,7 @@ void DVIToSVG::dviEop () { void DVIToSVG::dviSetChar0 (uint32_t c, const Font *font) { - if (_actions && !dynamic_cast<const VirtualFont*>(font)) + if (_actions && !font_cast<const VirtualFont*>(font)) _actions->setChar(dviState().h+_tx, dviState().v+_ty, c, dviState().d != WritingMode::LR, *font); } @@ -520,7 +517,7 @@ void DVIToSVG::dviPop () { void DVIToSVG::dviFontNum (uint32_t fontnum, SetFontMode, const Font *font) { - if (_actions && font && !dynamic_cast<const VirtualFont*>(font)) + if (_actions && font && !font_cast<const VirtualFont*>(font)) _actions->setFont(FontManager::instance().fontID(fontnum), *font); // all fonts get a recomputed ID } @@ -572,16 +569,18 @@ void DVIToSVG::HashSettings::setParameters (const string ¶mstr) { auto it = paramMap.find(name); if (it != paramMap.end()) _params.insert(it->second); - else if (_algo.empty() && HashFunction::isSupportedAlgorithm(name)) - _algo = name; - else if (!name.empty()) { - string msg = "invalid hash parameter '"+name+"' (supported algorithms: "; - for (string str : HashFunction::supportedAlgorithms()) - msg += str + ", "; - msg.pop_back(); - msg.pop_back(); - msg += ')'; - throw MessageException(msg); + else if (_algo.empty()) { + if (HashFunction::isSupportedAlgorithm(name)) + _algo = name; + else if (!name.empty()) { + string msg = "invalid hash parameter '" + name + "' (supported algorithms: "; + for (string str: HashFunction::supportedAlgorithms()) + msg += str + ", "; + msg.pop_back(); + msg.pop_back(); + msg += ')'; + throw MessageException(msg); + } } } // set default hash algorithm if none is given diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.hpp index 45c957e0868..0ac723019cd 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.hpp @@ -2,7 +2,7 @@ ** DVIToSVG.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -101,13 +101,13 @@ class DVIToSVG : public DVIReader { SVGTree _svg; SVGOutputBase &_out; std::unique_ptr<DVIActions> _actions; - std::string _bboxFormatString; ///< bounding box size/format set by the user - std::string _transCmds; ///< page transformation commands set by the user - double _pageHeight, _pageWidth; ///< global page height and width stored in the postamble - double _tx, _ty; ///< translation of cursor position - double _prevXPos, _prevYPos; ///< previous cursor position - WritingMode _prevWritingMode; ///< previous writing mode - std::streampos _pageByte; ///< position of the stream pointer relative to the preceding bop (in bytes) + std::string _bboxFormatString; ///< bounding box size/format set by the user + std::string _transCmds; ///< page transformation commands set by the user + double _pageHeight=0, _pageWidth=0; ///< global page height and width stored in the postamble + double _tx=0, _ty=0; ///< translation of cursor position + double _prevXPos, _prevYPos; ///< previous cursor position + WritingMode _prevWritingMode; ///< previous writing mode + std::streampos _pageByte=0; ///< position of the stream pointer relative to the preceding bop (in bytes) }; #endif diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.cpp index b44843c6bf3..74e0f97aa5b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.cpp @@ -2,7 +2,7 @@ ** DVIToSVGActions.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -105,7 +105,7 @@ void DVIToSVGActions::setChar (double x, double y, unsigned c, bool vertical, co GlyphMetrics metrics; font.getGlyphMetrics(c, vertical, metrics); - auto pf = dynamic_cast<const PhysicalFont*>(&font); + auto pf = font_cast<const PhysicalFont*>(&font); if (PhysicalFont::EXACT_BBOX && pf) { GlyphMetrics exact_metrics; pf->getExactGlyphBox(c, exact_metrics, vertical, &callback); @@ -166,15 +166,13 @@ void DVIToSVGActions::setRule (double x, double y, double height, double width) return; // (x,y) is the lower left corner of the rectangle - auto rect = util::make_unique<XMLElement>("rect"); + auto rect = util::make_unique<SVGElement>("rect"); rect->addAttribute("x", x); rect->addAttribute("y", y-height); rect->addAttribute("height", height); rect->addAttribute("width", width); - if (!getMatrix().isIdentity()) - rect->addAttribute("transform", getMatrix().toSVG()); - if (getColor() != Color::BLACK) - rect->addAttribute("fill", _svg.getColor().svgColorString()); + rect->setTransform(getMatrix()); + rect->setFillColor(_svg.getColor()); _svg.appendToPage(std::move(rect)); // update bounding box @@ -237,12 +235,12 @@ void DVIToSVGActions::endPage (unsigned pageno) { _svg.transformPage(matrix); if (_bgcolor != Color::TRANSPARENT) { // create a rectangle filled with the background color - auto rect = util::make_unique<XMLElement>("rect"); + auto rect = util::make_unique<SVGElement>("rect"); rect->addAttribute("x", _bbox.minX()); rect->addAttribute("y", _bbox.minY()); rect->addAttribute("width", _bbox.width()); rect->addAttribute("height", _bbox.height()); - rect->addAttribute("fill", _bgcolor.svgColorString()); + rect->setFillColor(_bgcolor); _svg.prependToPage(std::move(rect)); } } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.hpp index ed8a5f9c9b5..651e71f5d39 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.hpp @@ -2,7 +2,7 @@ ** DVIToSVGActions.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -49,6 +49,8 @@ class DVIToSVGActions : public DVIActions, public SpecialActions { void setBgColor (const Color &color) override; void setColor (const Color &color) override {_svg.setColor(color);} void setMatrix (const Matrix &m) override {_svg.setMatrix(m);} + void setOpacity (const Opacity &opacity) override {_svg.setOpacity(opacity);} + const Opacity& getOpacity () const override {return _svg.getOpacity();} const Matrix& getMatrix () const override {return _svg.getMatrix();} Matrix getPageTransformation () const override {return _dvireader->getPageTransformation();} Color getColor () const override {return _svg.getColor();} diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.cpp index 224165e2556..87c31dbf089 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.cpp @@ -2,7 +2,7 @@ ** Directory.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.hpp index 14360a9f670..7a90c87618e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.hpp @@ -2,7 +2,7 @@ ** Directory.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.cpp index 67463a4c597..8fba6d8974b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.cpp @@ -2,7 +2,7 @@ ** DvisvgmSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -81,8 +81,7 @@ void DvisvgmSpecialHandler::preprocessRawSet (InputReader &ir) { _currentMacro = _macros.end(); throw SpecialException("redefinition of SVG fragment '" + id + "'"); } - pair<string, StringVector> entry(id, StringVector()); - pair<MacroMap::iterator, bool> state = _macros.emplace(move(entry)); + pair<MacroMap::iterator, bool> state = _macros.emplace(id, StringVector()); _currentMacro = state.first; } @@ -194,7 +193,7 @@ static void expand_constants (string &str, SpecialActions &actions) { /** Evaluates substrings of the form {?(expr)} where 'expr' is a math expression, * and replaces the substring by the computed value. * @param[in,out] str string to scan for expressions */ -static void evaluate_expressions (string &str, SpecialActions &actions) { +static void evaluate_expressions (string &str, const SpecialActions &actions) { size_t left = str.find("{?("); // start position of expression macro while (left != string::npos) { size_t right = str.find(")}", left+2); // end position of expression macro @@ -386,14 +385,13 @@ void DvisvgmSpecialHandler::processImg (InputReader &ir, SpecialActions &actions Length h = read_length(ir); string f = ir.getString(); update_bbox(w, h, Length(0), false, actions); - auto img = util::make_unique<XMLElement>("image"); + auto img = util::make_unique<SVGElement>("image"); img->addAttribute("x", actions.getX()); img->addAttribute("y", actions.getY()); img->addAttribute("width", w.bp()); img->addAttribute("height", h.bp()); img->addAttribute("xlink:href", f); - if (!actions.getMatrix().isIdentity()) - img->addAttribute("transform", actions.getMatrix().toSVG()); + img->setTransform(actions.getMatrix()); actions.svgTree().appendToPage(std::move(img)); } catch (const UnitException &e) { @@ -448,10 +446,10 @@ void DvisvgmSpecialHandler::XMLParser::parse (const string &xml, SpecialActions // collect/extract an XML fragment that only contains complete tags // incomplete tags are held back _xmlbuf += xml; - size_t left=0, right; + size_t left=0; try { while (left != string::npos) { - right = _xmlbuf.find('<', left); + size_t right = _xmlbuf.find('<', left); if (left < right && left < _xmlbuf.length()) // plain text found? (actions.svgTree().*_append)(util::make_unique<XMLText>(_xmlbuf.substr(left, right-left))); if (right != string::npos) { @@ -523,7 +521,7 @@ void DvisvgmSpecialHandler::XMLParser::openElement (const string &tag, SpecialAc BufferInputReader ir(ib); string name = ir.getString("/ \t\n\r"); ir.skipSpace(); - auto elemNode = util::make_unique<XMLElement>(name); + auto elemNode = util::make_unique<SVGElement>(name); map<string, string> attribs; if (ir.parseAttributes(attribs, true, "\"'")) { for (const auto &attrpair : attribs) diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.hpp index f90c283429c..f5ae43f4118 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.hpp @@ -2,7 +2,7 @@ ** DvisvgmSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -29,6 +29,7 @@ class InputReader; class SpecialActions; +class SVGElement; class SVGTree; class XMLElement; class XMLNode; @@ -44,7 +45,7 @@ class XMLNode; class DvisvgmSpecialHandler : public SpecialHandler { class XMLParser { using AppendFunc = void (SVGTree::*)(std::unique_ptr<XMLNode>); - using PushFunc = void (SVGTree::*)(std::unique_ptr<XMLElement>); + using PushFunc = void (SVGTree::*)(std::unique_ptr<SVGElement>); using PopFunc = void (SVGTree::*)(); using NameStack = std::vector<std::string>; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.cpp index 2f61f9f07dc..021598b35d5 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.cpp @@ -2,7 +2,7 @@ ** EPSFile.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.hpp index 384af7225ee..6523889df0a 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.hpp @@ -2,7 +2,7 @@ ** EPSFile.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSToSVG.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSToSVG.hpp index 75a574cf38b..df2b635874f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSToSVG.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSToSVG.hpp @@ -2,7 +2,7 @@ ** EPSToSVG.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.cpp index bfb3dffd7ed..6de120b0e64 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.cpp @@ -2,7 +2,7 @@ ** EllipticalArc.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -177,7 +177,7 @@ vector<Bezier> EllipticalArc::approximate () const { if (isStraightLine()) { DPair dir = (_endPoint - _startPoint); dir /= dir.length()/3.0; - beziers.emplace_back(Bezier(_startPoint, _startPoint+dir, _endPoint-dir, _endPoint)); + beziers.emplace_back(_startPoint, _startPoint+dir, _endPoint-dir, _endPoint); } else { CenterParams cparams = getCenterParams(); @@ -190,11 +190,11 @@ vector<Bezier> EllipticalArc::approximate () const { if (numCurves > 0) { double c = cos(_rotationAngle); double s = sin(_rotationAngle); - Matrix ellipse = {_rx*c, -_ry*s, cparams.center.x(), _rx*s, _ry*c, cparams.center.y()}; + Matrix ellipse{_rx*c, -_ry*s, cparams.center.x(), _rx*s, _ry*c, cparams.center.y()}; double angle = cparams.startAngle; double diff = cparams.deltaAngle/numCurves; while (numCurves-- > 0) { - beziers.emplace_back(approx_unit_arc(angle, diff).transform(ellipse)); + beziers.push_back(approx_unit_arc(angle, diff).transform(ellipse)); angle += diff; } } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.hpp index 78785c4ff12..0c32e583165 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.hpp @@ -2,7 +2,7 @@ ** EllipticalArc.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.cpp index 95dc58a4ec4..0627e283ecc 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.cpp @@ -2,7 +2,7 @@ ** EmSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -24,9 +24,8 @@ #include "InputReader.hpp" #include "Length.hpp" #include "SpecialActions.hpp" +#include "SVGElement.hpp" #include "SVGTree.hpp" -#include "XMLNode.hpp" -#include "XMLString.hpp" using namespace std; @@ -77,17 +76,19 @@ static DPair cut_vector (char cuttype, const DPair &linedir, double linewidth) { static void create_line (const DPair &p1, const DPair &p2, char c1, char c2, double lw, SpecialActions &actions) { if (actions.outputLocked()) return; - unique_ptr<XMLElement> node; + unique_ptr<SVGElement> node; DPair dir = p2-p1; if (dir.x() == 0 || dir.y() == 0 || (c1 == 'p' && c2 == 'p')) { // draw regular line - node = util::make_unique<XMLElement>("line"); + node = util::make_unique<SVGElement>("line"); node->addAttribute("x1", p1.x()); node->addAttribute("y1", p1.y()); node->addAttribute("x2", p2.x()); node->addAttribute("y2", p2.y()); - node->addAttribute("stroke-width", lw); - node->addAttribute("stroke", actions.getColor().svgColorString()); + node->setStrokeWidth(lw); + node->setStrokeColor(actions.getColor()); + node->setStrokeOpacity(actions.getOpacity()); + // update bounding box DPair cv = cut_vector('p', dir, lw); actions.embed(p1+cv); @@ -97,24 +98,24 @@ static void create_line (const DPair &p1, const DPair &p2, char c1, char c2, dou } else { // draw polygon + vector<DPair> points; DPair cv1 = cut_vector(c1, dir, lw); DPair cv2 = cut_vector(c2, dir, lw); - DPair q11 = p1+cv1, q12 = p1-cv1; - DPair q21 = p2+cv2, q22 = p2-cv2; - ostringstream oss; - oss << XMLString(q11.x()) << ',' << XMLString(q11.y()) << ' ' - << XMLString(q12.x()) << ',' << XMLString(q12.y()) << ' ' - << XMLString(q22.x()) << ',' << XMLString(q22.y()) << ' ' - << XMLString(q21.x()) << ',' << XMLString(q21.y()); - node = util::make_unique<XMLElement>("polygon"); - node->addAttribute("points", oss.str()); - if (actions.getColor() != Color::BLACK) - node->addAttribute("fill", actions.getColor().svgColorString()); + points.push_back(p1+cv1); + points.push_back(p1-cv1); + points.push_back(p2-cv2); + points.push_back(p2+cv2); + + node = util::make_unique<SVGElement>("polygon"); + node->setPoints(points); + node->setFillColor(actions.getColor()); + node->setFillOpacity(actions.getOpacity()); + // update bounding box - actions.embed(q11); - actions.embed(q12); - actions.embed(q21); - actions.embed(q22); + actions.embed(points[0]); + actions.embed(points[1]); + actions.embed(points[2]); + actions.embed(points[3]); } actions.svgTree().appendToPage(std::move(node)); } @@ -236,7 +237,7 @@ void EmSpecialHandler::line (InputReader &ir, SpecialActions& actions) { // Line endpoints don't necessarily have to be defined before // a line definition. If a point isn't defined yet, we put the line // in a wait list and process the lines at the end of the page. - _lines.emplace_back(Line(pointnum1, pointnum2, char(cut1), char(cut2), linewidth)); + _lines.emplace_back(pointnum1, pointnum2, char(cut1), char(cut2), linewidth); } } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.hpp index fc9f14a4689..704fa0a19a7 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.hpp @@ -2,7 +2,7 @@ ** EmSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.cpp index d08791c03ea..4d39f0886bf 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.cpp @@ -2,7 +2,7 @@ ** EncFile.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.hpp index 0e5f90bcb34..f844dfa34e8 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.hpp @@ -2,7 +2,7 @@ ** EncFile.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.cpp index 3358d5c273c..e7efe2786f3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.cpp @@ -2,7 +2,7 @@ ** FileFinder.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.hpp index 5774f8165ce..904c31c861a 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.hpp @@ -2,7 +2,7 @@ ** FileFinder.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.cpp index a8e6a258a1e..998204b6840 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.cpp @@ -2,7 +2,7 @@ ** FilePath.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -37,34 +37,24 @@ static string& single_slashes (string &str) { #ifdef _WIN32 +/** Returns the drive letter of a given path string or 0 if there's none. */ +static char drive_letter (const string &path) { + if (path.length() >= 2 && path[1] == ':' && isalpha(path[0])) + return tolower(path[0]); + return '\0'; +} + +/** Removes the drive letter and following colon from a given path string if present. + * @param[in] path path to strip drive letter from + * @return drive letter or 0 if there was none */ static char strip_drive_letter (string &path) { - char letter = 0; + char letter = '\0'; if (path.length() >= 2 && path[1] == ':' && isalpha(path[0])) { letter = path[0]; path.erase(0, 2); } - return letter; -} - - -static char adapt_current_path (string &path, char target_drive) { - if (char current_drive = strip_drive_letter(path)) { - if (target_drive != current_drive) { - if (target_drive == 0) - target_drive = current_drive; - if (path.empty() || path[0] != '/') { - if (FileSystem::chdir(string(1, target_drive) + ":")) { - path.insert(0, FileSystem::getcwd()+"/"); - strip_drive_letter(path); - } - else - throw MessageException("drive " + string(1, target_drive) + ": not accessible"); - } - } - } - return target_drive; + return tolower(letter); } - #endif @@ -99,7 +89,7 @@ void FilePath::set (const string &path) { * @param[in] path absolute or relative path to a file or directory * @param[in] isfile true if 'path' references a file, false if a directory is referenced */ void FilePath::set (const string &path, bool isfile) { - init(path, isfile, FileSystem::getcwd()); + init(path, isfile, ""); } @@ -121,47 +111,42 @@ void FilePath::init (string path, bool isfile, string current_dir) { _fname.clear(); single_slashes(path); single_slashes(current_dir); -#ifdef _WIN32 - path = FileSystem::ensureForwardSlashes(path); +#ifndef _WIN32 + if (current_dir.empty()) + current_dir = FileSystem::getcwd(); +#else _drive = strip_drive_letter(path); + if (current_dir.empty() || drive_letter(current_dir) != _drive) + current_dir = FileSystem::getcwd(_drive); + if (!_drive) + _drive = drive_letter(current_dir); + strip_drive_letter(current_dir); + path = FileSystem::ensureForwardSlashes(path); #endif if (isfile) { size_t pos = path.rfind('/'); _fname = path.substr((pos == string::npos) ? 0 : pos+1); - if (pos != string::npos) + // remove filename from path + if (pos == 0 && _fname.length() > 1) // file in root directory? + path.erase(1); + else if (pos != string::npos) path.erase(pos); else path.clear(); } - if (current_dir.empty()) - current_dir = FileSystem::getcwd(); -#ifdef _WIN32 - _drive = adapt_current_path(current_dir, _drive); -#endif - if (!path.empty()) { - if (path[0] == '/') - current_dir.clear(); - else if (current_dir[0] != '/') - current_dir = "/"; - else { - FilePath curr(current_dir, false, "/"); - current_dir = curr.absolute(); -#ifdef _WIN32 - adapt_current_path(current_dir, _drive); -#endif - } - } - path.insert(0, current_dir + "/"); + if ((path.empty() || path[0] != '/') && !current_dir.empty()) + path.insert(0, current_dir + "/"); string elem; for (char c : path) { if (c != '/') elem += c; - else { + else if (!elem.empty()){ add(elem); elem.clear(); } } - add(elem); + if (!elem.empty()) + add(elem); } @@ -169,7 +154,7 @@ void FilePath::init (string path, bool isfile, string current_dir) { void FilePath::add (const string &dir) { if (dir == ".." && !_dirs.empty()) _dirs.pop_back(); - else if (dir.length() > 0 && dir != ".") + else if (!dir.empty() && dir != ".") _dirs.emplace_back(dir); } @@ -223,16 +208,16 @@ string FilePath::basename () const { * @return the absolute path string */ string FilePath::absolute (bool with_filename) const { string path; +#ifdef _WIN32 + if (_drive) + path = string(1, _drive) + ":"; +#endif for (const Directory &dir : _dirs) path += "/" + string(dir); if (path.empty()) path = "/"; if (with_filename && !_fname.empty()) path += "/"+_fname; -#ifdef _WIN32 - if (_drive) - path.insert(0, string(1, _drive) + ":"); -#endif return single_slashes(path); } @@ -245,28 +230,32 @@ string FilePath::absolute (bool with_filename) const { * @param[in] with_filename if false, the filename is omitted * @return the relative path string */ string FilePath::relative (string reldir, bool with_filename) const { +#ifdef _WIN32 + char reldrive = drive_letter(reldir); + if (reldir.empty()) { + reldir = FileSystem::getcwd(_drive); + reldrive = drive_letter(FileSystem::getcwd()); + } + bool isAbsolute = (reldir[0] == '/') + || (reldir.length() >= 3 && isalpha(reldir[0]) && reldir[1] == ':' && reldir[2] == '/'); +#else if (reldir.empty()) reldir = FileSystem::getcwd(); -#ifdef _WIN32 - adapt_current_path(reldir, _drive); + bool isAbsolute = (reldir[0] == '/'); #endif - if (reldir[0] != '/') + if (!isAbsolute) return absolute(); - FilePath rel(reldir, false); + FilePath relpath(reldir, false); string path; -#ifdef _WIN32 - if (rel._drive && _drive && tolower(rel._drive) != tolower(_drive)) - path += string(1, _drive) + ":"; -#endif auto it1 = _dirs.begin(); - auto it2 = rel._dirs.begin(); - while (it1 != _dirs.end() && it2 != rel._dirs.end() && *it1 == *it2) + auto it2 = relpath._dirs.begin(); + while (it1 != _dirs.end() && it2 != relpath._dirs.end() && *it1 == *it2) ++it1, ++it2; - for (; it2 != rel._dirs.end(); ++it2) + for (; it2 != relpath._dirs.end(); ++it2) path += "../"; for (; it1 != _dirs.end(); ++it1) path += string(*it1) + "/"; - if (!path.empty()) + if (!path.empty() && path.back() == '/') path.erase(path.length()-1, 1); // remove trailing slash if (with_filename && !_fname.empty()) { if (!path.empty() && path != "/") @@ -275,6 +264,10 @@ string FilePath::relative (string reldir, bool with_filename) const { } if (path.empty()) path = "."; +#ifdef _WIN32 + if (relpath._drive && _drive && _drive != reldrive) + path.insert(0, string(1, _drive) + ":"); +#endif return single_slashes(path); } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.hpp index af81db66f45..31f03e92428 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.hpp @@ -2,7 +2,7 @@ ** FilePath.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.cpp index 92960138e71..4e8e43ddd77 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.cpp @@ -2,7 +2,7 @@ ** FileSystem.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.hpp index 0c13f178e96..86f6dbf2017 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.hpp @@ -2,7 +2,7 @@ ** FileSystem.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FixWord.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FixWord.hpp index b6166b15dca..fcef7437486 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FixWord.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FixWord.hpp @@ -2,7 +2,7 @@ ** FixWord.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp index ff93c81cd0b..9627c421e21 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp @@ -2,7 +2,7 @@ ** Font.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -621,14 +621,14 @@ double NativeFont::italicCorr(int c) const { double NativeFont::charHeight (int c) const { FontEngine::instance().setFont(*this); int upem = FontEngine::instance().getUnitsPerEM(); - return upem ? (scaledSize()*FontEngine::instance().getAscender()/upem) : 0; + return upem ? (scaledSize()*FontEngine::instance().getHeight(Character(Character::INDEX, c))/upem) : 0; } double NativeFont::charDepth (int c) const { FontEngine::instance().setFont(*this); int upem = FontEngine::instance().getUnitsPerEM(); - return upem ? (scaledSize()*FontEngine::instance().getDescender()/upem) : 0; + return upem ? (scaledSize()*FontEngine::instance().getDepth(Character(Character::INDEX, c))/upem) : 0; } @@ -679,3 +679,11 @@ const vector<uint8_t>* VirtualFontImpl::getDVI (int c) const { return (it == _charDefs.end() ? nullptr : &it->second); } +////////////////////////////////////////////////////////////////////////////// + +void PhysicalFont::visit (FontVisitor &visitor) {visitor.visited(this);} +void VirtualFont::visit (FontVisitor &visitor) {visitor.visited(this);} +void NativeFont::visit (FontVisitor &visitor) {visitor.visited(this);} +void PhysicalFont::visit (FontVisitor &visitor) const {visitor.visited(this);} +void VirtualFont::visit (FontVisitor &visitor) const {visitor.visited(this);} +void NativeFont::visit (FontVisitor &visitor) const {visitor.visited(this);} diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.hpp index 0c341b8e69d..23c99e3bc57 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.hpp @@ -2,7 +2,7 @@ ** Font.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -50,6 +50,7 @@ struct GlyphMetrics { double wl, wr, h, d; }; +class FontVisitor; /** Abstract base for all font classes. */ class Font { @@ -69,17 +70,19 @@ class Font { virtual const char* path () const =0; virtual const char* filename () const; virtual const FontEncoding* encoding () const; - virtual bool getGlyph (int c, Glyph &glyph, GFGlyphTracer::Callback *callback=nullptr) const =0; + virtual bool getGlyph (int c, Glyph &glyph, GFGlyphTracer::Callback *callback) const =0; virtual void getGlyphMetrics (int c, bool vertical, GlyphMetrics &metrics) const; virtual uint32_t unicode (uint32_t c) const; virtual void tidy () const {} virtual bool findAndAssignBaseFontMap () {return true;} - virtual bool verticalLayout () const {return getMetrics() ? getMetrics()->verticalLayout() : false;} + virtual bool verticalLayout () const {return getMetrics() != nullptr && getMetrics()->verticalLayout();} virtual bool verifyChecksums () const {return true;} virtual int fontIndex () const {return 0;} virtual const FontStyle* style () const {return nullptr;} virtual Color color () const {return Color::BLACK;} virtual const FontMap::Entry* fontMapEntry () const; + virtual void visit (FontVisitor &visitor) =0; + virtual void visit (FontVisitor &visitor) const =0; }; @@ -100,7 +103,9 @@ class EmptyFont : public Font { double italicCorr (int c) const override {return 0;} const FontMetrics* getMetrics () const override {return nullptr;} const char* path () const override {return nullptr;} - bool getGlyph (int c, Glyph &glyph, GFGlyphTracer::Callback *cb=nullptr) const override {return false;} + bool getGlyph (int c, Glyph &glyph, GFGlyphTracer::Callback*) const override {return false;} + void visit (FontVisitor &visitor) override {} + void visit (FontVisitor &visitor) const override {} private: std::string _fontname; @@ -115,9 +120,9 @@ class PhysicalFont : public virtual Font { static std::unique_ptr<Font> create (const std::string &name, uint32_t checksum, double dsize, double ssize, PhysicalFont::Type type); static std::unique_ptr<Font> create (const std::string &name, int fontindex, uint32_t checksum, double dsize, double ssize); virtual Type type () const =0; - bool getGlyph (int c, Glyph &glyph, GFGlyphTracer::Callback *cb=nullptr) const override; - virtual bool getExactGlyphBox (int c, BoundingBox &bbox, GFGlyphTracer::Callback *cb=nullptr) const; - virtual bool getExactGlyphBox (int c, GlyphMetrics &metrics, bool vertical, GFGlyphTracer::Callback *cb=nullptr) const; + bool getGlyph (int c, Glyph &glyph, GFGlyphTracer::Callback *cb) const override; + virtual bool getExactGlyphBox (int c, BoundingBox &bbox, GFGlyphTracer::Callback *cb) const; + virtual bool getExactGlyphBox (int c, GlyphMetrics &metrics, bool vertical, GFGlyphTracer::Callback *cb) const; virtual bool isCIDFont () const; virtual int hAdvance () const; virtual std::string familyName () const; @@ -129,12 +134,14 @@ class PhysicalFont : public virtual Font { virtual double scaledAscent () const; virtual int ascent () const; virtual int descent () const; - virtual int traceAllGlyphs (bool includeCached, GFGlyphTracer::Callback *cb=nullptr) const; + virtual int traceAllGlyphs (bool includeCached, GFGlyphTracer::Callback *cb) const; virtual int collectCharMapIDs (std::vector<CharMapID> &charmapIDs) const; virtual CharMapID getCharMapID () const =0; virtual void setCharMapID (const CharMapID &id) {} virtual Character decodeChar (uint32_t c) const; const char* path () const override; + void visit (FontVisitor &visitor) override; + void visit (FontVisitor &visitor) const override; protected: bool createGF (std::string &gfname) const; @@ -159,7 +166,9 @@ class VirtualFont : public virtual Font { public: static std::unique_ptr<Font> create (const std::string &name, uint32_t checksum, double dsize, double ssize); virtual const DVIVector* getDVI (int c) const =0; - bool getGlyph (int c, Glyph &glyph, GFGlyphTracer::Callback *cb=nullptr) const override {return false;} + bool getGlyph (int c, Glyph &glyph, GFGlyphTracer::Callback*) const override {return false;} + void visit (FontVisitor &visitor) override; + void visit (FontVisitor &visitor) const override; protected: virtual void assignChar (uint32_t c, DVIVector &&dvi) =0; @@ -272,6 +281,8 @@ class NativeFont : public PhysicalFont { Color color () const override {return _color;} const FontMap::Entry* fontMapEntry () const override {return nullptr;} static std::string uniqueName (const std::string &path, const FontStyle &style); + void visit (FontVisitor &visitor) override; + void visit (FontVisitor &visitor) const override; protected: NativeFont (double ptsize, const FontStyle &style, Color color) : _ptsize(ptsize), _style(style), _color(color) {} @@ -390,6 +401,33 @@ class VirtualFontImpl : public VirtualFont, public TFMFont { }; +struct FontVisitor { + virtual ~FontVisitor () =default; + virtual void visited (const PhysicalFont *font) {} + virtual void visited (const VirtualFont *font) {} + virtual void visited (const NativeFont *font) {visited(static_cast<const PhysicalFont*>(font));} + virtual void visited (PhysicalFont *font) {} + virtual void visited (VirtualFont *font) {} + virtual void visited (NativeFont *font) {visited(static_cast<PhysicalFont*>(font));} +}; + + +/** This function works similar to dynamic_cast but only on pointers to Font classes. + * It uses double dispatch instead of RTTI and should therefore be faster. + * @param[in] font font pointer to be cast + * @return cast pointer on success, nullptr otherwise */ +template <typename C> +C font_cast (typename util::set_const_of<Font>::by<typename std::remove_pointer<C>::type>::type *font) { + struct : FontVisitor { + void visited (C font) override {result = font;} + C result = nullptr; + } visitor; + if (font) + font->visit(visitor); + return visitor.result; +} + + struct FontException : public MessageException { explicit FontException (const std::string &msg) : MessageException(msg) {} }; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.cpp index 09a88a2d2a8..44b4de521ef 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.cpp @@ -2,7 +2,7 @@ ** FontCache.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -281,9 +281,9 @@ bool FontCache::fontinfo (const string &dirname, vector<FontInfo> &infos, vector string path = dirname+"/"+(fname.substr(1)); ifstream ifs(path, ios::binary); if (fontinfo(ifs, info)) - infos.emplace_back(move(info)); + infos.push_back(move(info)); else - invalid.emplace_back(fname.substr(1)); + invalid.push_back(fname.substr(1)); } } } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.hpp index e7bbf36126f..01333d05d65 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.hpp @@ -2,7 +2,7 @@ ** FontCache.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.cpp index afc221063e5..9ba9dcd488e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.cpp @@ -2,7 +2,7 @@ ** FontEncoding.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.hpp index 141f4486fe5..b0425f47a6b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.hpp @@ -2,7 +2,7 @@ ** FontEncoding.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.cpp index 56ae0a9f78c..630570046f9 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.cpp @@ -2,7 +2,7 @@ ** FontEngine.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -103,7 +103,7 @@ bool FontEngine::setFont (const Font &font) { return true; if (const char *path=font.path()) { - auto pf = dynamic_cast<const PhysicalFont*>(&font); + auto pf = font_cast<const PhysicalFont*>(&font); if (setFont(path, font.fontIndex(), pf ? pf->getCharMapID() : CharMapID())) { _currentFont = &font; return true; @@ -239,6 +239,33 @@ int FontEngine::getVAdvance (const Character &c) const { } +int FontEngine::getWidth (const Character &c) const { + if (_currentFace) { + FT_Load_Glyph(_currentFace, charIndex(c), FT_LOAD_NO_SCALE); + return _currentFace->glyph->metrics.width; + } + return 0; +} + + +int FontEngine::getHeight (const Character &c) const { + if (_currentFace) { + FT_Load_Glyph(_currentFace, charIndex(c), FT_LOAD_NO_SCALE); + return _currentFace->glyph->metrics.horiBearingY; + } + return 0; +} + + +int FontEngine::getDepth (const Character &c) const { + if (_currentFace) { + FT_Load_Glyph(_currentFace, charIndex(c), FT_LOAD_NO_SCALE); + return _currentFace->glyph->metrics.height - _currentFace->glyph->metrics.horiBearingY; + } + return 0; +} + + int FontEngine::charIndex (const Character &c) const { if (!_currentFace || !_currentFace->charmap) return c.type() == Character::NAME ? 0 : c.number(); @@ -308,7 +335,7 @@ int FontEngine::getCharMapIDs (vector<CharMapID> &charmapIDs) const { if (_currentFace) { for (int i=0; i < _currentFace->num_charmaps; i++) { FT_CharMap charmap = _currentFace->charmaps[i]; - charmapIDs.emplace_back(CharMapID(charmap->platform_id, charmap->encoding_id)); + charmapIDs.emplace_back(charmap->platform_id, charmap->encoding_id); } } return charmapIDs.size(); diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.hpp index 45d9c6d3b63..d7c1496c2bc 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.hpp @@ -2,7 +2,7 @@ ** FontEngine.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -54,6 +54,9 @@ class FontEngine { int getHAdvance () const; int getHAdvance (const Character &c) const; int getVAdvance (const Character &c) const; + int getWidth (const Character &c) const; + int getHeight (const Character &c) const; + int getDepth (const Character &c) const; int getFirstChar () const; int getNextChar () const; int getCharMapIDs (std::vector<CharMapID> &charmapIDs) const; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.cpp index 33135135c1b..2262346c60d 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.cpp @@ -2,7 +2,7 @@ ** FontManager.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -221,16 +221,14 @@ int FontManager::registerFont (uint32_t fontnum, const string &name, uint32_t ch } _name2id[name] = newid; } - _fonts.emplace_back(std::move(newfont)); + _fonts.push_back(std::move(newfont)); if (_vfStack.empty()) // register font referenced in dvi file? _num2id[fontnum] = newid; else { // register font referenced in vf file const VirtualFont *vf = _vfStack.top(); _vfnum2id[vf][fontnum] = newid; - if (_vfFirstFontNumMap.find(vf) == _vfFirstFontNumMap.end()) { // first fontdef of VF? - _vfFirstFontNumMap.emplace(vf, fontnum); - _vfFirstFontMap.emplace(vf, _fonts.back().get()); - } + _vfFirstFontNumMap.emplace(vf, fontnum); + _vfFirstFontMap.emplace(vf, _fonts.back().get()); } return newid; } @@ -269,7 +267,7 @@ int FontManager::registerFont (uint32_t fontnum, string filename, int fontIndex, const int newid = _fonts.size(); // the new font gets this ID auto it = _name2id.find(fontname); if (it != _name2id.end()) { // font with same name already registered? - if (auto font = dynamic_cast<NativeFont*>(_fonts[it->second].get())) + if (auto font = font_cast<NativeFont*>(_fonts[it->second].get())) newfont = font->clone(ptsize, style, color); } else { @@ -291,7 +289,7 @@ int FontManager::registerFont (uint32_t fontnum, string filename, int fontIndex, } _name2id[fontname] = newid; } - _fonts.emplace_back(std::move(newfont)); + _fonts.push_back(std::move(newfont)); _num2id[fontnum] = newid; return newid; } @@ -330,7 +328,7 @@ ostream& FontManager::write (ostream &os, Font *font, int level) { if (_fonts[i] == font) id = i; - VirtualFont *vf = dynamic_cast<VirtualFont*>(font); + VirtualFont *vf = font_cast<VirtualFont*>(font); for (int j=0; j < level+1; j++) os << " "; os << "id " << id diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.hpp index 413b649169f..e371e6bac6f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.hpp @@ -2,7 +2,7 @@ ** FontManager.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.cpp index a16d38aa2f0..e5c0caef5de 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.cpp @@ -2,7 +2,7 @@ ** FontMap.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.hpp index 8ed65199220..c681e24dba2 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.hpp @@ -2,7 +2,7 @@ ** FontMap.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.cpp index b2cba248181..1391f9e630a 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.cpp @@ -2,7 +2,7 @@ ** FontMetrics.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.hpp index 53cafbb827d..b9f5b260d8f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.hpp @@ -2,7 +2,7 @@ ** FontMetrics.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -43,6 +43,7 @@ struct FontMetrics { virtual uint32_t getChecksum () const =0; virtual uint16_t firstChar () const =0; virtual uint16_t lastChar () const =0; + virtual bool isJFM () const {return false;} static std::unique_ptr<FontMetrics> read (const std::string &fontname); }; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontStyle.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontStyle.hpp index 094ba2da1f8..125099f9e7e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontStyle.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontStyle.hpp @@ -2,7 +2,7 @@ ** FontStyle.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.cpp index ad1a6dd77c0..b05f63c3dff 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.cpp @@ -2,7 +2,7 @@ ** FontWriter.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -59,7 +59,7 @@ const FontWriter::FontFormatInfo* FontWriter::fontFormatInfo (FontFormat format) vector<string> FontWriter::supportedFormats () { vector<string> formats; for (const FontFormatInfo &info : _formatInfos) - formats.emplace_back(info.formatstr_short); + formats.push_back(info.formatstr_short); return formats; } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.hpp index 1fa5dab4db6..2bf1b90edd4 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.hpp @@ -2,7 +2,7 @@ ** FontWriter.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.cpp index fc900dc6a92..7c2e19f3c4f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.cpp @@ -2,7 +2,7 @@ ** GFGlyphTracer.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -25,7 +25,7 @@ using namespace std; /** Constructs a new glyph tracer. * @param[in] is GF input stream * @param[in] upp target units per PS point */ -GFGlyphTracer::GFGlyphTracer (string &fname, double upp, Callback *cb) +GFGlyphTracer::GFGlyphTracer (const string &fname, double upp, Callback *cb) : GFTracer(_ifs, upp), _callback(cb) { if (_callback) @@ -34,7 +34,7 @@ GFGlyphTracer::GFGlyphTracer (string &fname, double upp, Callback *cb) } -void GFGlyphTracer::reset (string &fname, double upp) { +void GFGlyphTracer::reset (const string &fname, double upp) { if (_callback) _callback->setFont(fname); if (_ifs.is_open()) diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.hpp index 2f3ed818143..030cb27ac59 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.hpp @@ -2,7 +2,7 @@ ** GFGlyphTracer.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -38,8 +38,8 @@ class GFGlyphTracer : public GFTracer { public: GFGlyphTracer () : GFTracer(_ifs, 0) {} - GFGlyphTracer (std::string &fname, double upp, Callback *cb=nullptr); - void reset (std::string &fname, double upp); + GFGlyphTracer (const std::string &fname, double upp, Callback *cb=nullptr); + void reset (const std::string &fname, double upp); void setCallback (Callback *cb) {_callback = cb;} bool executeChar (uint8_t c) override; void moveTo (double x, double y) override; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.cpp index 3fdba80d9c2..6c0fd1e5eb2 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.cpp @@ -2,7 +2,7 @@ ** GFReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -92,7 +92,7 @@ int GFReader::executeCommand () { if (opcode < 0) // at end of file? throw GFException("unexpected end of file"); - if (opcode >= 0 && opcode <= 63) + if (opcode <= 63) cmdPaint0(opcode); else if (opcode >= 74 && opcode <= 238) cmdNewRow(opcode-74); diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.hpp index 401f89babbb..efbb130475b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.hpp @@ -2,7 +2,7 @@ ** GFReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.cpp index 408fb49d0bb..dd761ecaf24 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.cpp @@ -2,7 +2,7 @@ ** GFTracer.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.hpp index f52ffd6cc82..083395e9c3e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.hpp @@ -2,7 +2,7 @@ ** GFTracer.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.cpp index bef8a68b92a..f4aa6e00aa7 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.cpp @@ -2,7 +2,7 @@ ** Ghostscript.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -215,7 +215,7 @@ bool Ghostscript::available () { /** Retrieves version information about Ghostscript. * @param[out] r takes the revision information (see GS API documentation for further details) * @return true on success */ -bool Ghostscript::revision (gsapi_revision_t *r) { +bool Ghostscript::revision (gsapi_revision_t *r) const { #if defined(HAVE_LIBGS) return (gsapi_revision(r, sizeof(gsapi_revision_t)) == 0); #else @@ -227,7 +227,7 @@ bool Ghostscript::revision (gsapi_revision_t *r) { /** Returns the revision number of the GS library. */ -int Ghostscript::revision () { +int Ghostscript::revision () const { gsapi_revision_t r; if (revision(&r)) return static_cast<int>(r.revision); diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.hpp index 883b42d1762..9faa63e360b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.hpp @@ -2,7 +2,7 @@ ** Ghostscript.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -78,8 +78,8 @@ class Ghostscript ~Ghostscript (); bool init (int argc, const char **argv, void *caller=nullptr); bool available (); - bool revision (gsapi_revision_t *r); - int revision (); + bool revision (gsapi_revision_t *r) const; + int revision () const; std::string revisionstr (); int set_stdio (Stdin in, Stdout out, Stderr err); int run_string_begin (int user_errors, int *pexit_code); diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Glyph.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Glyph.hpp index 37de9bd58cb..fb6a4855200 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Glyph.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Glyph.hpp @@ -2,7 +2,7 @@ ** Glyph.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/GlyphTracerMessages.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/GlyphTracerMessages.hpp index 32f4f08955d..15c607faea6 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/GlyphTracerMessages.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/GlyphTracerMessages.hpp @@ -2,7 +2,7 @@ ** GlyphTracerMessages.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/GraphicsPath.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/GraphicsPath.hpp index 27d45472524..9d270871cf0 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/GraphicsPath.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/GraphicsPath.hpp @@ -2,7 +2,7 @@ ** GraphicsPath.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -20,6 +20,7 @@ #pragma once +#include <algorithm> #include <array> #include <cctype> #include <cmath> @@ -662,24 +663,14 @@ class GraphicsPath { bool operator == (const GraphicsPath &path) const { if (size() != path.size()) return false; - auto it = _commands.begin(); - for (const auto &cmd : path._commands) { - if (*it++ != cmd) - return false; - } - return true; + return std::equal(_commands.begin(), _commands.end(), path._commands.begin()); } /** Returns true if this path differs from another one (command-wise). */ bool operator != (const GraphicsPath &path) const { if (size() != path.size()) return true; - auto it = _commands.begin(); - for (const auto &cmd : path._commands) { - if (*it++ != cmd) - return true; - } - return false; + return !std::equal(_commands.begin(), _commands.end(), path._commands.begin()); } /** Iterates over all commands defining this path and calls the corresponding template methods. diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.cpp index bada148b6c7..b97084f3287 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.cpp @@ -2,7 +2,7 @@ ** HashFunction.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.hpp index 5efbdf84684..15f7725543a 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.hpp @@ -2,7 +2,7 @@ ** HashFunction.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.cpp index dca8111405d..33d980fa723 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.cpp @@ -2,7 +2,7 @@ ** HtmlSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.hpp index 2122ed749d5..4bdabfda773 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.hpp @@ -2,7 +2,7 @@ ** HtmlSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.cpp index 09b48156307..2371234499b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.cpp @@ -2,7 +2,7 @@ ** HyperlinkManager.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -106,7 +106,7 @@ void HyperlinkManager::createLink (string uri, SpecialActions &actions) { uri = "/" + uri; uri = _base + uri; } - auto anchorNode = util::make_unique<XMLElement>("a"); + auto anchorNode = util::make_unique<SVGElement>("a"); anchorNode->addAttribute("xlink:href", uri); anchorNode->addAttribute("xlink:title", XMLString(name.empty() ? uri : name, false)); actions.svgTree().pushPageContext(std::move(anchorNode)); @@ -148,14 +148,14 @@ void HyperlinkManager::markLinkedBox (SpecialActions &actions) { if (bbox.width() > 0 && bbox.height() > 0) { // does the bounding box extend in both dimensions? if (MARKER_TYPE != MarkerType::NONE) { const double linewidth = _linewidth >= 0 ? _linewidth : min(0.5, bbox.height()/15); - auto rect = util::make_unique<XMLElement>("rect"); + auto rect = util::make_unique<SVGElement>("rect"); double x = bbox.minX(); double y = bbox.maxY()+linewidth; double w = bbox.width(); double h = linewidth; const Color linecolor = COLORSOURCE == ColorSource::DEFAULT ? actions.getColor() : LINK_LINECOLOR; if (MARKER_TYPE == MarkerType::LINE) - rect->addAttribute("fill", linecolor.svgColorString()); + rect->setFillColor(linecolor); else { const double offset = _linewidth < 0 ? linewidth : 0 ; x -= offset; @@ -163,16 +163,16 @@ void HyperlinkManager::markLinkedBox (SpecialActions &actions) { w += 2*offset; h += bbox.height()+offset; if (MARKER_TYPE == MarkerType::BGCOLOR) { - rect->addAttribute("fill", LINK_BGCOLOR.svgColorString()); + rect->setFillColor(LINK_BGCOLOR); if (COLORSOURCE != ColorSource::DEFAULT) { - rect->addAttribute("stroke", linecolor.svgColorString()); - rect->addAttribute("stroke-width", linewidth); + rect->setStrokeColor(linecolor); + rect->setStrokeWidth(linewidth); } } else { // LM_BOX - rect->addAttribute("fill", "none"); - rect->addAttribute("stroke", linecolor.svgColorString()); - rect->addAttribute("stroke-width", linewidth); + rect->setNoFillColor(); + rect->setStrokeColor(linecolor); + rect->setStrokeWidth(linewidth); } } rect->addAttribute("x", x); @@ -192,13 +192,13 @@ void HyperlinkManager::markLinkedBox (SpecialActions &actions) { // Create an invisible rectangle around the linked area so that it's easier to access. // This is only necessary when using paths rather than real text elements together with fonts. if (!SVGTree::USE_FONTS) { - auto rect = util::make_unique<XMLElement>("rect"); + auto rect = util::make_unique<SVGElement>("rect"); rect->addAttribute("x", bbox.minX()); rect->addAttribute("y", bbox.minY()); rect->addAttribute("width", bbox.width()); rect->addAttribute("height", bbox.height()); - rect->addAttribute("fill", "white"); - rect->addAttribute("fill-opacity", 0); + rect->setFillColor(Color::WHITE); + rect->setFillOpacity(OpacityAlpha(0, 0)); actions.svgTree().appendToPage(std::move(rect)); } } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.hpp index 4859e0784e7..3e7ba17373e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.hpp @@ -2,7 +2,7 @@ ** HyperlinkManager.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -52,7 +52,7 @@ class HyperlinkManager { void checkNewLine (SpecialActions &actions); void createLink (std::string uri, SpecialActions &actions); void createViews (unsigned pageno, SpecialActions &actions); - void setBaseUrl (std::string &base) {_base = base;} + void setBaseUrl (const std::string &base) {_base = base;} void setLineWidth (double w) {_linewidth = w;} static HyperlinkManager& instance (); static bool setLinkMarker (const std::string &marker); diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.cpp index 6c52a0b8268..e810f32e664 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.cpp @@ -2,7 +2,7 @@ ** ImageToSVG.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.hpp index d3da961c0eb..2c2c701d47b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.hpp @@ -2,7 +2,7 @@ ** ImageToSVG.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -57,9 +57,11 @@ class ImageToSVG : protected SpecialActions { void setY (double y) override {_y = y; _svg.setY(y);} void finishLine () override {} void setColor (const Color &color) override {_svg.setColor(color);} + void setOpacity (const Opacity &opacity) override {_svg.setOpacity(opacity);} Color getColor () const override {return _svg.getColor();} void setMatrix (const Matrix &m) override {_svg.setMatrix(m);} const Matrix& getMatrix () const override {return _svg.getMatrix();} + const Opacity& getOpacity () const override {return _svg.getOpacity();} const SVGTree& svgTree () const override {return _svg;} void setBgColor (const Color &color) override {} void embed (const BoundingBox &bbox) override {_bbox.embed(bbox);} diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.cpp index 6ee562da7d0..e9387cfb116 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.cpp @@ -2,7 +2,7 @@ ** InputBuffer.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.hpp index cc3c593e8f1..adf5898cec7 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.hpp @@ -2,7 +2,7 @@ ** InputBuffer.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -40,12 +40,14 @@ struct InputBuffer { class StreamInputBuffer : public InputBuffer { public: explicit StreamInputBuffer (std::istream &is, size_t bufsize=1024); + StreamInputBuffer (const StreamInputBuffer &ib) =delete; ~StreamInputBuffer () override; int get () override; int peek () const override; int peek (size_t n) const override; bool eof () const override {return pos() == _size1 && _size2 == 0;} void invalidate () override {_bufptr = _buf1+_size1; _size2 = 0;} + void operator = (const StreamInputBuffer &ib) =delete; protected: int fillBuffer (uint8_t *buf); @@ -65,6 +67,7 @@ class StreamInputBuffer : public InputBuffer { class StringInputBuffer : public InputBuffer { public: explicit StringInputBuffer (const std::string &str) : _str(&str) {} + StringInputBuffer (const StreamInputBuffer &ib) =delete; void assign (const std::string &str) {_str = &str; _pos=0;} int get () override {return _pos < _str->length() ? _str->at(_pos++) : -1;} int peek () const override {return _pos < _str->length() ? _str->at(_pos) : -1;} @@ -81,6 +84,7 @@ class StringInputBuffer : public InputBuffer { class CharInputBuffer : public InputBuffer { public: CharInputBuffer (const char *buf, size_t size) : _pos(buf), _size(buf ? size : 0) {} + CharInputBuffer (const CharInputBuffer &ib) =delete; int get () override { if (_size == 0) @@ -112,6 +116,7 @@ class CharInputBuffer : public InputBuffer { class SplittedCharInputBuffer : public InputBuffer { public: SplittedCharInputBuffer (const char *buf1, size_t s1, const char *buf2, size_t s2); + SplittedCharInputBuffer (const SplittedCharInputBuffer &ib) =delete; int get () override; int peek () const override; int peek (size_t n) const override; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.cpp index 6b5a7b70f09..ed97e3f44d3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.cpp @@ -2,7 +2,7 @@ ** InputReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -365,8 +365,7 @@ string InputReader::getLine () { while (!eof() && peek() > 0 && peek() != '\n') ret += char(get()); // trim trailing whitespace - ret.erase(std::find_if(ret.rbegin(), ret.rend(), not1(ptr_fun<int, int>(isspace))).base(), ret.end()); - return ret; + return ret.erase(ret.find_last_not_of(" \t\n\r\f\v")+1); } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.hpp index d9b697963bf..ac1dfdf9558 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.hpp @@ -2,7 +2,7 @@ ** InputReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.cpp index d0dd13c9b96..4b5c63cb7e4 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.cpp @@ -2,7 +2,7 @@ ** JFM.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.hpp index 9080212b798..dc9798cda2a 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.hpp @@ -2,7 +2,7 @@ ** JFM.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -29,6 +29,7 @@ class JFM : public TFM { public: explicit JFM (std::istream &is); bool verticalLayout () const override {return _vertical;} + bool isJFM () const override {return true;} uint32_t minChar () const {return _minchar;} uint32_t maxChar () const {return static_cast<uint32_t>(_minchar+_charTypeTable.size()-1);} diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.cpp index d4992c77efe..463f571a590 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.cpp @@ -2,7 +2,7 @@ ** Length.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.hpp index f03711ecd28..14a2fd4c743 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.hpp @@ -2,7 +2,7 @@ ** Length.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/MD5HashFunction.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/MD5HashFunction.hpp index e34db106022..5149d5945e6 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/MD5HashFunction.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/MD5HashFunction.hpp @@ -2,7 +2,7 @@ ** MD5HashFunction.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.am b/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.am index 2a1706b15b1..d329e35f4a0 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.am +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.am @@ -1,5 +1,5 @@ ## This file is part of dvisvgm -## Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> +## Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ## ## Process this file with automake. @@ -110,6 +110,7 @@ libdvisvgm_a_SOURCES = \ MetafontWrapper.hpp MetafontWrapper.cpp \ NoPsSpecialHandler.hpp NoPsSpecialHandler.cpp \ NumericRanges.hpp \ + Opacity.hpp Opacity.cpp \ PageRanges.hpp PageRanges.cpp \ PageSize.hpp PageSize.cpp \ Pair.hpp \ @@ -140,6 +141,7 @@ libdvisvgm_a_SOURCES = \ SVGCharHandlerFactory.hpp SVGCharHandlerFactory.cpp \ SVGCharPathHandler.hpp SVGCharPathHandler.cpp \ SVGCharTspanTextHandler.hpp SVGCharTspanTextHandler.cpp \ + SVGElement.hpp SVGElement.cpp \ SVGOutput.hpp SVGOutput.cpp \ SVGSingleCharTextHandler.hpp SVGSingleCharTextHandler.cpp \ SVGTree.hpp SVGTree.cpp \ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.in b/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.in index 5f0f5599912..88b75b779d5 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.in +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.in @@ -178,29 +178,30 @@ am__libdvisvgm_a_SOURCES_DIST = AGLTable.hpp BasicDVIReader.hpp \ MD5HashFunction.hpp Message.hpp Message.cpp \ MessageException.hpp MetafontWrapper.hpp MetafontWrapper.cpp \ NoPsSpecialHandler.hpp NoPsSpecialHandler.cpp \ - NumericRanges.hpp PageRanges.hpp PageRanges.cpp PageSize.hpp \ - PageSize.cpp Pair.hpp PapersizeSpecialHandler.hpp \ - PapersizeSpecialHandler.cpp PathClipper.hpp PathClipper.cpp \ - PDFParser.hpp PDFParser.cpp PdfSpecialHandler.hpp \ - PdfSpecialHandler.cpp PDFToSVG.hpp PreScanDVIReader.hpp \ - PreScanDVIReader.cpp Process.hpp Process.cpp psdefs.cpp \ - PSFilter.hpp PSInterpreter.hpp PSInterpreter.cpp PSPattern.hpp \ - PSPattern.cpp PSPreviewFilter.hpp PSPreviewFilter.cpp \ - PsSpecialHandler.hpp PsSpecialHandler.cpp RangeMap.hpp \ - RangeMap.cpp ShadingPatch.hpp ShadingPatch.cpp \ - SignalHandler.hpp SignalHandler.cpp SourceInput.hpp \ - SourceInput.cpp SpecialActions.hpp SpecialHandler.hpp \ - SpecialManager.hpp SpecialManager.cpp StreamReader.hpp \ - StreamReader.cpp StreamWriter.hpp StreamWriter.cpp Subfont.hpp \ - Subfont.cpp SVGCharHandler.hpp SVGCharHandler.cpp \ + NumericRanges.hpp Opacity.hpp Opacity.cpp PageRanges.hpp \ + PageRanges.cpp PageSize.hpp PageSize.cpp Pair.hpp \ + PapersizeSpecialHandler.hpp PapersizeSpecialHandler.cpp \ + PathClipper.hpp PathClipper.cpp PDFParser.hpp PDFParser.cpp \ + PdfSpecialHandler.hpp PdfSpecialHandler.cpp PDFToSVG.hpp \ + PreScanDVIReader.hpp PreScanDVIReader.cpp Process.hpp \ + Process.cpp psdefs.cpp PSFilter.hpp PSInterpreter.hpp \ + PSInterpreter.cpp PSPattern.hpp PSPattern.cpp \ + PSPreviewFilter.hpp PSPreviewFilter.cpp PsSpecialHandler.hpp \ + PsSpecialHandler.cpp RangeMap.hpp RangeMap.cpp \ + ShadingPatch.hpp ShadingPatch.cpp SignalHandler.hpp \ + SignalHandler.cpp SourceInput.hpp SourceInput.cpp \ + SpecialActions.hpp SpecialHandler.hpp SpecialManager.hpp \ + SpecialManager.cpp StreamReader.hpp StreamReader.cpp \ + StreamWriter.hpp StreamWriter.cpp Subfont.hpp Subfont.cpp \ + SVGCharHandler.hpp SVGCharHandler.cpp \ SVGCharHandlerFactory.hpp SVGCharHandlerFactory.cpp \ SVGCharPathHandler.hpp SVGCharPathHandler.cpp \ SVGCharTspanTextHandler.hpp SVGCharTspanTextHandler.cpp \ - SVGOutput.hpp SVGOutput.cpp SVGSingleCharTextHandler.hpp \ - SVGSingleCharTextHandler.cpp SVGTree.hpp SVGTree.cpp \ - System.hpp System.cpp TensorProductPatch.hpp \ - TensorProductPatch.cpp Terminal.hpp Terminal.cpp TFM.hpp \ - TFM.cpp ToUnicodeMap.hpp ToUnicodeMap.cpp \ + SVGElement.hpp SVGElement.cpp SVGOutput.hpp SVGOutput.cpp \ + SVGSingleCharTextHandler.hpp SVGSingleCharTextHandler.cpp \ + SVGTree.hpp SVGTree.cpp System.hpp System.cpp \ + TensorProductPatch.hpp TensorProductPatch.cpp Terminal.hpp \ + Terminal.cpp TFM.hpp TFM.cpp ToUnicodeMap.hpp ToUnicodeMap.cpp \ TpicSpecialHandler.hpp TpicSpecialHandler.cpp \ TriangularPatch.hpp TriangularPatch.cpp TrueTypeFont.hpp \ TrueTypeFont.cpp TTFAutohint.hpp TTFAutohint.cpp Unicode.hpp \ @@ -231,7 +232,7 @@ am_libdvisvgm_a_OBJECTS = BasicDVIReader.$(OBJEXT) Bezier.$(OBJEXT) \ InputReader.$(OBJEXT) JFM.$(OBJEXT) Length.$(OBJEXT) \ MapLine.$(OBJEXT) Matrix.$(OBJEXT) Message.$(OBJEXT) \ MetafontWrapper.$(OBJEXT) NoPsSpecialHandler.$(OBJEXT) \ - PageRanges.$(OBJEXT) PageSize.$(OBJEXT) \ + Opacity.$(OBJEXT) PageRanges.$(OBJEXT) PageSize.$(OBJEXT) \ PapersizeSpecialHandler.$(OBJEXT) PathClipper.$(OBJEXT) \ PDFParser.$(OBJEXT) PdfSpecialHandler.$(OBJEXT) \ PreScanDVIReader.$(OBJEXT) Process.$(OBJEXT) psdefs.$(OBJEXT) \ @@ -243,14 +244,14 @@ am_libdvisvgm_a_OBJECTS = BasicDVIReader.$(OBJEXT) Bezier.$(OBJEXT) \ StreamWriter.$(OBJEXT) Subfont.$(OBJEXT) \ SVGCharHandler.$(OBJEXT) SVGCharHandlerFactory.$(OBJEXT) \ SVGCharPathHandler.$(OBJEXT) SVGCharTspanTextHandler.$(OBJEXT) \ - SVGOutput.$(OBJEXT) SVGSingleCharTextHandler.$(OBJEXT) \ - SVGTree.$(OBJEXT) System.$(OBJEXT) \ - TensorProductPatch.$(OBJEXT) Terminal.$(OBJEXT) TFM.$(OBJEXT) \ - ToUnicodeMap.$(OBJEXT) TpicSpecialHandler.$(OBJEXT) \ - TriangularPatch.$(OBJEXT) TrueTypeFont.$(OBJEXT) \ - TTFAutohint.$(OBJEXT) Unicode.$(OBJEXT) utility.$(OBJEXT) \ - VFReader.$(OBJEXT) XMLDocument.$(OBJEXT) XMLNode.$(OBJEXT) \ - XMLString.$(OBJEXT) $(am__objects_1) + SVGElement.$(OBJEXT) SVGOutput.$(OBJEXT) \ + SVGSingleCharTextHandler.$(OBJEXT) SVGTree.$(OBJEXT) \ + System.$(OBJEXT) TensorProductPatch.$(OBJEXT) \ + Terminal.$(OBJEXT) TFM.$(OBJEXT) ToUnicodeMap.$(OBJEXT) \ + TpicSpecialHandler.$(OBJEXT) TriangularPatch.$(OBJEXT) \ + TrueTypeFont.$(OBJEXT) TTFAutohint.$(OBJEXT) Unicode.$(OBJEXT) \ + utility.$(OBJEXT) VFReader.$(OBJEXT) XMLDocument.$(OBJEXT) \ + XMLNode.$(OBJEXT) XMLString.$(OBJEXT) $(am__objects_1) libdvisvgm_a_OBJECTS = $(am_libdvisvgm_a_OBJECTS) am_dvisvgm_OBJECTS = dvisvgm.$(OBJEXT) dvisvgm_OBJECTS = $(am_dvisvgm_OBJECTS) @@ -304,10 +305,11 @@ am__depfiles_remade = ./$(DEPDIR)/BasicDVIReader.Po \ ./$(DEPDIR)/JFM.Po ./$(DEPDIR)/Length.Po \ ./$(DEPDIR)/MapLine.Po ./$(DEPDIR)/Matrix.Po \ ./$(DEPDIR)/Message.Po ./$(DEPDIR)/MetafontWrapper.Po \ - ./$(DEPDIR)/NoPsSpecialHandler.Po ./$(DEPDIR)/PDFParser.Po \ - ./$(DEPDIR)/PSInterpreter.Po ./$(DEPDIR)/PSPattern.Po \ - ./$(DEPDIR)/PSPreviewFilter.Po ./$(DEPDIR)/PageRanges.Po \ - ./$(DEPDIR)/PageSize.Po ./$(DEPDIR)/PapersizeSpecialHandler.Po \ + ./$(DEPDIR)/NoPsSpecialHandler.Po ./$(DEPDIR)/Opacity.Po \ + ./$(DEPDIR)/PDFParser.Po ./$(DEPDIR)/PSInterpreter.Po \ + ./$(DEPDIR)/PSPattern.Po ./$(DEPDIR)/PSPreviewFilter.Po \ + ./$(DEPDIR)/PageRanges.Po ./$(DEPDIR)/PageSize.Po \ + ./$(DEPDIR)/PapersizeSpecialHandler.Po \ ./$(DEPDIR)/PathClipper.Po ./$(DEPDIR)/PdfSpecialHandler.Po \ ./$(DEPDIR)/PreScanDVIReader.Po ./$(DEPDIR)/Process.Po \ ./$(DEPDIR)/PsSpecialHandler.Po ./$(DEPDIR)/RangeMap.Po \ @@ -315,7 +317,7 @@ am__depfiles_remade = ./$(DEPDIR)/BasicDVIReader.Po \ ./$(DEPDIR)/SVGCharHandlerFactory.Po \ ./$(DEPDIR)/SVGCharPathHandler.Po \ ./$(DEPDIR)/SVGCharTspanTextHandler.Po \ - ./$(DEPDIR)/SVGOutput.Po \ + ./$(DEPDIR)/SVGElement.Po ./$(DEPDIR)/SVGOutput.Po \ ./$(DEPDIR)/SVGSingleCharTextHandler.Po ./$(DEPDIR)/SVGTree.Po \ ./$(DEPDIR)/ShadingPatch.Po ./$(DEPDIR)/SignalHandler.Po \ ./$(DEPDIR)/SourceInput.Po ./$(DEPDIR)/SpecialManager.Po \ @@ -640,29 +642,30 @@ libdvisvgm_a_SOURCES = AGLTable.hpp BasicDVIReader.hpp \ MD5HashFunction.hpp Message.hpp Message.cpp \ MessageException.hpp MetafontWrapper.hpp MetafontWrapper.cpp \ NoPsSpecialHandler.hpp NoPsSpecialHandler.cpp \ - NumericRanges.hpp PageRanges.hpp PageRanges.cpp PageSize.hpp \ - PageSize.cpp Pair.hpp PapersizeSpecialHandler.hpp \ - PapersizeSpecialHandler.cpp PathClipper.hpp PathClipper.cpp \ - PDFParser.hpp PDFParser.cpp PdfSpecialHandler.hpp \ - PdfSpecialHandler.cpp PDFToSVG.hpp PreScanDVIReader.hpp \ - PreScanDVIReader.cpp Process.hpp Process.cpp psdefs.cpp \ - PSFilter.hpp PSInterpreter.hpp PSInterpreter.cpp PSPattern.hpp \ - PSPattern.cpp PSPreviewFilter.hpp PSPreviewFilter.cpp \ - PsSpecialHandler.hpp PsSpecialHandler.cpp RangeMap.hpp \ - RangeMap.cpp ShadingPatch.hpp ShadingPatch.cpp \ - SignalHandler.hpp SignalHandler.cpp SourceInput.hpp \ - SourceInput.cpp SpecialActions.hpp SpecialHandler.hpp \ - SpecialManager.hpp SpecialManager.cpp StreamReader.hpp \ - StreamReader.cpp StreamWriter.hpp StreamWriter.cpp Subfont.hpp \ - Subfont.cpp SVGCharHandler.hpp SVGCharHandler.cpp \ + NumericRanges.hpp Opacity.hpp Opacity.cpp PageRanges.hpp \ + PageRanges.cpp PageSize.hpp PageSize.cpp Pair.hpp \ + PapersizeSpecialHandler.hpp PapersizeSpecialHandler.cpp \ + PathClipper.hpp PathClipper.cpp PDFParser.hpp PDFParser.cpp \ + PdfSpecialHandler.hpp PdfSpecialHandler.cpp PDFToSVG.hpp \ + PreScanDVIReader.hpp PreScanDVIReader.cpp Process.hpp \ + Process.cpp psdefs.cpp PSFilter.hpp PSInterpreter.hpp \ + PSInterpreter.cpp PSPattern.hpp PSPattern.cpp \ + PSPreviewFilter.hpp PSPreviewFilter.cpp PsSpecialHandler.hpp \ + PsSpecialHandler.cpp RangeMap.hpp RangeMap.cpp \ + ShadingPatch.hpp ShadingPatch.cpp SignalHandler.hpp \ + SignalHandler.cpp SourceInput.hpp SourceInput.cpp \ + SpecialActions.hpp SpecialHandler.hpp SpecialManager.hpp \ + SpecialManager.cpp StreamReader.hpp StreamReader.cpp \ + StreamWriter.hpp StreamWriter.cpp Subfont.hpp Subfont.cpp \ + SVGCharHandler.hpp SVGCharHandler.cpp \ SVGCharHandlerFactory.hpp SVGCharHandlerFactory.cpp \ SVGCharPathHandler.hpp SVGCharPathHandler.cpp \ SVGCharTspanTextHandler.hpp SVGCharTspanTextHandler.cpp \ - SVGOutput.hpp SVGOutput.cpp SVGSingleCharTextHandler.hpp \ - SVGSingleCharTextHandler.cpp SVGTree.hpp SVGTree.cpp \ - System.hpp System.cpp TensorProductPatch.hpp \ - TensorProductPatch.cpp Terminal.hpp Terminal.cpp TFM.hpp \ - TFM.cpp ToUnicodeMap.hpp ToUnicodeMap.cpp \ + SVGElement.hpp SVGElement.cpp SVGOutput.hpp SVGOutput.cpp \ + SVGSingleCharTextHandler.hpp SVGSingleCharTextHandler.cpp \ + SVGTree.hpp SVGTree.cpp System.hpp System.cpp \ + TensorProductPatch.hpp TensorProductPatch.cpp Terminal.hpp \ + Terminal.cpp TFM.hpp TFM.cpp ToUnicodeMap.hpp ToUnicodeMap.cpp \ TpicSpecialHandler.hpp TpicSpecialHandler.cpp \ TriangularPatch.hpp TriangularPatch.cpp TrueTypeFont.hpp \ TrueTypeFont.cpp TTFAutohint.hpp TTFAutohint.cpp Unicode.hpp \ @@ -837,6 +840,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Message.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetafontWrapper.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NoPsSpecialHandler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Opacity.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PDFParser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSInterpreter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSPattern.Po@am__quote@ # am--include-marker @@ -854,6 +858,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGCharHandlerFactory.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGCharPathHandler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGCharTspanTextHandler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGElement.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGOutput.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGSingleCharTextHandler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGTree.Po@am__quote@ # am--include-marker @@ -1195,6 +1200,7 @@ distclean: distclean-recursive -rm -f ./$(DEPDIR)/Message.Po -rm -f ./$(DEPDIR)/MetafontWrapper.Po -rm -f ./$(DEPDIR)/NoPsSpecialHandler.Po + -rm -f ./$(DEPDIR)/Opacity.Po -rm -f ./$(DEPDIR)/PDFParser.Po -rm -f ./$(DEPDIR)/PSInterpreter.Po -rm -f ./$(DEPDIR)/PSPattern.Po @@ -1212,6 +1218,7 @@ distclean: distclean-recursive -rm -f ./$(DEPDIR)/SVGCharHandlerFactory.Po -rm -f ./$(DEPDIR)/SVGCharPathHandler.Po -rm -f ./$(DEPDIR)/SVGCharTspanTextHandler.Po + -rm -f ./$(DEPDIR)/SVGElement.Po -rm -f ./$(DEPDIR)/SVGOutput.Po -rm -f ./$(DEPDIR)/SVGSingleCharTextHandler.Po -rm -f ./$(DEPDIR)/SVGTree.Po @@ -1336,6 +1343,7 @@ maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/Message.Po -rm -f ./$(DEPDIR)/MetafontWrapper.Po -rm -f ./$(DEPDIR)/NoPsSpecialHandler.Po + -rm -f ./$(DEPDIR)/Opacity.Po -rm -f ./$(DEPDIR)/PDFParser.Po -rm -f ./$(DEPDIR)/PSInterpreter.Po -rm -f ./$(DEPDIR)/PSPattern.Po @@ -1353,6 +1361,7 @@ maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/SVGCharHandlerFactory.Po -rm -f ./$(DEPDIR)/SVGCharPathHandler.Po -rm -f ./$(DEPDIR)/SVGCharTspanTextHandler.Po + -rm -f ./$(DEPDIR)/SVGElement.Po -rm -f ./$(DEPDIR)/SVGOutput.Po -rm -f ./$(DEPDIR)/SVGSingleCharTextHandler.Po -rm -f ./$(DEPDIR)/SVGTree.Po diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.cpp index 5b43cd448a1..531550788d4 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.cpp @@ -2,7 +2,7 @@ ** MapLine.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.hpp index 2d756653536..569472d14ce 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.hpp @@ -2,7 +2,7 @@ ** MapLine.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.cpp index f1f2b47721f..7e335cef2cd 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.cpp @@ -2,7 +2,7 @@ ** Matrix.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -520,7 +520,7 @@ Matrix Matrix::parseSVGTransform (const string &transform) { vector<double> params; if (parse_transform_cmd(iss, "matrix", 6, 6, params)) { if (ne(params[0], 1) || ne(params[1], 0) || ne(params[2], 0) || ne(params[3], 1) || ne(params[4], 0) || ne(params[5], 0)) - matrix.rmultiply({params[0], params[2], params[4], params[1], params[3], params[5]}); + matrix.rmultiply(Matrix{params[0], params[2], params[4], params[1], params[3], params[5]}); } else if (parse_transform_cmd(iss, "rotate", 1, 3, params)) { if (params.size() == 1) { diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.hpp index 76c6e075148..f9b6552dd37 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.hpp @@ -2,7 +2,7 @@ ** Matrix.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -40,11 +40,12 @@ class Matrix { friend double det (const Matrix &m, int row, int col); public: + Matrix () {set(0);} + Matrix (double d); Matrix (const std::string &cmds, Calculator &calc); - Matrix (double d=0); explicit Matrix (const double *v, unsigned size=9); explicit Matrix (const std::vector<double> &v, int start=0); - Matrix (std::initializer_list<double> initlist); + explicit Matrix (std::initializer_list<double> initlist); Matrix& set (double d); Matrix& set (const double *v, unsigned size); Matrix& set (const std::vector<double> &v, int start=0); diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.cpp index ca465adcc5b..dc8a8a78710 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.cpp @@ -2,7 +2,7 @@ ** Message.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -74,7 +74,7 @@ void MessageStream::putChar (char c, ostream &os) { _col++; } _nl = false; - if (!_nl || c != '\n') + if (c != '\n') os << c; } } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.hpp index afb93d94326..e552458d70e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.hpp @@ -2,7 +2,7 @@ ** Message.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/MessageException.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/MessageException.hpp index 1cfcb49e7dc..2baa4d98fe1 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/MessageException.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/MessageException.hpp @@ -2,7 +2,7 @@ ** MessageException.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.cpp index 7788bef3d9c..bf1bbf1ba49 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.cpp @@ -2,7 +2,7 @@ ** MetafontWrapper.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.hpp index 4ec5afd304c..cb54bba6a7f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.hpp @@ -2,7 +2,7 @@ ** MetafontWrapper.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.cpp index 1bbd40cae61..7da0342f9f6 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.cpp @@ -2,7 +2,7 @@ ** MiKTeXCom.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.hpp index b05b26a1322..b4d56b0365f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.hpp @@ -2,7 +2,7 @@ ** MiKTeXCom.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.cpp index 77af3d9d0c7..769dcabb910 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.cpp @@ -2,7 +2,7 @@ ** NoPsSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.hpp index b4af33ab6c9..099320fb9f5 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.hpp @@ -2,7 +2,7 @@ ** NoPsSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/NumericRanges.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/NumericRanges.hpp index 5102b715b07..6c0015609d6 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/NumericRanges.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/NumericRanges.hpp @@ -2,7 +2,7 @@ ** NumericRanges.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.cpp new file mode 100644 index 00000000000..058f794a863 --- /dev/null +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.cpp @@ -0,0 +1,59 @@ +/************************************************************************* +** Opacity.cpp ** +** ** +** This file is part of dvisvgm -- a fast DVI to SVG converter ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** +** ** +** 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 3 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 <http://www.gnu.org/licenses/>. ** +*************************************************************************/ + +#include "Opacity.hpp" + +using namespace std; + +string Opacity::cssBlendMode (BlendMode bm) { + switch (bm) { + case BM_NORMAL : return "normal"; + case BM_MULTIPLY : return "multiply"; + case BM_SCREEN : return "screen"; + case BM_OVERLAY : return "overlay"; + case BM_SOFTLIGHT : return "soft-light"; + case BM_HARDLIGHT : return "hard-light"; + case BM_COLORDODGE: return "color-dodge"; + case BM_COLORBURN : return "color-burn"; + case BM_DARKEN : return "darken"; + case BM_LIGHTEN : return "lighten"; + case BM_DIFFERENCE: return "difference"; + case BM_EXCLUSION : return "exclusion"; + case BM_HUE : return "hue"; + case BM_SATURATION: return "saturation"; + case BM_COLOR : return "color"; + case BM_LUMINOSITY: return "luminosity"; + } + return ""; +} + + +bool Opacity::operator == (const Opacity &opacity) const { + return opacity._fillalpha == _fillalpha + && opacity._strokealpha == _strokealpha + && opacity._blendMode == _blendMode; +} + + +bool Opacity::operator != (const Opacity &opacity) const { + return opacity._fillalpha != _fillalpha + || opacity._strokealpha != _strokealpha + || opacity._blendMode != _blendMode; +}
\ No newline at end of file diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.hpp new file mode 100644 index 00000000000..3d211b82bc3 --- /dev/null +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.hpp @@ -0,0 +1,75 @@ +/************************************************************************* +** Opacity.hpp ** +** ** +** This file is part of dvisvgm -- a fast DVI to SVG converter ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** +** ** +** 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 3 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 <http://www.gnu.org/licenses/>. ** +*************************************************************************/ + +#ifndef OPACITY_HPP +#define OPACITY_HPP + +#include <string> + +class OpacityAlpha { + public: + OpacityAlpha () =default; + OpacityAlpha (double constalpha, double shapealpha) : _constalpha(constalpha), _shapealpha(shapealpha) {} + void setConstAlpha (double alpha) { _constalpha = alpha;} + void setShapeAlpha (double shapealpha) {_shapealpha = shapealpha;} + double value () const {return _constalpha * _shapealpha;} + bool operator == (const OpacityAlpha &alpha) const {return alpha._constalpha == _constalpha && alpha._shapealpha == _shapealpha;} + bool operator != (const OpacityAlpha &alpha) const {return alpha._constalpha != _constalpha || alpha._shapealpha != _shapealpha;} + bool isOpaque () const {return _constalpha == 1.0 && _shapealpha == 1.0;} + + private: + double _constalpha=1.0; + double _shapealpha=1.0; +}; + +class Opacity { + public: + enum BlendMode { + BM_NORMAL, BM_MULTIPLY, BM_SCREEN, BM_OVERLAY, + BM_SOFTLIGHT, BM_HARDLIGHT, BM_COLORDODGE, BM_COLORBURN, + BM_DARKEN, BM_LIGHTEN, BM_DIFFERENCE, BM_EXCLUSION, + BM_HUE, BM_SATURATION, BM_COLOR, BM_LUMINOSITY + }; + + public: + Opacity () =default; + Opacity (OpacityAlpha fillalpha, OpacityAlpha strokealpha, BlendMode bm) : _fillalpha(fillalpha), _strokealpha(strokealpha), _blendMode(bm) {} + Opacity (OpacityAlpha fillalpha, OpacityAlpha strokealpha) : Opacity(fillalpha, strokealpha, BM_NORMAL) {} + explicit Opacity (BlendMode bm) : _blendMode(bm) {} + OpacityAlpha& fillalpha () {return _fillalpha;} + OpacityAlpha& strokealpha () {return _strokealpha;} + const OpacityAlpha& fillalpha () const {return _fillalpha;} + const OpacityAlpha& strokealpha () const {return _strokealpha;} + BlendMode blendMode () const {return _blendMode;} + void setBlendMode (BlendMode mode) {_blendMode = mode;} + std::string cssBlendMode () const {return cssBlendMode(_blendMode);} + static std::string cssBlendMode (BlendMode bm); + bool isFillDefault () const {return _fillalpha.isOpaque() && _blendMode == BM_NORMAL;} + bool isStrokeDefault () const {return _strokealpha.isOpaque() && _blendMode == BM_NORMAL;} + bool operator == (const Opacity &opacity) const; + bool operator != (const Opacity &opacity) const; + + private: + OpacityAlpha _fillalpha; + OpacityAlpha _strokealpha; + BlendMode _blendMode=BM_NORMAL; +}; + +#endif diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.cpp index aaf50886ec1..04b9fe661ca 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.cpp @@ -2,7 +2,7 @@ ** PDFParser.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.hpp index a342e740cdb..02cd7078e7d 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.hpp @@ -2,7 +2,7 @@ ** PDFParser.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFToSVG.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFToSVG.hpp index 91792689a20..4385612b69d 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFToSVG.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFToSVG.hpp @@ -2,7 +2,7 @@ ** PDFToSVG.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PSFilter.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PSFilter.hpp index 59a4565d1de..30ca0108096 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PSFilter.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PSFilter.hpp @@ -2,7 +2,7 @@ ** PSFilter.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.cpp index b82cec9b962..e796c760e33 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.cpp @@ -2,7 +2,7 @@ ** PSInterpreter.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -59,8 +59,10 @@ void PSInterpreter::init () { // in conjunction with -dDELAYBIND and -dWRITESYSTEMDICT. // Thus, -dDELAYSAFER (or -dNOSAFER) must be added. // https://www.ghostscript.com/doc/9.50/Use.htm#Safer - if (gsrev >= 950) + if (gsrev >= 950) { gsargs.emplace_back("-dDELAYSAFER"); + gsargs.emplace_back("-dALLOWPSTRANSPARENCY"); + } } _gs.init(gsargs.size(), gsargs.data(), this); _gs.set_stdio(input, output, error); @@ -130,7 +132,7 @@ bool PSInterpreter::execute (const char *str, size_t len, bool flush) { // feed Ghostscript with code chunks that are not larger than 64KB // => see documentation of gsapi_run_string_foo() const char *p=str; - while (PS_RUNNING && len > 0) { + while (_mode == PS_RUNNING && len > 0) { SignalHandler::instance().check(); size_t chunksize = min(len, (size_t)0xffff); _gs.run_string_continue(p, chunksize, 0, &status); @@ -279,6 +281,7 @@ void PSInterpreter::callActions (InputReader &in) { {"rotate", { 1, &PSActions::rotate}}, {"save", { 1, &PSActions::save}}, {"scale", { 2, &PSActions::scale}}, + {"setalphaisshape", { 1, &PSActions::setalphaisshape}}, {"setblendmode", { 1, &PSActions::setblendmode}}, {"setcolorspace", { 1, &PSActions::setcolorspace}}, {"setcmykcolor", { 4, &PSActions::setcmykcolor}}, @@ -286,7 +289,6 @@ void PSInterpreter::callActions (InputReader &in) { {"setfillconstantalpha", { 1, &PSActions::setfillconstantalpha}}, {"setgray", { 1, &PSActions::setgray}}, {"sethsbcolor", { 3, &PSActions::sethsbcolor}}, - {"setisshapealpha", { 1, &PSActions::setisshapealpha}}, {"setlinecap", { 1, &PSActions::setlinecap}}, {"setlinejoin", { 1, &PSActions::setlinejoin}}, {"setlinewidth", { 1, &PSActions::setlinewidth}}, @@ -309,7 +311,7 @@ void PSInterpreter::callActions (InputReader &in) { _rawData.clear(); in.skipSpace(); while (!in.eof()) { - _rawData.emplace_back(in.getString()); + _rawData.push_back(in.getString()); in.skipSpace(); } } @@ -320,14 +322,14 @@ void PSInterpreter::callActions (InputReader &in) { if (pcount < 0) { // variable number of parameters? in.skipSpace(); while (!in.eof()) { // read all available parameters - params.emplace_back(in.getString()); + params.push_back(in.getString()); in.skipSpace(); } } else { // fix number of parameters for (int i=0; i < pcount; i++) { in.skipSpace(); - params.emplace_back(in.getString()); + params.push_back(in.getString()); } } // convert parameter strings to doubles @@ -415,7 +417,7 @@ bool PSInterpreter::imageDeviceKnown (string deviceStr) { return false; deviceStr = deviceStr.substr(0, deviceStr.find(':')); // strip optional argument auto infos = getImageDeviceInfos(); - auto it = find_if(infos.begin(), infos.end(), [&](PSDeviceInfo &info) { + auto it = find_if(infos.begin(), infos.end(), [&](const PSDeviceInfo &info) { return info.name == deviceStr; }); return it != infos.end(); diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.hpp index 71454f696e1..b2e2616d5e1 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.hpp @@ -2,7 +2,7 @@ ** PSInterpreter.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -62,6 +62,7 @@ struct PSActions { virtual void rotate (std::vector<double> &p) =0; virtual void save (std::vector<double> &p) =0; virtual void scale (std::vector<double> &p) =0; + virtual void setalphaisshape (std::vector<double> &p) =0; virtual void setblendmode (std::vector<double> &p) =0; virtual void setcolorspace (std::vector<double> &p) =0; virtual void setcmykcolor (std::vector<double> &cmyk) =0; @@ -69,7 +70,6 @@ struct PSActions { virtual void setfillconstantalpha (std::vector<double> &p) =0; virtual void setgray (std::vector<double> &p) =0; virtual void sethsbcolor (std::vector<double> &hsb) =0; - virtual void setisshapealpha (std::vector<double> &p) =0; virtual void setlinecap (std::vector<double> &p) =0; virtual void setlinejoin (std::vector<double> &p) =0; virtual void setlinewidth (std::vector<double> &p) =0; @@ -114,6 +114,7 @@ class PSInterpreter { BoundingBox pdfPageBox (const std::string &fname, int pageno); const std::vector<std::string>& rawData () const {return _rawData;} bool setImageDevice (const std::string &deviceStr); + bool hasFullOpacitySupport () const {return _gs.revision() >= 952;} static std::vector<PSDeviceInfo> getImageDeviceInfos (); static void listImageDeviceInfos (std::ostream &os); static bool imageDeviceKnown (std::string deviceStr); diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.cpp index 135965299e6..6cebe7844d5 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.cpp @@ -2,7 +2,7 @@ ** PSPattern.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -106,8 +106,8 @@ unique_ptr<XMLElement> PSTilingPattern::createClipNode() const { * define the pattern graphic. */ unique_ptr<XMLElement> PSTilingPattern::createGroupNode () const { // add all succeeding path elements to this group - auto group = util::make_unique<XMLElement>("g"); - group->addAttribute("clip-path", XMLString("url(#pc")+XMLString(psID())+")"); + auto group = util::make_unique<SVGElement>("g"); + group->setClipPathUrl("pc"+XMLString(psID())); return group; } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.hpp index 62794317c21..ca152f8e2a3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.hpp @@ -2,7 +2,7 @@ ** PSPattern.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -40,6 +40,8 @@ class PSPattern { virtual int psID () const {return _id;} virtual std::string svgID () const; virtual void apply (SpecialActions &actions); + virtual void setColor (Color color) {} + virtual bool tiled () const =0; protected: explicit PSPattern (int id) : _id(id) {} @@ -54,6 +56,8 @@ class PSTilingPattern : public PSPattern { public: virtual XMLElement* getContainerNode () {return _groupNode.get();} void apply (SpecialActions &actions) override; + bool tiled () const override {return true;} + protected: PSTilingPattern (int id, BoundingBox &bbox, Matrix &matrix, double xstep, double ystep); @@ -82,7 +86,7 @@ class PSUncoloredTilingPattern final : public PSTilingPattern { public: PSUncoloredTilingPattern (int id, BoundingBox &bbox, Matrix &matrix, double xstep, double ystep); std::string svgID () const override; - void setColor (Color color) {_currentColor = color;} + void setColor (Color color) override {_currentColor = color;} void apply (SpecialActions &actions) override; protected: diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.cpp index 312b3eb6def..fb55435a95b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.cpp @@ -2,7 +2,7 @@ ** PSPreviewFilter.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.hpp index 62860b6932e..3ffe6ffdb14 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.hpp @@ -2,7 +2,7 @@ ** PSPreviewFilter.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.cpp index 46f27078214..4af8ff2bc41 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.cpp @@ -2,7 +2,7 @@ ** PageRanges.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.hpp index f03dfc51622..1a2de678a14 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.hpp @@ -2,7 +2,7 @@ ** PageRanges.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.cpp index 8b5c29445ba..2fcdd917fb6 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.cpp @@ -2,7 +2,7 @@ ** PageSize.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.hpp index 4eb4e5e201f..735b526bed9 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.hpp @@ -2,7 +2,7 @@ ** PageSize.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Pair.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Pair.hpp index 466e6fd8f29..44236717efe 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Pair.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Pair.hpp @@ -2,7 +2,7 @@ ** Pair.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.cpp index 864ccbaa123..42a9fcbc1a0 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.cpp @@ -2,7 +2,7 @@ ** PapersizeSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -58,7 +58,7 @@ void PapersizeSpecialHandler::storePaperSize (unsigned pageno, Length width, Len if (!_pageSizes.empty() && _pageSizes.back().first == pageno) _pageSizes.back().second = whpair; else - _pageSizes.emplace_back(PageSize(pageno, whpair)); + _pageSizes.emplace_back(pageno, whpair); } } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.hpp index 02599d8c32d..ab20a220919 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.hpp @@ -2,7 +2,7 @@ ** PapersizeSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.cpp index a36dc5d3dfc..b6a26c418e6 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.cpp @@ -2,7 +2,7 @@ ** PathClipper.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.hpp index 8ab9b48c4f0..93b3f6a3daa 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.hpp @@ -2,7 +2,7 @@ ** PathClipper.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.cpp index 6368d979756..f54b18de2d7 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.cpp @@ -2,7 +2,7 @@ ** PdfSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -95,7 +95,7 @@ static char prepare_mode (InputReader &ir) { void PdfSpecialHandler::preprocessPagesize (StreamInputReader &ir, SpecialActions &actions) { // add page sizes to collection of paper sizes in order to handle them equally SpecialHandler *handler = SpecialManager::instance().findHandlerByName("papersize"); - if (auto papersizeHandler = dynamic_cast<PapersizeSpecialHandler*>(handler)) { + if (auto papersizeHandler = static_cast<PapersizeSpecialHandler*>(handler)) { try { Length width, height; // parse parameter sequence of the form (name length)+ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.hpp index e7a18bacce2..53f9d945486 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.hpp @@ -2,7 +2,7 @@ ** PdfSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.cpp index ef862f02cc3..bdd3ff19016 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.cpp @@ -2,7 +2,7 @@ ** PreScanDVIReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.hpp index a0e5a5fc644..6d22f1bf246 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.hpp @@ -2,7 +2,7 @@ ** PreScanDVIReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.cpp index 2010b05db93..f89d5024181 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.cpp @@ -2,7 +2,7 @@ ** Process.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.hpp index 3e9417d7bb6..a0668c354fc 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.hpp @@ -2,7 +2,7 @@ ** Process.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.cpp index fbb43f38fbe..aa6c7461dc9 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.cpp @@ -2,7 +2,7 @@ ** PsSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -32,7 +32,7 @@ #include "PSPreviewFilter.hpp" #include "PsSpecialHandler.hpp" #include "SpecialActions.hpp" -#include "SVGTree.hpp" +#include "SVGElement.hpp" #include "TensorProductPatch.hpp" #include "TriangularPatch.hpp" #include "utility.hpp" @@ -81,11 +81,11 @@ void PsSpecialHandler::initgraphics () { _linecap = _linejoin = 0; // butt end caps and miter joins _miterlimit = 4; _xmlnode = _savenode = nullptr; - _isshapealpha = false; // opacity operators change constant component by default - _fillalpha = _strokealpha = {1, 1}; // set constant and shape opacity to non-transparent - _blendmode = 0; // "normal" mode (no blending) + _isshapealpha = false; // opacity operators change constant component by default + _opacity = Opacity(); _sx = _sy = _cos = 1.0; _pattern = nullptr; + _makingPattern = false; _patternEnabled = false; _currentcolor = Color::BLACK; _dashoffset = 0; @@ -287,7 +287,6 @@ bool PsSpecialHandler::process (const string &prefix, istream &is, SpecialAction return true; } - /** Handles a psfile/pdffile special which places an external EPS/PDF graphic * at the current DVI position. The lower left corner (llx,lly) of the * given bounding box is placed at the DVI position. @@ -366,16 +365,15 @@ void PsSpecialHandler::imgfile (FileType filetype, const string &fname, const ma matrix.scale(sx, sy).rotate(-angle).scale(hscale/100, vscale/100); // apply transformation attributes matrix.translate(x+hoffset, y-voffset); // move image to current DVI position matrix.lmultiply(_actions->getMatrix()); - // update bounding box BoundingBox bbox(0, 0, urx-llx, ury-lly); bbox.transform(matrix); _actions->embed(bbox); // insert element containing the image data - matrix.rmultiply(TranslationMatrix(-llx, -lly)); // move lower left corner of image to origin - if (!matrix.isIdentity()) - imgNode->addAttribute("transform", matrix.toSVG()); + if (filetype != FileType::PDF) + matrix.rmultiply(TranslationMatrix(-llx, -lly)); // move lower left corner of image to origin + imgNode->setTransform(matrix); _actions->svgTree().appendToPage(std::move(imgNode)); } // restore DVI position @@ -386,7 +384,7 @@ void PsSpecialHandler::imgfile (FileType filetype, const string &fname, const ma /** Returns path + basename of temporary bitmap images. */ -static string image_base_path (SpecialActions &actions) { +static string image_base_path (const SpecialActions &actions) { FilePath imgpath = actions.getSVGFilePath(actions.getCurrentPageNumber()); return FileSystem::tmpdir() + "/" + imgpath.basename() + "-tmp-"; } @@ -399,8 +397,8 @@ static string image_base_path (SpecialActions &actions) { * @param[in] bbox bounding box of the image * @param[in] clip if true, the image is clipped to its bounding box * @return pointer to the element or nullptr if there's no image data */ -unique_ptr<XMLElement> PsSpecialHandler::createImageNode (FileType type, const string &fname, int pageno, BoundingBox bbox, bool clip) { - unique_ptr<XMLElement> node; +unique_ptr<SVGElement> PsSpecialHandler::createImageNode (FileType type, const string &fname, int pageno, BoundingBox bbox, bool clip) { + unique_ptr<SVGElement> node; string pathstr; if (const char *path = FileFinder::instance().lookup(fname, false)) pathstr = FileSystem::ensureForwardSlashes(path); @@ -409,7 +407,7 @@ unique_ptr<XMLElement> PsSpecialHandler::createImageNode (FileType type, const s if (pathstr.empty()) Message::wstream(true) << "file '" << fname << "' not found\n"; else if (type == FileType::BITMAP || type == FileType::SVG) { - node = util::make_unique<XMLElement>("image"); + node = util::make_unique<SVGElement>("image"); node->addAttribute("x", 0); node->addAttribute("y", 0); node->addAttribute("width", bbox.width()); @@ -429,7 +427,7 @@ unique_ptr<XMLElement> PsSpecialHandler::createImageNode (FileType type, const s if (clip) rectclip = to_string(bbox.minX())+" "+to_string(bbox.minY())+" "+to_string(bbox.width())+" "+to_string(bbox.height())+" rectclip"; - node = util::make_unique<XMLElement>("g"); // put SVG nodes created from the EPS/PDF file in this group + node = util::make_unique<SVGElement>("g"); // put SVG nodes created from the EPS/PDF file in this group _xmlnode = node.get(); _psi.execute( "\n@beginspecial @setspecial" // enter special environment @@ -556,9 +554,8 @@ void PsSpecialHandler::setpagedevice (std::vector<double> &p) { _linewidth = 1; _linecap = _linejoin = 0; // butt end caps and miter joins _miterlimit = 4; - _isshapealpha = false; // opacity operators change constant component by default - _fillalpha = _strokealpha = {1, 1}; // set constant and shape opacity to non-transparent - _blendmode = 0; // "normal" mode (no blending) + _isshapealpha = false; // opacity operators change constant component by default + _opacity = Opacity(); _sx = _sy = _cos = 1.0; _pattern = nullptr; _currentcolor = Color::BLACK; @@ -613,14 +610,37 @@ void PsSpecialHandler::closepath (vector<double>&) { } -static string css_blendmode_name (int mode) { - static const array<const char*,16> modenames = {{ - "normal", "multiply", "screen", "overlay", "soft-light", "hard-light", "color-dodge", "color-burn", - "darken", "lighten", "difference", "exclusion", "hue", "saturation", "color", "luminosity" - }}; +void PsSpecialHandler::setblendmode (vector<double> &p) { + int mode = static_cast<int>(p[0]); + static const Opacity::BlendMode blendmodes[] = { + Opacity::BM_NORMAL, Opacity::BM_MULTIPLY, Opacity::BM_SCREEN, Opacity::BM_OVERLAY, + Opacity::BM_SOFTLIGHT, Opacity::BM_HARDLIGHT, Opacity::BM_COLORDODGE, Opacity::BM_COLORBURN, + Opacity::BM_DARKEN, Opacity::BM_LIGHTEN, Opacity::BM_DIFFERENCE, Opacity::BM_EXCLUSION, + Opacity::BM_HUE, Opacity::BM_SATURATION, Opacity::BM_COLOR, Opacity::BM_LUMINOSITY + }; if (mode < 0 || mode > 15) - return ""; - return modenames[mode]; + mode = Opacity::BM_NORMAL; + _opacity.setBlendMode(blendmodes[mode]); +} + + +void PsSpecialHandler::setfillconstantalpha (vector<double> &p) { + if (_isshapealpha) + _opacity.fillalpha().setShapeAlpha(p[0]); + else + _opacity.fillalpha().setConstAlpha(p[0]); + if (_actions) + _actions->setOpacity(_opacity); +} + + +void PsSpecialHandler::setstrokeconstantalpha (vector<double> &p) { + if (_isshapealpha) + _opacity.strokealpha().setShapeAlpha(p[0]); + else + _opacity.strokealpha().setConstAlpha(p[0]); + if (_actions) + _actions->setOpacity(_opacity); } @@ -639,18 +659,18 @@ void PsSpecialHandler::stroke (vector<double> &p) { } if (_clipStack.prependedPath()) _path.prepend(*_clipStack.prependedPath()); - unique_ptr<XMLElement> path; + unique_ptr<SVGElement> path; Pair<double> point; if (_path.isDot(point)) { // zero-length path? if (_linecap == 1) { // round line ends? => draw dot double x = point.x(); double y = point.y(); double r = _linewidth/2.0; - path = util::make_unique<XMLElement>("circle"); + path = util::make_unique<SVGElement>("circle"); path->addAttribute("cx", x); path->addAttribute("cy", y); path->addAttribute("r", r); - path->addAttribute("fill", _actions->getColor().svgColorString()); + path->setFillColor(_actions->getColor()); bbox = BoundingBox(x-r, y-r, x+r, y+r); } } @@ -661,35 +681,20 @@ void PsSpecialHandler::stroke (vector<double> &p) { ostringstream oss; _path.writeSVG(oss, SVGTree::RELATIVE_PATH_CMDS); - path = util::make_unique<XMLElement>("path"); + path = util::make_unique<SVGElement>("path"); path->addAttribute("d", oss.str()); - path->addAttribute("stroke", _actions->getColor().svgColorString()); - path->addAttribute("fill", "none"); - if (_linewidth != 1) - path->addAttribute("stroke-width", _linewidth); - if (_miterlimit != 4) - path->addAttribute("stroke-miterlimit", _miterlimit); - if (_linecap > 0) // default value is "butt", no need to set it explicitly - path->addAttribute("stroke-linecap", _linecap == 1 ? "round" : "square"); - if (_linejoin > 0) // default value is "miter", no need to set it explicitly - path->addAttribute("stroke-linejoin", _linecap == 1 ? "round" : "bevel"); - if (_strokealpha[0] < 1 || _strokealpha[1] < 1) - path->addAttribute("stroke-opacity", _strokealpha[0] * _strokealpha[1]); - if (_blendmode > 0 && _blendmode < 16) - path->addAttribute("style", "mix-blend-mode:"+css_blendmode_name(_blendmode)); - if (!_dashpattern.empty()) { - string patternStr; - for (double dashValue : _dashpattern) - patternStr += XMLString(dashValue)+","; - patternStr.pop_back(); - path->addAttribute("stroke-dasharray", patternStr); - if (_dashoffset != 0) - path->addAttribute("stroke-dashoffset", _dashoffset); - } + path->setStrokeColor(_actions->getColor()); + path->setNoFillColor(); + path->setStrokeWidth(_linewidth); + path->setStrokeMiterLimit(_miterlimit); + path->setStrokeLineCap(_linecap == 0 ? SVGElement::LC_BUTT : _linecap == 1 ? SVGElement::LC_ROUND : SVGElement::LC_SQUARE); + path->setStrokeLineJoin(_linejoin == 0 ? SVGElement::LJ_MITER : _linecap == 1 ? SVGElement::LJ_ROUND : SVGElement::LJ_BEVEL); + path->setStrokeOpacity(_opacity); + path->setStrokeDash(_dashpattern, _dashoffset); } - if (path && _clipStack.path() && !_savenode) { + if (path && _clipStack.path() && !_makingPattern) { // assign clipping path and clip bounding box - path->addAttribute("clip-path", XMLString("url(#clip")+XMLString(_clipStack.topID())+")"); + path->setClipPathUrl("clip"+XMLString(_clipStack.topID())); bbox.intersect(_clipStack.path()->computeBBox()); _clipStack.removePrependedPath(); } @@ -708,7 +713,7 @@ void PsSpecialHandler::stroke (vector<double> &p) { * @param[in] evenodd true: use even-odd fill algorithm, false: use nonzero fill algorithm */ void PsSpecialHandler::fill (vector<double> &p, bool evenodd) { _path.removeRedundantCommands(); - if ((_path.empty() && !_clipStack.prependedPath()) || !_actions) + if ((_path.empty() && !_clipStack.prependedPath()) || (_patternEnabled && !_pattern) || !_actions) return; // compute bounding box @@ -723,24 +728,20 @@ void PsSpecialHandler::fill (vector<double> &p, bool evenodd) { ostringstream oss; _path.writeSVG(oss, SVGTree::RELATIVE_PATH_CMDS); - unique_ptr<XMLElement> path = util::make_unique<XMLElement>("path"); + auto path = util::make_unique<SVGElement>("path"); path->addAttribute("d", oss.str()); if (_pattern) - path->addAttribute("fill", XMLString("url(#")+_pattern->svgID()+")"); - else if (_actions->getColor() != Color::BLACK || _savenode) - path->addAttribute("fill", _actions->getColor().svgColorString()); - if (_clipStack.path() && !_savenode) { // clip path active and not inside pattern definition? + path->setFillPatternUrl(XMLString(_pattern->svgID())); + else if (_actions->getColor() != Color::BLACK || _makingPattern) + path->setFillColor(_actions->getColor(), false); + if (_clipStack.path() && !_makingPattern) { // clip path active and not inside pattern definition? // assign clipping path and clip bounding box - path->addAttribute("clip-path", XMLString("url(#clip")+XMLString(_clipStack.topID())+")"); + path->setClipPathUrl("clip"+XMLString(_clipStack.topID())); bbox.intersect(_clipStack.path()->computeBBox()); _clipStack.removePrependedPath(); } - if (evenodd) // SVG default fill rule is "nonzero" algorithm - path->addAttribute("fill-rule", "evenodd"); - if (_fillalpha[0] < 1 || _fillalpha[1] < 1) - path->addAttribute("fill-opacity", _fillalpha[0] * _fillalpha[1]); - if (_blendmode > 0 && _blendmode < 16) - path->addAttribute("style", "mix-blend-mode:"+css_blendmode_name(_blendmode)); + path->setFillRule(evenodd ? SVGElement::FR_EVENODD : SVGElement::FR_NONZERO); + path->setFillOpacity(_opacity); if (_xmlnode) _xmlnode->append(std::move(path)); else { @@ -788,8 +789,8 @@ void PsSpecialHandler::image (std::vector<double> &p) { // if set, assign clipping path to image if (_clipStack.path()) { - auto group = util::make_unique<XMLElement>("g"); - group->addAttribute("clip-path", XMLString("url(#clip")+XMLString(_clipStack.topID())+")"); + auto group = util::make_unique<SVGElement>("g"); + group->setClipPathUrl("clip"+XMLString(_clipStack.topID())); group->append(std::move(image)); image = std::move(group); // handle the entire group as image to add } @@ -846,10 +847,9 @@ void PsSpecialHandler::makepattern (vector<double> &p) { switch (pattern_type) { case 0: // pattern definition completed - if (_savenode) { - _xmlnode = _savenode; - _savenode = nullptr; - } + _xmlnode = _savenode; + _savenode = nullptr; + _makingPattern = false; break; case 1: { // tiling pattern int id = static_cast<int>(p[1]); @@ -869,6 +869,7 @@ void PsSpecialHandler::makepattern (vector<double> &p) { _savenode = _xmlnode; _xmlnode = pattern->getContainerNode(); // insert the following SVG elements into this node _patterns[id] = std::move(pattern); + _makingPattern = true; break; } case 2: { @@ -891,13 +892,9 @@ void PsSpecialHandler::setpattern (vector<double> &p) { if (it == _patterns.end()) _pattern = nullptr; else { - if (auto pattern = dynamic_cast<PSUncoloredTilingPattern*>(it->second.get())) - pattern->setColor(color); + it->second->setColor(color); it->second->apply(*_actions); - if (auto pattern = dynamic_cast<PSTilingPattern*>(it->second.get())) - _pattern = pattern; - else - _pattern = nullptr; + _pattern = it->second->tiled() ? static_cast<PSTilingPattern*>(it->second.get()) : nullptr; } } @@ -961,16 +958,15 @@ void PsSpecialHandler::clip (Path path, bool evenodd) { intersectedPath.writeSVG(oss, SVGTree::RELATIVE_PATH_CMDS); } if (pathReplaced) { - auto pathElem = util::make_unique<XMLElement>("path"); + auto pathElem = util::make_unique<SVGElement>("path"); pathElem->addAttribute("d", oss.str()); - if (evenodd) - pathElem->addAttribute("clip-rule", "evenodd"); + pathElem->setClipRule(evenodd ? SVGElement::FR_EVENODD : SVGElement::FR_NONZERO); int newID = _clipStack.topID(); - auto clipElem = util::make_unique<XMLElement>("clipPath"); + auto clipElem = util::make_unique<SVGElement>("clipPath"); clipElem->addAttribute("id", XMLString("clip")+XMLString(newID)); if (!COMPUTE_CLIPPATHS_INTERSECTIONS && oldID) - clipElem->addAttribute("clip-path", XMLString("url(#clip")+XMLString(oldID)+")"); + clipElem->setClipPathUrl("clip"+XMLString(oldID)); clipElem->append(std::move(pathElem)); _actions->svgTree().appendToDefs(std::move(clipElem)); @@ -1046,7 +1042,7 @@ void PsSpecialHandler::shfill (vector<double> ¶ms) { * @param[in,out] it iterator used to sequentially access the patch data * @param[out] points the points defining the geometry of the patch * @param[out] colors the colors assigned to the vertices of the patch */ -static void read_patch_data (ShadingPatch &patch, int edgeflag, +static void read_patch_data (const ShadingPatch &patch, int edgeflag, VectorIterator<double> &it, vector<DPair> &points, vector<Color> &colors) { // number of control points and colors required to define a single patch @@ -1087,14 +1083,14 @@ class ShadingCallback : public ShadingPatch::Callback { ShadingCallback (SpecialActions &actions, XMLElement *parent, int clippathID) : _actions(actions) { - auto group = util::make_unique<XMLElement>("g"); + auto group = util::make_unique<SVGElement>("g"); _group = group.get(); if (parent) parent->append(std::move(group)); else actions.svgTree().appendToPage(std::move(group)); if (clippathID > 0) - _group->addAttribute("clip-path", XMLString("url(#clip")+XMLString(clippathID)+")"); + _group->setClipPathUrl("clip"+XMLString(clippathID)); } void patchSegment (GraphicsPath<double> &path, const Color &color) override { @@ -1104,15 +1100,15 @@ class ShadingCallback : public ShadingPatch::Callback { // draw a single patch segment ostringstream oss; path.writeSVG(oss, SVGTree::RELATIVE_PATH_CMDS); - auto pathElem = util::make_unique<XMLElement>("path"); + auto pathElem = util::make_unique<SVGElement>("path"); pathElem->addAttribute("d", oss.str()); - pathElem->addAttribute("fill", color.svgColorString()); + pathElem->setFillColor(color); _group->append(std::move(pathElem)); } private: SpecialActions &_actions; - XMLElement *_group; + SVGElement *_group; }; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.hpp index efdd5dd238f..f4a9b333f4f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.hpp @@ -2,7 +2,7 @@ ** PsSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -28,12 +28,13 @@ #include <vector> #include "GraphicsPath.hpp" #include "PSInterpreter.hpp" -#include "SpecialHandler.hpp" +#include "Opacity.hpp" #include "PSPattern.hpp" #include "PSPreviewFilter.hpp" - +#include "SpecialHandler.hpp" class PSPattern; +class SVGElement; class XMLElement; class PsSpecialHandler : public SpecialHandler, protected PSActions { @@ -104,7 +105,7 @@ class PsSpecialHandler : public SpecialHandler, protected PSActions { void executeAndSync (std::istream &is, bool updatePos); void processHeaderFile (const char *fname); void imgfile (FileType type, const std::string &fname, const std::map<std::string,std::string> &attr); - std::unique_ptr<XMLElement> createImageNode (FileType type, const std::string &fname, int pageno, BoundingBox bbox, bool clip); + std::unique_ptr<SVGElement> createImageNode (FileType type, const std::string &fname, int pageno, BoundingBox bbox, bool clip); void dviBeginPage (unsigned int pageno, SpecialActions &actions) override; void dviEndPage (unsigned pageno, SpecialActions &actions) override; void clip (Path path, bool evenodd); @@ -138,14 +139,14 @@ class PsSpecialHandler : public SpecialHandler, protected PSActions { void rotate (std::vector<double> &p) override; void save (std::vector<double> &p) override; void scale (std::vector<double> &p) override; - void setblendmode (std::vector<double> &p) override {_blendmode = int(p[0]);} + void setalphaisshape (std::vector<double> &p) override { _isshapealpha = bool(p[0]);} + void setblendmode (std::vector<double> &p) override; void setcolorspace (std::vector<double> &p) override {_patternEnabled = bool(p[0]);} void setcmykcolor (std::vector<double> &cmyk) override; void setdash (std::vector<double> &p) override; - void setfillconstantalpha (std::vector<double> &p) override {_fillalpha[_isshapealpha ? 1 : 0] = p[0];} + void setfillconstantalpha (std::vector<double> &p) override; void setgray (std::vector<double> &p) override; void sethsbcolor (std::vector<double> &hsb) override; - void setisshapealpha (std::vector<double> &p) override {_isshapealpha = bool(p[0]);} void setlinecap (std::vector<double> &p) override {_linecap = uint8_t(p[0]);} void setlinejoin (std::vector<double> &p) override {_linejoin = uint8_t(p[0]);} void setlinewidth (std::vector<double> &p) override {_linewidth = scale(p[0] ? p[0] : 0.5);} @@ -155,7 +156,7 @@ class PsSpecialHandler : public SpecialHandler, protected PSActions { void setpagedevice (std::vector<double> &p) override; void setpattern (std::vector<double> &p) override; void setrgbcolor (std::vector<double> &rgb) override; - void setstrokeconstantalpha (std::vector<double> &p) override {_strokealpha[_isshapealpha ? 1 : 0] = p[0];} + void setstrokeconstantalpha (std::vector<double> &p) override; void shfill (std::vector<double> &p) override; void stroke (std::vector<double> &p) override; void translate (std::vector<double> &p) override; @@ -176,15 +177,14 @@ class PsSpecialHandler : public SpecialHandler, protected PSActions { double _cos; ///< cosine of angle between (1,0) and transform(1,0) double _linewidth; ///< current line width in bp units double _miterlimit; ///< current miter limit in bp units - bool _isshapealpha; ///< if true, opacity operators act on index 1 (shape component), otherwise on index 0 (constant component) - std::array<double,2> _fillalpha; ///< constant and shape opacity used for fill operations (0=fully transparent, ..., 1=opaque) - std::array<double,2> _strokealpha; ///< constant and shape opacity used for stroke operations (0=fully transparent, ..., 1=opaque) - int _blendmode; ///< blend mode used when overlaying colored areas + bool _isshapealpha; ///< if true, opacity operators act on shape component, otherwise on constant component + Opacity _opacity; uint8_t _linecap : 2; ///< current line cap (0=butt, 1=round, 2=projecting square) uint8_t _linejoin : 2; ///< current line join (0=miter, 1=round, 2=bevel) double _dashoffset; ///< current dash offset std::vector<double> _dashpattern; ClippingStack _clipStack; + bool _makingPattern=false; ///< true if executing makepattern operator std::map<int, std::unique_ptr<PSPattern>> _patterns; PSTilingPattern *_pattern; ///< current pattern bool _patternEnabled; ///< true if active color space is a pattern diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.cpp index 3d208c8a8f9..8de4ff42bf8 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.cpp @@ -2,7 +2,7 @@ ** RangeMap.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -82,14 +82,14 @@ void RangeMap::addRange (uint32_t cmin, uint32_t cmax, uint32_t vmin) { Range range(cmin, cmax, vmin); if (_ranges.empty()) - _ranges.emplace_back(std::move(range)); + _ranges.push_back(std::move(range)); else { // check for simple cases that can be handled pretty fast Range &lrange = *_ranges.begin(); Range &rrange = *_ranges.rbegin(); if (cmin > rrange.max()) { // non-overlapping range at end of vector? if (!rrange.join(range)) - _ranges.emplace_back(std::move(range)); + _ranges.push_back(std::move(range)); } else if (cmax < lrange.min()) { // non-overlapping range at begin of vector? if (!lrange.join(range)) diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.hpp index 3f5cb7a6e5f..c1413464466 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.hpp @@ -2,7 +2,7 @@ ** RangeMap.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.cpp index 4ba6c88a7d3..567a2ceda58 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.cpp @@ -2,7 +2,7 @@ ** SVGCharHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -20,12 +20,12 @@ #include "SVGCharHandler.hpp" #include "utility.hpp" -#include "XMLNode.hpp" +#include "SVGElement.hpp" using namespace std; -void SVGCharHandler::setInitialContextNode (XMLElement *node) { +void SVGCharHandler::setInitialContextNode (SVGElement *node) { resetContextNode(); _initialContextNode = node; } @@ -34,9 +34,9 @@ void SVGCharHandler::setInitialContextNode (XMLElement *node) { /** Changes the context element. All following nodes will be appended to this node. * @param[in] node the new context node * @return bare pointer to the new context node or 0 if context hasn't changed */ -XMLElement* SVGCharHandler::pushContextNode (unique_ptr<XMLElement> node) { +SVGElement* SVGCharHandler::pushContextNode (unique_ptr<SVGElement> node) { if (node && (_contextNodeStack.empty() || node.get() != _contextNodeStack.top())) { - XMLElement *nodeptr = node.get(); + SVGElement *nodeptr = node.get(); contextNode()->append(std::move(node)); _contextNodeStack.push(nodeptr); return nodeptr; @@ -61,23 +61,22 @@ void SVGCharHandler::resetContextNode () { /** Creates and returns a new SVG text element. * @param[in] x current x coordinate * @param[in] y current y coordinate */ -unique_ptr<XMLElement> SVGCharTextHandler::createTextNode (double x, double y) const { +unique_ptr<SVGElement> SVGCharTextHandler::createTextNode (double x, double y) const { const Font *font = _font.get(); if (!font) return nullptr; - auto textNode = util::make_unique<XMLElement>("text"); + auto textNode = util::make_unique<SVGElement>("text"); if (_selectFontByClass) textNode->addAttribute("class", string("f")+XMLString(_fontnum)); else { textNode->addAttribute("font-family", font->name()); - textNode->addAttribute("font-size", XMLString(font->scaledSize())); - if (font->color() != Color::BLACK) - textNode->addAttribute("fill", font->color().svgColorString()); + textNode->addAttribute("font-size", font->scaledSize()); + textNode->setFillColor(font->color()); } if (_vertical) { textNode->addAttribute("writing-mode", "tb"); // align glyphs designed for horizontal layout properly - if (auto pf = dynamic_cast<const PhysicalFont*>(font)) { + if (auto pf = font_cast<const PhysicalFont*>(font)) { if (!pf->getMetrics()->verticalLayout()) { // alphabetic text designed for horizontal layout? x += pf->scaledAscent()/2.5; // move vertical baseline to the right by strikethrough offset textNode->addAttribute("glyph-orientation-vertical", 90); // ensure rotation @@ -86,7 +85,7 @@ unique_ptr<XMLElement> SVGCharTextHandler::createTextNode (double x, double y) c } textNode->addAttribute("x", x); textNode->addAttribute("y", y); - if (!_matrix.get().isIdentity()) - textNode->addAttribute("transform", _matrix.get().toSVG()); + if (!_matrix->isIdentity()) + textNode->addAttribute("transform", _matrix->toSVG()); return textNode; } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.hpp index 241b28b7ef8..157c1b6a64e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.hpp @@ -2,7 +2,7 @@ ** SVGCharHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -26,12 +26,15 @@ #include "Color.hpp" #include "Font.hpp" #include "Matrix.hpp" +#include "Opacity.hpp" template <typename T> class CharProperty { public: + CharProperty () =default; CharProperty (const T &v) : _value(v) {} + CharProperty (T &&v) : _value(std::move(v)) {} void set (const T &v) { if (v != _value) { @@ -40,10 +43,11 @@ class CharProperty { } } - const T& get () const {return _value;} - operator const T& () const {return _value;} - bool changed () const {return _changed;} - void changed (bool c) {_changed = c;} + const T& get () const {return _value;} + const T* operator -> () const {return &_value;} + operator const T& () const {return _value;} + bool changed () const {return _changed;} + void changed (bool c) {_changed = c;} private: T _value; @@ -51,7 +55,7 @@ class CharProperty { }; -class XMLElement; +class SVGElement; /** Base class for all character handlers. These handlers create SVG representations @@ -60,36 +64,39 @@ class SVGCharHandler { public: SVGCharHandler () : _matrix(1) {} virtual ~SVGCharHandler() =default; - virtual void setInitialContextNode (XMLElement *node); + virtual void setInitialContextNode (SVGElement *node); virtual void appendChar (uint32_t c, double x, double y) =0; virtual void notifyXAdjusted () {} virtual void notifyYAdjusted () {} - void setColor (const Color &color) {_color.set(color);} - void setFont (const Font &font, int id) {_font.set(&font); _fontnum = id;} - void setMatrix (const Matrix &matrix) {_matrix.set(matrix);} - void setVertical (bool vertical) {_vertical.set(vertical);} - Color getColor () const {return _color.get();} - const Font* getFont () const {return _font.get();} - const Matrix& getMatrix () const {return _matrix.get();} + void setColor (const Color &color) {_color.set(color);} + void setOpacity (const Opacity &opacity) {_opacity.set(opacity);} + void setFont (const Font &font, int id) {_font.set(&font); _fontnum = id;} + void setMatrix (const Matrix &matrix) {_matrix.set(matrix);} + void setVertical (bool vertical) {_vertical.set(vertical);} + Color getColor () const {return _color.get();} + const Opacity& getOpacity () const {return _opacity.get();} + const Font* getFont () const {return _font.get();} + const Matrix& getMatrix () const {return _matrix.get();} protected: virtual void resetContextNode (); - XMLElement* pushContextNode (std::unique_ptr<XMLElement> node); + SVGElement* pushContextNode (std::unique_ptr<SVGElement> node); void popContextNode (); - XMLElement* contextNode () const { + SVGElement* contextNode () const { return _contextNodeStack.empty() ? _initialContextNode : _contextNodeStack.top(); } CharProperty<Color> _color=Color::BLACK; ///< current color + CharProperty<Opacity> _opacity; ///< current opacity values CharProperty<const Font*> _font=0; ///< current font int _fontnum=0; ///< current font ID CharProperty<Matrix> _matrix; ///< current transformation CharProperty<bool> _vertical=false; ///< current writing mode private: - XMLElement *_initialContextNode= nullptr; ///< SVG element the generated character nodes are attached to - std::stack<XMLElement*> _contextNodeStack; + SVGElement *_initialContextNode= nullptr; ///< SVG element the generated character nodes are attached to + std::stack<SVGElement*> _contextNodeStack; }; @@ -99,7 +106,7 @@ class SVGCharTextHandler : public SVGCharHandler { explicit SVGCharTextHandler (bool selectFontByClass) : _selectFontByClass(selectFontByClass) {} protected: - std::unique_ptr<XMLElement> createTextNode (double x, double y) const; + std::unique_ptr<SVGElement> createTextNode (double x, double y) const; private: bool _selectFontByClass; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.cpp index 0a4666f5ae7..342571a1548 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.cpp @@ -2,7 +2,7 @@ ** SVGCharHandlerFactory.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.hpp index a43257bc158..bbb431c8cd3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.hpp @@ -2,7 +2,7 @@ ** SVGCharHandlerFactory.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.cpp index 02f83e8c999..8f973be293e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.cpp @@ -2,7 +2,7 @@ ** SVGCharPathHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -23,7 +23,7 @@ #include "FontManager.hpp" #include "SVGCharPathHandler.hpp" #include "utility.hpp" -#include "XMLNode.hpp" +#include "SVGElement.hpp" using namespace std; @@ -61,22 +61,23 @@ void SVGCharPathHandler::appendChar (uint32_t c, double x, double y) { // Glyphs of non-black fonts (e.g. defined in a XeTeX document) can't change their color. CharProperty<Color> &color = (_fontColor.get() != Color::BLACK) ? _fontColor : _color; bool applyColor = color.get() != Color::BLACK; - bool applyMatrix = !_matrix.get().isIdentity(); + bool applyMatrix = !_matrix->isIdentity(); + bool applyOpacity = !_opacity->isFillDefault(); if (!_groupNode) { color.changed(applyColor); _matrix.changed(applyMatrix); } - if (color.changed() || _matrix.changed()) { + if (color.changed() || _matrix.changed() || _opacity.changed()) { resetContextNode(); - if (applyColor || applyMatrix) { - _groupNode = pushContextNode(util::make_unique<XMLElement>("g")); - if (applyColor) - contextNode()->addAttribute("fill", color.get().svgColorString()); - if (applyMatrix) - contextNode()->addAttribute("transform", _matrix.get().toSVG()); + if (applyColor || applyMatrix || applyOpacity) { + _groupNode = pushContextNode(util::make_unique<SVGElement>("g")); + contextNode()->setFillColor(color); + contextNode()->setFillOpacity(_opacity->fillalpha()); + contextNode()->setTransform(_matrix); } color.changed(false); _matrix.changed(false); + _opacity.changed(false); } const Font *font = _font.get(); if (font->verticalLayout()) { @@ -84,12 +85,12 @@ void SVGCharPathHandler::appendChar (uint32_t c, double x, double y) { GlyphMetrics metrics; font->getGlyphMetrics(c, _vertical, metrics); x -= metrics.wl; - if (auto pf = dynamic_cast<const PhysicalFont*>(font)) { + if (auto pf = font_cast<const PhysicalFont*>(font)) { // Center glyph between top and bottom border of the TFM box. // This is just an approximation used until I find a way to compute // the exact location in vertical mode. GlyphMetrics exact_metrics; - pf->getExactGlyphBox(c, exact_metrics, false); + pf->getExactGlyphBox(c, exact_metrics, false, nullptr); y += exact_metrics.h+(metrics.d-exact_metrics.h-exact_metrics.d)/2; } else @@ -109,28 +110,27 @@ void SVGCharPathHandler::appendChar (uint32_t c, double x, double y) { void SVGCharPathHandler::appendUseElement (uint32_t c, double x, double y, const Matrix &matrix) { string id = "#g" + to_string(FontManager::instance().fontID(_font)) + "-" + to_string(c); - auto useNode = util::make_unique<XMLElement>("use"); - useNode->addAttribute("x", XMLString(x)); - useNode->addAttribute("y", XMLString(y)); + auto useNode = util::make_unique<SVGElement>("use"); + useNode->addAttribute("x", x); + useNode->addAttribute("y", y); useNode->addAttribute("xlink:href", id); - if (!matrix.isIdentity()) - useNode->addAttribute("transform", matrix.toSVG()); + useNode->setFillOpacity(_opacity->blendMode()); // add blend mode style here because it's not inheritable + useNode->setTransform(matrix); contextNode()->append(std::move(useNode)); } void SVGCharPathHandler::appendPathElement (uint32_t c, double x, double y, const Matrix &matrix) { Glyph glyph; - auto pf = dynamic_cast<const PhysicalFont*>(_font.get()); - if (pf && pf->getGlyph(c, glyph)) { + auto pf = font_cast<const PhysicalFont*>(_font.get()); + if (pf && pf->getGlyph(c, glyph, nullptr)) { double sx = pf->scaledSize()/pf->unitsPerEm(); double sy = -sx; ostringstream oss; glyph.writeSVG(oss, _relativePathCommands, sx, sy, x, y); - auto glyphNode = util::make_unique<XMLElement>("path"); + auto glyphNode = util::make_unique<SVGElement>("path"); glyphNode->addAttribute("d", oss.str()); - if (!matrix.isIdentity()) - glyphNode->addAttribute("transform", matrix.toSVG()); + glyphNode->setTransform(matrix); contextNode()->append(std::move(glyphNode)); } } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.hpp index a70bf293465..01b2ac5ae0d 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.hpp @@ -2,7 +2,7 @@ ** SVGCharPathHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -39,7 +39,7 @@ class SVGCharPathHandler : public SVGCharHandler { private: AppendMethod _appendChar; ///< method called to append a single character bool _relativePathCommands; ///< if true, create relative rather than absolute SVG path commands - XMLElement *_groupNode=nullptr; ///< current group node taking the path elements + SVGElement *_groupNode=nullptr; ///< current group node taking the path elements CharProperty<Color> _fontColor=Color::BLACK; ///< color of current font }; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.cpp index 772dee12954..c17b8bd1809 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.cpp @@ -2,7 +2,7 @@ ** SVGCharTspanTextHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -20,7 +20,7 @@ #include "SVGCharTspanTextHandler.hpp" #include "utility.hpp" -#include "XMLNode.hpp" +#include "SVGElement.hpp" using namespace std; @@ -36,9 +36,10 @@ void SVGCharTspanTextHandler::appendChar (uint32_t c, double x, double y) { if (!_textNode || _font.changed() || _matrix.changed() || _vertical.changed()) { resetContextNode(); _textNode = pushContextNode(createTextNode(x, y)); - _color.changed(true); // force creating tspan with color attribute if current color differs from font color + _color.changed(true); // force creating tspan with color attribute if current color differs from font color + _opacity.changed(true); // dito for opacity properties } - if (_tspanNode && (_xchanged || _ychanged || _color.changed())) { + if (_tspanNode && (_xchanged || _ychanged || _color.changed() || _opacity.changed())) { // if drawing position or color was explicitly changed, finish current tspan element popContextNode(); _tspanNode = nullptr; @@ -46,15 +47,18 @@ void SVGCharTspanTextHandler::appendChar (uint32_t c, double x, double y) { // Apply text color changes only if the color of the entire font is black. // Glyphs of non-black fonts (e.g. defined in a XeTeX document) can't change their color. bool applyColor = _color.get() != Color::BLACK && _font.get()->color() == Color::BLACK; - if (_xchanged || _ychanged || (_color.changed() && applyColor)) { - _tspanNode = pushContextNode(util::make_unique<XMLElement>("tspan")); + bool applyOpacity = !_opacity->isFillDefault(); + if (_xchanged || _ychanged || (_color.changed() && applyColor) || (_opacity.changed() && applyOpacity)) { + _tspanNode = pushContextNode(util::make_unique<SVGElement>("tspan")); if (applyColor) - _tspanNode->addAttribute("fill", _color.get().svgColorString()); + _tspanNode->setFillColor(_color); _color.changed(false); + _tspanNode->setFillOpacity(_opacity); + _opacity.changed(false); if (_xchanged) { if (_vertical) { // align glyphs designed for horizontal layout properly - if (auto pf = dynamic_cast<const PhysicalFont*>(_font.get())) + if (auto pf = font_cast<const PhysicalFont*>(_font.get())) if (!pf->getMetrics()->verticalLayout()) x += pf->scaledAscent()/2.5; // move vertical baseline to the right by strikethrough offset } @@ -70,7 +74,7 @@ void SVGCharTspanTextHandler::appendChar (uint32_t c, double x, double y) { } -void SVGCharTspanTextHandler::setInitialContextNode (XMLElement *node) { +void SVGCharTspanTextHandler::setInitialContextNode (SVGElement *node) { SVGCharHandler::setInitialContextNode(node); _textNode = _tspanNode = nullptr; _xchanged = _ychanged = false; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.hpp index 0357387d6c9..34443961c16 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.hpp @@ -2,7 +2,7 @@ ** SVGCharTspanTextHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -29,15 +29,15 @@ class SVGCharTspanTextHandler : public SVGCharTextHandler { void notifyXAdjusted () override {_xchanged = true;} void notifyYAdjusted() override {_ychanged = true;} void appendChar (uint32_t c, double x, double y) override; - void setInitialContextNode (XMLElement *node) override; + void setInitialContextNode (SVGElement *node) override; protected: void resetContextNode () override; private: bool _xchanged, _ychanged; - XMLElement *_textNode; - XMLElement *_tspanNode; + SVGElement *_textNode; + SVGElement *_tspanNode; }; #endif diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.cpp new file mode 100644 index 00000000000..78ffd36b505 --- /dev/null +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.cpp @@ -0,0 +1,153 @@ +/************************************************************************* +** SVGElement.cpp ** +** ** +** This file is part of dvisvgm -- a fast DVI to SVG converter ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** +** ** +** 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 3 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 <http://www.gnu.org/licenses/>. ** +*************************************************************************/ + +#include <sstream> +#include "Color.hpp" +#include "Matrix.hpp" +#include "Opacity.hpp" +#include "SVGElement.hpp" +#include "XMLString.hpp" + +using namespace std; + + +void SVGElement::setClipPathUrl (const string &url) { + if (!url.empty()) + addAttribute("clip-path", "url(#"+url+")"); +} + + +void SVGElement::setClipRule (FillRule rule) { + if (rule != FR_NONZERO) + addAttribute("clip-rule", "evenodd"); +} + + +void SVGElement::setFillColor (Color color, bool skipBlack) { + if (color != Color::BLACK || !skipBlack) + addAttribute("fill", color.svgColorString()); +} + + +void SVGElement::setFillOpacity (const Opacity &opacity) { + if (!opacity.isFillDefault()) { + setFillOpacity(opacity.fillalpha()); + setFillOpacity(opacity.blendMode()); + } +} + + +void SVGElement::setFillOpacity (const OpacityAlpha &alpha) { + if (!alpha.isOpaque()) + addAttribute("fill-opacity", alpha.value()); +} + + +void SVGElement::setFillOpacity (Opacity::BlendMode blendMode) { + if (blendMode != Opacity::BM_NORMAL) + addAttribute("style", "mix-blend-mode:"+Opacity::cssBlendMode(blendMode)); +} + + +void SVGElement::setFillRule (FillRule rule) { + if (rule != FR_NONZERO) + addAttribute("fill-rule", "evenodd"); +} + + +void SVGElement::setFillPatternUrl (const std::string &url) { + if (!url.empty()) + addAttribute("fill", "url(#" + url + ")"); +} + + +void SVGElement::setNoFillColor () { + addAttribute("fill", "none"); +} + + +void SVGElement::setPoints (const vector<DPair> &points) { + if (!points.empty()) { + ostringstream oss; + for (const DPair &p : points) + oss << XMLString(p.x()) << ' ' << XMLString(p.y()) << ' '; + string str = oss.str(); + str.pop_back(); + addAttribute("points", str); + } +} + + +void SVGElement::setStrokeColor (Color color) { + addAttribute("stroke", color.svgColorString()); +} + + +void SVGElement::setStrokeDash (const vector<double> &pattern, double offset) { + if (!pattern.empty()) { + string patternStr; + for (double dashValue : pattern) + patternStr += XMLString(dashValue)+" "; + patternStr.pop_back(); + addAttribute("stroke-dasharray", patternStr); + if (offset != 0) + addAttribute("stroke-dashoffset", offset); + } +} + + +void SVGElement::setStrokeLineCap (LineCap cap) { + if (cap != LC_BUTT) + addAttribute("stroke-linecap", cap == LC_ROUND ? "round" : "square"); +} + + +void SVGElement::setStrokeLineJoin (LineJoin join) { + if (join != LJ_MITER) + addAttribute("stroke-linejoin", join == LJ_BEVEL ? "bevel" : "round"); +} + + +void SVGElement::setStrokeMiterLimit (double limit) { + if (limit != 4) + addAttribute("stroke-miterlimit", limit); +} + + +void SVGElement::setStrokeOpacity (const Opacity &opacity) { + if (!opacity.isStrokeDefault()) { + if (!opacity.strokealpha().isOpaque()) + addAttribute("stroke-opacity", opacity.strokealpha().value()); + if (opacity.blendMode() != Opacity::BM_NORMAL) + addAttribute("style", "mix-blend-mode:"+opacity.cssBlendMode()); + } +} + + +void SVGElement::setStrokeWidth (double width) { + if (width != 1) + addAttribute("stroke-width", width); +} + + +void SVGElement::setTransform (const Matrix &matrix) { + if (!matrix.isIdentity()) + addAttribute("transform", matrix.toSVG()); +} diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.hpp new file mode 100644 index 00000000000..c326b79f879 --- /dev/null +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.hpp @@ -0,0 +1,60 @@ +/************************************************************************* +** SVGElement.hpp ** +** ** +** This file is part of dvisvgm -- a fast DVI to SVG converter ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** +** ** +** 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 3 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 <http://www.gnu.org/licenses/>. ** +*************************************************************************/ + +#ifndef SVGELEMENT_HPP +#define SVGELEMENT_HPP + +#include "XMLNode.hpp" + +class Color; +class Matrix; +class Opacity; + +class SVGElement : public XMLElement { + public: + enum FillRule {FR_EVENODD, FR_NONZERO}; + enum LineCap {LC_BUTT, LC_ROUND, LC_SQUARE}; + enum LineJoin {LJ_BEVEL, LJ_MITER, LJ_ROUND}; + + public: + explicit SVGElement (std::string name) : XMLElement(std::move(name)) {} + explicit SVGElement (const XMLElement &node) : XMLElement(node) {} + explicit SVGElement (XMLElement &&node) noexcept : XMLElement(std::move(node)) {} + void setClipPathUrl (const std::string &url); + void setClipRule (FillRule rule); + void setFillColor (Color color, bool skipBlack=true); + void setFillOpacity (const Opacity &opacity); + void setFillOpacity (const OpacityAlpha &alpha); + void setFillOpacity (Opacity::BlendMode blendMode); + void setFillPatternUrl (const std::string &url); + void setFillRule (FillRule rule); + void setNoFillColor (); + void setPoints (const std::vector<DPair> &points); + void setStrokeColor (Color color); + void setStrokeDash (const std::vector<double> &pattern, double offset=0); + void setStrokeLineCap (LineCap cap); + void setStrokeLineJoin (LineJoin join); + void setStrokeOpacity (const Opacity &opacity); + void setStrokeWidth (double width); + void setStrokeMiterLimit (double limit); + void setTransform (const Matrix &matrix); +}; + +#endif diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.cpp index 59a26764a7b..6ba41f1c7d3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.cpp @@ -2,7 +2,7 @@ ** SVGOutput.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -139,6 +139,11 @@ string SVGOutput::expandFormatString (string str, int page, int numPages, const } break; } + case 'n': + case 'N': + oss << (str[pos] == 'n' ? _fileNumber : _fileCount); + result += oss.str(); + break; case 'p': case 'P': oss << (str[pos] == 'p' ? page : numPages); diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.hpp index 96acf807e3e..a0ae43c68b1 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.hpp @@ -2,7 +2,7 @@ ** SVGOutput.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -60,6 +60,7 @@ class SVGOutput : public SVGOutputBase { std::ostream& getPageStream (int page, int numPages, const HashTriple &hash=HashTriple()) const override; FilePath filepath (int page, int numPages, const HashTriple &hash=HashTriple()) const override; bool ignoresHashes () const override; + void setFileNumbers (int fileNumber, int fileCount) {_fileNumber = fileNumber; _fileCount = fileCount;} protected: std::string expandFormatString (std::string str, int page, int numPages, const HashTriple &hashes) const; @@ -69,6 +70,8 @@ class SVGOutput : public SVGOutputBase { std::string _pattern; bool _stdout=true; ///< write to STDOUT? int _zipLevel=0; ///< compression level + int _fileNumber=1; ///< current number of file in sequence of files + int _fileCount=1; ///< number of files in sequence mutable int _page=-1; ///< number of current page being written mutable std::unique_ptr<std::ostream> _osptr; }; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.cpp index d61e298a017..84ba8591c11 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.cpp @@ -2,7 +2,7 @@ ** SVGSingleCharTextHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -19,7 +19,7 @@ *************************************************************************/ #include "SVGSingleCharTextHandler.hpp" -#include "XMLNode.hpp" +#include "SVGElement.hpp" using namespace std; @@ -29,9 +29,11 @@ void SVGSingleCharTextHandler::appendChar (uint32_t c, double x, double y) { textNode->append(XMLString(font->unicode(c), false)); // Apply color changes only if the color differs from black and if the font color itself is black. // Glyphs from non-black fonts (e.g. defined in a XeTeX document) can't change their color. - if (_color.get() != Color::BLACK && font->color() == Color::BLACK) { - textNode->addAttribute("fill", _color.get().svgColorString()); - _color.changed(false); - } + if (_color.get() != Color::BLACK && font->color() == Color::BLACK) + textNode->setFillColor(_color); + _color.changed(false); + if (!_opacity->isFillDefault()) + textNode->setFillOpacity(_opacity); + _opacity.changed(false); contextNode()->append(std::move(textNode)); } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.hpp index 57f05a4b07d..c1cd48bc247 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.hpp @@ -2,7 +2,7 @@ ** SVGSingleCharTextHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.cpp index 372dd28bf22..8463ef08f15 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.cpp @@ -2,7 +2,7 @@ ** SVGTree.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -31,7 +31,6 @@ #include "SVGCharHandlerFactory.hpp" #include "SVGTree.hpp" #include "XMLDocument.hpp" -#include "XMLNode.hpp" #include "XMLString.hpp" using namespace std; @@ -55,7 +54,7 @@ SVGTree::SVGTree () : _charHandler(SVGCharHandlerFactory::createHandler()) { /** Clears the SVG tree and initializes the root element. */ void SVGTree::reset () { _doc.clear(); - auto rootNode = util::make_unique<XMLElement>("svg"); + auto rootNode = util::make_unique<SVGElement>("svg"); rootNode->addAttribute("version", "1.1"); rootNode->addAttribute("xmlns", "http://www.w3.org/2000/svg"); rootNode->addAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); @@ -111,20 +110,20 @@ bool SVGTree::setFontFormat (string formatstr) { /** Starts a new page. * @param[in] pageno number of new page */ void SVGTree::newPage (int pageno) { - auto pageNode = util::make_unique<XMLElement>("g"); + auto pageNode = util::make_unique<SVGElement>("g"); if (pageno >= 0) pageNode->addAttribute("id", string("page")+XMLString(pageno)); _charHandler->setInitialContextNode(pageNode.get()); _page = pageNode.get(); _root->append(std::move(pageNode)); - _defsContextStack = stack<XMLElement*>(); - _pageContextStack = stack<XMLElement*>(); + _defsContextStack = stack<SVGElement*>(); + _pageContextStack = stack<SVGElement*>(); } void SVGTree::appendToDefs (unique_ptr<XMLNode> node) { if (!_defs) { - auto defsNode = util::make_unique<XMLElement>("defs"); + auto defsNode = util::make_unique<SVGElement>("defs"); _defs = defsNode.get(); _root->prepend(std::move(defsNode)); } @@ -134,7 +133,7 @@ void SVGTree::appendToDefs (unique_ptr<XMLNode> node) { void SVGTree::appendToPage (unique_ptr<XMLNode> node) { - XMLElement *parent = _pageContextStack.empty() ? _page : _pageContextStack.top(); + SVGElement *parent = _pageContextStack.empty() ? _page : _pageContextStack.top(); parent->append(std::move(node)); _charHandler->setInitialContextNode(parent); } @@ -149,8 +148,7 @@ void SVGTree::prependToPage (unique_ptr<XMLNode> node) { void SVGTree::transformPage (const Matrix &usermatrix) { - if (!usermatrix.isIdentity()) - _page->addAttribute("transform", usermatrix.toSVG()); + _page->setTransform(usermatrix); } @@ -171,8 +169,8 @@ static unique_ptr<XMLElement> createGlyphNode (int c, const PhysicalFont &font, double extend = font.style() ? font.style()->extend : 1; glyphNode = util::make_unique<XMLElement>("glyph"); glyphNode->addAttribute("unicode", XMLString(font.unicode(c), false)); - glyphNode->addAttribute("horiz-adv-x", XMLString(font.hAdvance(c)*extend)); - glyphNode->addAttribute("vert-adv-y", XMLString(font.vAdvance(c))); + glyphNode->addAttribute("horiz-adv-x", font.hAdvance(c)*extend); + glyphNode->addAttribute("vert-adv-y", font.vAdvance(c)); string name = font.glyphName(c); if (!name.empty()) glyphNode->addAttribute("glyph-name", name); @@ -192,7 +190,7 @@ static unique_ptr<XMLElement> createGlyphNode (int c, const PhysicalFont &font, static string font_info (const Font &font) { ostringstream oss; - if (auto nf = dynamic_cast<const NativeFont*>(&font)) { + if (auto nf = font_cast<const NativeFont*>(&font)) { oss << nf->familyName() << ' ' << nf->styleName() << "; " << nf->filename(); if (nf->style()) { if (nf->style()->bold != 0) @@ -211,7 +209,7 @@ void SVGTree::appendFontStyles (const unordered_set<const Font*> &fonts) { if (CREATE_CSS && USE_FONTS && !fonts.empty() && _page) { map<int, const Font*> sortmap; for (const Font *font : fonts) - if (!dynamic_cast<const VirtualFont*>(font)) // skip virtual fonts + if (!font_cast<const VirtualFont*>(font)) // skip virtual fonts sortmap[FontManager::instance().fontID(font)] = font; ostringstream style; // add font style definitions in ascending order @@ -260,14 +258,14 @@ void SVGTree::append (const PhysicalFont &font, const set<int> &chars, GFGlyphTr auto fontNode = util::make_unique<XMLElement>("font"); string fontname = font.name(); fontNode->addAttribute("id", fontname); - fontNode->addAttribute("horiz-adv-x", XMLString(font.hAdvance())); + fontNode->addAttribute("horiz-adv-x", font.hAdvance()); auto faceNode = util::make_unique<XMLElement>("font-face"); faceNode->addAttribute("font-family", fontname); - faceNode->addAttribute("units-per-em", XMLString(font.unitsPerEm())); + faceNode->addAttribute("units-per-em", font.unitsPerEm()); if (!font.verticalLayout()) { - faceNode->addAttribute("ascent", XMLString(font.ascent())); - faceNode->addAttribute("descent", XMLString(font.descent())); + faceNode->addAttribute("ascent", font.ascent()); + faceNode->addAttribute("descent", font.descent()); } fontNode->append(std::move(faceNode)); for (int c : chars) @@ -297,8 +295,8 @@ void SVGTree::append (const PhysicalFont &font, const set<int> &chars, GFGlyphTr } -void SVGTree::pushDefsContext (unique_ptr<XMLElement> node) { - XMLElement *nodePtr = node.get(); +void SVGTree::pushDefsContext (unique_ptr<SVGElement> node) { + SVGElement *nodePtr = node.get(); if (_defsContextStack.empty()) appendToDefs(std::move(node)); else @@ -314,8 +312,8 @@ void SVGTree::popDefsContext () { /** Pushes a new context element that will take all following nodes added to the page. */ -void SVGTree::pushPageContext (unique_ptr<XMLElement> node) { - XMLElement *nodePtr = node.get(); +void SVGTree::pushPageContext (unique_ptr<SVGElement> node) { + SVGElement *nodePtr = node.get(); if (_pageContextStack.empty()) _page->append(std::move(node)); else diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.hpp index 84c9e111580..0669d47cef3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.hpp @@ -2,7 +2,7 @@ ** SVGTree.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -31,13 +31,14 @@ #include "GFGlyphTracer.hpp" #include "Matrix.hpp" #include "SVGCharHandler.hpp" +#include "SVGElement.hpp" #include "XMLDocument.hpp" -#include "XMLNode.hpp" class BoundingBox; class Color; class Font; class Matrix; +class Opacity; class PhysicalFont; class SVGTree { @@ -54,24 +55,26 @@ class SVGTree { void appendChar (int c, double x, double y) {_charHandler->appendChar(c, x, y);} void appendFontStyles (const std::unordered_set<const Font*> &fonts); void append (const PhysicalFont &font, const std::set<int> &chars, GFGlyphTracer::Callback *callback=nullptr); - void pushDefsContext (std::unique_ptr<XMLElement> node); + void pushDefsContext (std::unique_ptr<SVGElement> node); void popDefsContext (); - void pushPageContext (std::unique_ptr<XMLElement> node); + void pushPageContext (std::unique_ptr<SVGElement> node); void popPageContext (); void setBBox (const BoundingBox &bbox); void setFont (int id, const Font &font); static bool setFontFormat (std::string formatstr); - void setX (double x) {_charHandler->notifyXAdjusted();} - void setY (double y) {_charHandler->notifyYAdjusted();} - void setMatrix (const Matrix &m) {_charHandler->setMatrix(m);} + void setX (double x) {_charHandler->notifyXAdjusted();} + void setY (double y) {_charHandler->notifyYAdjusted();} + void setMatrix (const Matrix &m) {_charHandler->setMatrix(m);} void setColor (const Color &c); - void setVertical (bool state) {_charHandler->setVertical(state);} + void setOpacity (const Opacity &op) {_charHandler->setOpacity(op);} + void setVertical (bool state) {_charHandler->setVertical(state);} void transformPage (const Matrix &m); - Color getColor () const {return _charHandler->getColor();} - const Matrix& getMatrix () const {return _charHandler->getMatrix();} - XMLElement* rootNode () const {return _root;} - XMLElement* defsNode () const {return _defs;} - XMLElement* pageNode () const {return _page;} + Color getColor () const {return _charHandler->getColor();} + const Opacity& getOpacity () const {return _charHandler->getOpacity();} + const Matrix& getMatrix () const {return _charHandler->getMatrix();} + XMLElement* rootNode () const {return _root;} + XMLElement* defsNode () const {return _defs;} + XMLElement* pageNode () const {return _page;} protected: XMLCData* styleCDataNode (); @@ -88,11 +91,11 @@ class SVGTree { private: XMLDocument _doc; - XMLElement *_root, *_page, *_defs; + SVGElement *_root, *_page, *_defs; XMLCData *_styleCDataNode; std::unique_ptr<SVGCharHandler> _charHandler; - std::stack<XMLElement*> _defsContextStack; - std::stack<XMLElement*> _pageContextStack; + std::stack<SVGElement*> _defsContextStack; + std::stack<SVGElement*> _pageContextStack; }; #endif diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.cpp index a734c4c48b3..3a99b98e7cc 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.cpp @@ -2,7 +2,7 @@ ** ShadingPatch.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.hpp index 2a8103d0443..6999a817a33 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.hpp @@ -2,7 +2,7 @@ ** ShadingPatch.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.cpp index 129b010d729..230410e0778 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.cpp @@ -2,7 +2,7 @@ ** SignalHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.hpp index ef6a0a4e556..2ecef0960e5 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.hpp @@ -2,7 +2,7 @@ ** SignalHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.cpp index 55196c76ce8..478532de034 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.cpp @@ -2,7 +2,7 @@ ** SourceInput.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.hpp index 7d7a08c88fc..3d201c31d7f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.hpp @@ -2,7 +2,7 @@ ** SourceInput.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialActions.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialActions.hpp index 12e9c90ec12..df80ac434b7 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialActions.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialActions.hpp @@ -2,7 +2,7 @@ ** SpecialActions.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -27,6 +27,7 @@ #include "Color.hpp" #include "FilePath.hpp" #include "Matrix.hpp" +#include "Opacity.hpp" #include "SVGTree.hpp" class XMLElement; @@ -46,6 +47,8 @@ class SpecialActions { virtual const Matrix& getMatrix () const =0; virtual Matrix getPageTransformation () const {return Matrix(1);} virtual void setBgColor (const Color &color) =0; + virtual void setOpacity (const Opacity &opacity) =0; + virtual const Opacity& getOpacity () const =0; virtual const SVGTree& svgTree () const =0; SVGTree& svgTree () {return const_cast<SVGTree&>(const_cast<const SpecialActions*>(this)->svgTree());} virtual BoundingBox& bbox () =0; @@ -75,6 +78,8 @@ class EmptySpecialActions : public SpecialActions { void finishLine () override {} void setColor (const Color &color) override {} void setBgColor (const Color &color) override {} + void setOpacity (const Opacity &opacity) override {} + const Opacity& getOpacity () const override {return _svg.getOpacity();} Color getColor () const override {return Color::BLACK;} void setMatrix (const Matrix &m) override {} const Matrix& getMatrix () const override {return _matrix;} diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialHandler.hpp index 382f0e53d12..2beda4e7bb5 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialHandler.hpp @@ -2,7 +2,7 @@ ** SpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp index 68e1c68b515..fb78ffd57b1 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp @@ -2,7 +2,7 @@ ** SpecialManager.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.hpp index 76cdb3e2e66..c124994d2b4 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.hpp @@ -2,7 +2,7 @@ ** SpecialManager.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.cpp index 8924d885b52..f0e9bf8e5d3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.cpp @@ -2,7 +2,7 @@ ** StreamReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.hpp index 08a4fd36361..1a9d76abe15 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.hpp @@ -2,7 +2,7 @@ ** StreamReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.cpp index 21eefd1b9e1..59ee7ffe8be 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.cpp @@ -2,7 +2,7 @@ ** StreamWriter.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.hpp index 5128bbf7365..3e2dbda5103 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.hpp @@ -2,7 +2,7 @@ ** StreamWriter.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.cpp index 44f3bcaeb24..09a26076885 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.cpp @@ -2,7 +2,7 @@ ** Subfont.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -53,7 +53,7 @@ SubfontDefinition::SubfontDefinition (string name, const char *fpath) : _sfname( while (is && !isspace(is.peek())) id += char(is.get()); if (!id.empty()) { - auto state = _subfonts.emplace(pair<string,unique_ptr<Subfont>>(id, unique_ptr<Subfont>())); + auto state = _subfonts.emplace(id, unique_ptr<Subfont>()); if (state.second) // id was not present in map already state.first->second = unique_ptr<Subfont>(new Subfont(*this, state.first->first)); skip_mapping_data(is); diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.hpp index 961720a99cb..ac5359a84a2 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.hpp @@ -2,7 +2,7 @@ ** Subfont.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/System.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/System.cpp index 4f8b0a139cb..6baf5a40edf 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/System.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/System.cpp @@ -2,7 +2,7 @@ ** System.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/System.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/System.hpp index fb698d303bd..686c24af82d 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/System.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/System.hpp @@ -2,7 +2,7 @@ ** System.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp index 011e659dc93..37da112757a 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp @@ -2,7 +2,7 @@ ** TFM.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.hpp index 0bb881df8f2..ad242ad258d 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.hpp @@ -2,7 +2,7 @@ ** TFM.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.cpp index 6e8fbefd48d..d04cbf77b9c 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.cpp @@ -2,7 +2,7 @@ ** TTFAutohint.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.hpp index 3d774984c70..7739895c382 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.hpp @@ -2,7 +2,7 @@ ** TTFAutohint.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.cpp index 8c5d7448966..6a334b17119 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.cpp @@ -2,7 +2,7 @@ ** TensorProductPatch.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -63,7 +63,9 @@ void TensorProductPatch::setFirstMatrixColumn (DPair source[4][4], int col, bool * @param[in] edgeflag defines how to connect this patch with another one * @param[in] patch reference patch required if edgeflag > 0 */ void TensorProductPatch::setPoints (const PointVec &points, int edgeflag, ShadingPatch *patch) { - auto tpPatch = dynamic_cast<TensorProductPatch*>(patch); + TensorProductPatch *tpPatch = nullptr; + if (patch && patch->psShadingType() == psShadingType()) + tpPatch = static_cast<TensorProductPatch*>(patch); if (edgeflag > 0 && !tpPatch) throw ShadingException("missing preceding data in definition of tensor-product patch"); if ((edgeflag == 0 && points.size() != 16) || (edgeflag > 0 && points.size() != 12)) @@ -107,7 +109,9 @@ void TensorProductPatch::setPoints (const PointVec &points, int edgeflag, Shadin * @param[in] edgeflag defines how to connect this patch with another one * @param[in] patch reference patch required if edgeflag > 0 */ void TensorProductPatch::setColors(const ColorVec &colors, int edgeflag, ShadingPatch* patch) { - auto tpPatch = dynamic_cast<TensorProductPatch*>(patch); + TensorProductPatch *tpPatch = nullptr; + if (patch && patch->psShadingType() == psShadingType()) + tpPatch = static_cast<TensorProductPatch*>(patch); if (edgeflag > 0 && !tpPatch) throw ShadingException("missing preceding data in definition of tensor-product patch"); if ((edgeflag == 0 && colors.size() != 4) || (edgeflag > 0 && colors.size() != 2)) @@ -492,7 +496,9 @@ DPair CoonsPatch::valueAt (double u, double v) const { * @param[in] edgeflag defines how to connect this patch to another one * @param[in] patch reference patch required if edgeflag > 0 */ void CoonsPatch::setPoints (const PointVec &points, int edgeflag, ShadingPatch *patch) { - auto coonsPatch = dynamic_cast<CoonsPatch*>(patch); + CoonsPatch *coonsPatch = nullptr; + if (patch && patch->psShadingType() == psShadingType()) + coonsPatch = static_cast<CoonsPatch*>(patch); if (edgeflag > 0 && !coonsPatch) throw ShadingException("missing preceding data in definition of relative Coons patch"); if ((edgeflag == 0 && points.size() != 12) || (edgeflag > 0 && points.size() != 8)) @@ -529,7 +535,9 @@ void CoonsPatch::setPoints (const PointVec &points, int edgeflag, ShadingPatch * void CoonsPatch::setColors (const ColorVec &colors, int edgeflag, ShadingPatch *patch) { - auto coonsPatch = dynamic_cast<CoonsPatch*>(patch); + CoonsPatch *coonsPatch = nullptr; + if (patch && patch->psShadingType() == psShadingType()) + coonsPatch = static_cast<CoonsPatch*>(patch); if (edgeflag > 0 && !coonsPatch) throw ShadingException("missing preceding data in definition of relative Coons patch"); if ((edgeflag == 0 && colors.size() != 4) || (edgeflag > 0 && colors.size() != 2)) diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.hpp index 654271b90df..47a7d840a59 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.hpp @@ -2,7 +2,7 @@ ** TensorProductPatch.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.cpp index 274426443a1..1b5405a3421 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.cpp @@ -2,7 +2,7 @@ ** Terminal.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.hpp index f84d47b707a..e1a0ce38adc 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.hpp @@ -2,7 +2,7 @@ ** Terminal.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.cpp index 0a0b069e965..a29911c1731 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.cpp @@ -2,7 +2,7 @@ ** ToUnicodeMap.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.hpp index 806233e12f8..5db95e1f381 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.hpp @@ -2,7 +2,7 @@ ** ToUnicodeMap.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.cpp index 54034126db0..220accdcb40 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.cpp @@ -2,7 +2,7 @@ ** TpicSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -28,6 +28,7 @@ #include "InputReader.hpp" #include "GraphicsPath.hpp" #include "SpecialActions.hpp" +#include "SVGElement.hpp" #include "SVGTree.hpp" #include "TpicSpecialHandler.hpp" #include "utility.hpp" @@ -70,28 +71,32 @@ Color TpicSpecialHandler::fillColor (bool grayOnly) const { * @param[in] penwidth pen with used to compute the stroke parameters * @param[in] pencolor the drawing color * @param[in] ddist dash/dot distance of line in PS point units (0:solid line, >0:dashed line, <0:dotted line) */ -static void add_stroke_attribs (XMLElement *elem, double penwidth, Color pencolor, double ddist) { +static void add_stroke_attribs (SVGElement *elem, double penwidth, Color pencolor, double ddist) { if (penwidth > 0) { // attributes actually required? - elem->addAttribute("stroke", pencolor.svgColorString()); - elem->addAttribute("stroke-width", XMLString(penwidth)); + elem->setStrokeColor(pencolor); + elem->setStrokeWidth(penwidth); + vector<double> dasharray; if (ddist > 0) - elem->addAttribute("stroke-dasharray", XMLString(ddist)); - else if (ddist < 0) - elem->addAttribute("stroke-dasharray", XMLString(penwidth) + ' ' + XMLString(-ddist)); + dasharray.push_back(ddist); + else if (ddist < 0) { + dasharray.push_back(penwidth); + dasharray.push_back(-ddist); + } + elem->setStrokeDash(dasharray); } } -static unique_ptr<XMLElement> create_ellipse_element (double cx, double cy, double rx, double ry) { +static unique_ptr<SVGElement> create_ellipse_element (double cx, double cy, double rx, double ry) { bool is_circle = (rx == ry); - auto elem = util::make_unique<XMLElement>(is_circle ? "circle" : "ellipse"); - elem->addAttribute("cx", XMLString(cx)); - elem->addAttribute("cy", XMLString(cy)); + auto elem = util::make_unique<SVGElement>(is_circle ? "circle" : "ellipse"); + elem->addAttribute("cx", cx); + elem->addAttribute("cy", cy); if (is_circle) - elem->addAttribute("r", XMLString(rx)); + elem->addAttribute("r", rx); else { - elem->addAttribute("rx", XMLString(rx)); - elem->addAttribute("ry", XMLString(ry)); + elem->addAttribute("rx", rx); + elem->addAttribute("ry", ry); } return elem; } @@ -102,7 +107,7 @@ static unique_ptr<XMLElement> create_ellipse_element (double cx, double cy, doub * @param[in] actions object providing the actions that can be performed by the SpecialHandler */ void TpicSpecialHandler::drawLines (double ddist, SpecialActions &actions) { if (!_points.empty() && (_penwidth > 0 || _grayLevel >= 0) && !actions.outputLocked()) { - unique_ptr<XMLElement> elem; + unique_ptr<SVGElement> elem; if (_points.size() == 1) { const DPair &p = _points.back(); elem = create_ellipse_element(p.x()+actions.getX(), p.y()+actions.getY(), _penwidth/2.0, _penwidth/2.0); @@ -110,26 +115,27 @@ void TpicSpecialHandler::drawLines (double ddist, SpecialActions &actions) { } else { if (_points.size() == 2 || (_grayLevel < 0 && _points.front() != _points.back())) { - elem = util::make_unique<XMLElement>("polyline"); - elem->addAttribute("fill", "none"); - elem->addAttribute("stroke-linecap", "round"); + elem = util::make_unique<SVGElement>("polyline"); + elem->setNoFillColor(); + elem->setStrokeLineCap(SVGElement::LC_ROUND); } else { while (_points.front() == _points.back()) _points.pop_back(); - elem = util::make_unique<XMLElement>("polygon"); - elem->addAttribute("fill", _grayLevel < 0 ? "none" : fillColor(false).svgColorString()); + elem = util::make_unique<SVGElement>("polygon"); + if (_grayLevel < 0) + elem->setNoFillColor(); + else + elem->setFillColor(fillColor(false)); } - ostringstream oss; - for (auto it=_points.begin(); it != _points.end(); ++it) { - if (it != _points.begin()) - oss << ' '; - double x = it->x()+actions.getX(); - double y = it->y()+actions.getY(); - oss << XMLString(x) << ',' << XMLString(y); + vector<DPair> points; + for (const DPair &p : _points) { + double x = p.x()+actions.getX(); + double y = p.y()+actions.getY(); + points.emplace_back(x, y); actions.embed(DPair(x, y)); } - elem->addAttribute("points", oss.str()); + elem->setPoints(points); add_stroke_attribs(elem.get(), _penwidth, Color::BLACK, ddist); } actions.svgTree().appendToPage(std::move(elem)); @@ -175,8 +181,8 @@ void TpicSpecialHandler::drawSplines (double ddist, SpecialActions &actions) { path.lineto(p+_points[numPoints-1]); actions.embed(p+_points[numPoints-1]); } - auto pathElem = util::make_unique<XMLElement>("path"); - pathElem->addAttribute("fill", "none"); + auto pathElem = util::make_unique<SVGElement>("path"); + pathElem->setNoFillColor(); ostringstream oss; path.writeSVG(oss, SVGTree::RELATIVE_PATH_CMDS); pathElem->addAttribute("d", oss.str()); @@ -200,7 +206,7 @@ void TpicSpecialHandler::drawArc (double cx, double cy, double rx, double ry, do if ((_penwidth > 0 || _grayLevel >= 0) && !actions.outputLocked()) { cx += actions.getX(); cy += actions.getY(); - unique_ptr<XMLElement> elem; + unique_ptr<SVGElement> elem; bool closed=true; if (abs(angle2-angle1) >= math::TWO_PI) // closed ellipse? elem = create_ellipse_element(cx, cy, rx, ry); @@ -213,18 +219,21 @@ void TpicSpecialHandler::drawArc (double cx, double cy, double rx, double ry, do path.closepath(); else closed = false; - elem = util::make_unique<XMLElement>("path"); + elem = util::make_unique<SVGElement>("path"); ostringstream oss; path.writeSVG(oss, SVGTree::RELATIVE_PATH_CMDS); elem->addAttribute("d", oss.str()); } if (_penwidth > 0) { - elem->addAttribute("stroke-width", _penwidth); - elem->addAttribute("stroke", actions.getColor().svgColorString()); + elem->setStrokeWidth(_penwidth); + elem->setStrokeColor(actions.getColor()); if (!closed) - elem->addAttribute("stroke-linecap", "round"); + elem->setStrokeLineCap(SVGElement::LC_ROUND); } - elem->addAttribute("fill", _grayLevel < 0 ? "none" : fillColor(true).svgColorString()); + if (_grayLevel < 0) + elem->setNoFillColor(); + else + elem->setFillColor(fillColor(true)); actions.svgTree().appendToPage(std::move(elem)); double pw = _penwidth/2.0; actions.embed(BoundingBox(cx-rx-pw, cy-ry-pw, cx+rx+pw, cy+ry+pw)); @@ -296,7 +305,7 @@ bool TpicSpecialHandler::process (const string &prefix, istream &is, SpecialActi case cmd_id("pa"): { // add point to path double x = ir.getDouble()*mi2bp; double y = ir.getDouble()*mi2bp; - _points.emplace_back(DPair(x,y)); + _points.emplace_back(x, y); break; } case cmd_id("fp"): // draw solid lines through recorded points; close and fill path if fill color was defined diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.hpp index 8a9b458056f..a13613087db 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.hpp @@ -2,7 +2,7 @@ ** TpicSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.cpp index 76f58618396..41444b8b307 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.cpp @@ -2,7 +2,7 @@ ** TriangularPatch.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -31,7 +31,9 @@ TriangularPatch::TriangularPatch (const PointVec &points, const ColorVec &colors void TriangularPatch::setPoints (const PointVec &points, int edgeflag, ShadingPatch *patch) { - auto triangularPatch = dynamic_cast<TriangularPatch*>(patch); + TriangularPatch *triangularPatch = nullptr; + if (patch && patch->psShadingType() == psShadingType()) + triangularPatch = static_cast<TriangularPatch*>(patch); if (edgeflag > 0 && !triangularPatch) throw ShadingException("missing preceding data in definition of triangular patch"); if ((edgeflag == 0 && points.size() != 3) || (edgeflag > 0 && points.size() != 1)) @@ -62,7 +64,9 @@ void TriangularPatch::setPoints (const DPair &p1, const DPair &p2, const DPair & void TriangularPatch::setColors (const ColorVec &colors, int edgeflag, ShadingPatch *patch) { - auto triangularPatch = dynamic_cast<TriangularPatch*>(patch); + TriangularPatch *triangularPatch = nullptr; + if (patch && patch->psShadingType() == psShadingType()) + triangularPatch = static_cast<TriangularPatch*>(patch); if (edgeflag > 0 && !triangularPatch) throw ShadingException("missing preceding data in definition of triangular patch"); if ((edgeflag == 0 && colors.size() != 3) || (edgeflag > 0 && colors.size() != 1)) diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.hpp index 8d4453e5dbe..fc9c15e7fdf 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.hpp @@ -2,7 +2,7 @@ ** TriangularPatch.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.cpp index 945c20bd403..b642c169f41 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.cpp @@ -2,7 +2,7 @@ ** TrueTypeFont.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -56,7 +56,7 @@ bool TrueTypeFont::read (const string &fname) { if ((offset | length) > _buffer.size() || offset+length > _buffer.size()) return false; TTFTableRecord record = {tag, checksum, length, reinterpret_cast<const uint8_t*>(_buffer.data())+offset}; - _tableRecords.emplace_back(std::move(record)); + _tableRecords.push_back(std::move(record)); } return true; } @@ -94,7 +94,7 @@ void TrueTypeFont::writeWOFF (ostream &os) const { woffRecord.compressTableData(); woffSize += woffRecord.paddedSize(); ttfSize += ttfRecord.paddedSize(); - woffRecords.emplace_back(std::move(woffRecord)); + woffRecords.push_back(std::move(woffRecord)); } // write WOFF header StreamWriter writer(os); diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.hpp index a287f305faa..cc00001147f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.hpp @@ -2,7 +2,7 @@ ** TrueTypeFont.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.cpp index 5b7fb3d2388..af35bdf9bd5 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.cpp @@ -2,7 +2,7 @@ ** Unicode.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.hpp index 1547e3f7d40..75d0d0e2db4 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.hpp @@ -2,7 +2,7 @@ ** Unicode.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/VFActions.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/VFActions.hpp index 6939d8e710e..150a5510210 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/VFActions.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/VFActions.hpp @@ -2,7 +2,7 @@ ** VFActions.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.cpp index 6533333b5ea..7467b78d6b4 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.cpp @@ -2,7 +2,7 @@ ** VFReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.hpp index dabad674608..9d81745f7e3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.hpp @@ -2,7 +2,7 @@ ** VFReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorIterator.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorIterator.hpp index 9663490a196..49390c945a8 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorIterator.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorIterator.hpp @@ -2,7 +2,7 @@ ** VectorIterator.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -93,7 +93,7 @@ class VectorIterator { bool operator >= (const VectorIterator &it) const {return _pos >= it._pos;} bool operator < (const VectorIterator &it) const {return _pos < it._pos;} bool operator > (const VectorIterator &it) const {return _pos > it._pos;} - bool valid () const {return _pos >= 0 && _pos < _vector.size();} + bool valid () const {return _pos < _vector.size();} void invalidate () {_pos = _vector.size();} void reset () {_pos = 0;} diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorStream.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorStream.hpp index 22709803ca5..a8f2df5b191 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorStream.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorStream.hpp @@ -2,7 +2,7 @@ ** VectorStream.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.cpp index 992b01f3cf0..fc4651012c9 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.cpp @@ -2,7 +2,7 @@ ** XMLDocument.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -39,7 +39,7 @@ void XMLDocument::append (unique_ptr<XMLNode> node) { if (node->toElement()) _rootElement = util::static_unique_ptr_cast<XMLElement>(std::move(node)); else - _nodes.emplace_back(std::move(node)); + _nodes.push_back(std::move(node)); } } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.hpp index c6b56452264..e766580bc49 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.hpp @@ -2,7 +2,7 @@ ** XMLDocument.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.cpp index b71ac7e8074..743da58b93d 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.cpp @@ -2,7 +2,7 @@ ** XMLNode.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -107,7 +107,7 @@ void XMLElement::addAttribute (const string &name, const string &value) { if (Attribute *attr = getAttribute(name)) attr->value = value; else - _attributes.emplace_back(Attribute(name, value)); + _attributes.emplace_back(name, value); } @@ -387,12 +387,12 @@ ostream& XMLElement::write (ostream &os) const { os << '>'; // Insert newlines around children except text nodes. According to the // SVG specification, pure whitespace nodes are ignored by the SVG renderer. - if (WRITE_NEWLINES && !_firstChild->toText()) + if (WRITE_NEWLINES && name() != "text" && !_firstChild->toText()) os << '\n'; for (XMLNode *child = _firstChild.get(); child; child = child->next()) { child->write(os); if (!child->toText()) { - if (WRITE_NEWLINES && (!child->next() || !child->next()->toText())) + if (WRITE_NEWLINES && name() != "text" && (!child->next() || !child->next()->toText())) os << '\n'; } } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.hpp index ba9f68ad549..f1880352f20 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.hpp @@ -2,7 +2,7 @@ ** XMLNode.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -128,7 +128,7 @@ class XMLElement : public XMLNode { explicit XMLElement (std::string name); XMLElement (const XMLElement &node); XMLElement (XMLElement &&node) noexcept; - ~XMLElement (); + ~XMLElement () override; std::unique_ptr<XMLNode> clone () const override {return util::make_unique<XMLElement>(*this);} void clear () override; void addAttribute (const std::string &name, const std::string &value); diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.cpp index 72026bdd767..6ce89b3d869 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.cpp @@ -2,7 +2,7 @@ ** XMLString.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.hpp index 36ef2bee55c..832ac434681 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.hpp @@ -2,7 +2,7 @@ ** XMLString.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/XXHashFunction.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/XXHashFunction.hpp index 4478a2204cf..ecc2fd5f2bd 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/XXHashFunction.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/XXHashFunction.hpp @@ -2,7 +2,7 @@ ** XXHashFunction.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/ZLibOutputStream.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/ZLibOutputStream.hpp index a995dbf01e9..7537dcf41ed 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/ZLibOutputStream.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/ZLibOutputStream.hpp @@ -2,7 +2,7 @@ ** ZLibOutputStream.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/dvisvgm.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/dvisvgm.cpp index 15f15958353..089064a1b98 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/dvisvgm.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/dvisvgm.cpp @@ -2,7 +2,7 @@ ** dvisvgm.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -244,7 +244,7 @@ class VersionInfo { protected: void append (const string &name, const string &version) { - _versionPairs.emplace_back(pair<string,string>(name, version)); + _versionPairs.emplace_back(name, version); } private: @@ -349,7 +349,8 @@ static void set_variables (const CommandLine &cmdline) { string msg = "unknown font format '"+cmdline.fontFormatOpt.value()+"' (supported formats: "; for (const string &format : FontWriter::supportedFormats()) msg += format + ", "; - msg.erase(msg.end()-2); + msg.erase(msg.end()-2, msg.end()); + msg += ")"; throw CL::CommandLineException(msg); } SVGTree::CREATE_USE_ELEMENTS = cmdline.noFontsOpt.value() < 1; @@ -404,6 +405,46 @@ static void timer_message (double start_time, const pair<int,int> *pageinfo) { } +static void convert_file (size_t fnameIndex, const CommandLine &cmdline) { + const char *suffix = cmdline.epsOpt.given() ? "eps" : cmdline.pdfOpt.given() ? "pdf" : "dvi"; + string inputfile = ensure_suffix(cmdline.filenames()[fnameIndex], suffix); + SourceInput srcin(inputfile); + if (!srcin.getInputStream(true)) + throw MessageException("can't open file '" + srcin.getMessageFileName() + "' for reading"); + + double start_time = System::time(); + set_variables(cmdline); + SVGOutput out(cmdline.stdoutOpt.given() ? "" : srcin.getFileName(), + cmdline.outputOpt.value(), + cmdline.zipOpt.given() ? cmdline.zipOpt.value() : 0); + out.setFileNumbers(fnameIndex+1, cmdline.filenames().size()); + pair<int,int> pageinfo; + if (cmdline.epsOpt.given() || cmdline.pdfOpt.given()) { + auto img2svg = unique_ptr<ImageToSVG>( + cmdline.epsOpt.given() + ? static_cast<ImageToSVG*>(new EPSToSVG(srcin.getFilePath(), out)) + : static_cast<ImageToSVG*>(new PDFToSVG(srcin.getFilePath(), out))); + img2svg->setPageTransformation(get_transformation_string(cmdline)); + img2svg->convert(cmdline.pageOpt.value(), &pageinfo); + timer_message(start_time, img2svg->isSinglePageFormat() ? nullptr : &pageinfo); + } + else { + init_fontmap(cmdline); + DVIToSVG dvi2svg(srcin.getInputStream(), out); + if (!list_page_hashes(cmdline, dvi2svg)) { + const char *ignore_specials = nullptr; + if (cmdline.noSpecialsOpt.given()) + ignore_specials = cmdline.noSpecialsOpt.value().empty() ? "*" : cmdline.noSpecialsOpt.value().c_str(); + dvi2svg.setProcessSpecials(ignore_specials, true); + dvi2svg.setPageTransformation(get_transformation_string(cmdline)); + dvi2svg.setPageSize(cmdline.bboxOpt.value()); + dvi2svg.convert(cmdline.pageOpt.value(), &pageinfo); + timer_message(start_time, &pageinfo); + } + } +} + + int main (int argc, char *argv[]) { try { CommandLine cmdline; @@ -441,42 +482,9 @@ int main (int argc, char *argv[]) { throw MessageException("no input file given"); SignalHandler::instance().start(); - string inputfile = ensure_suffix(cmdline.filenames()[0], - cmdline.epsOpt.given() ? "eps" : cmdline.pdfOpt.given() ? "pdf" : "dvi"); - SourceInput srcin(inputfile); - if (!srcin.getInputStream(true)) - throw MessageException("can't open file '" + srcin.getMessageFileName() + "' for reading"); - - double start_time = System::time(); - set_variables(cmdline); - SVGOutput out(cmdline.stdoutOpt.given() ? "" : srcin.getFileName(), - cmdline.outputOpt.value(), - cmdline.zipOpt.given() ? cmdline.zipOpt.value() : 0); - pair<int,int> pageinfo; - if (cmdline.epsOpt.given() || cmdline.pdfOpt.given()) { - auto img2svg = unique_ptr<ImageToSVG>( - cmdline.epsOpt.given() - ? static_cast<ImageToSVG*>(new EPSToSVG(srcin.getFilePath(), out)) - : static_cast<ImageToSVG*>(new PDFToSVG(srcin.getFilePath(), out))); - img2svg->setPageTransformation(get_transformation_string(cmdline)); - img2svg->convert(cmdline.pageOpt.value(), &pageinfo); - timer_message(start_time, img2svg->isSinglePageFormat() ? nullptr : &pageinfo); - } - else { - init_fontmap(cmdline); - DVIToSVG dvi2svg(srcin.getInputStream(), out); - if (list_page_hashes(cmdline, dvi2svg)) - return 0; - const char *ignore_specials=nullptr; - if (cmdline.noSpecialsOpt.given()) - ignore_specials = cmdline.noSpecialsOpt.value().empty() ? "*" : cmdline.noSpecialsOpt.value().c_str(); - dvi2svg.setProcessSpecials(ignore_specials, true); - dvi2svg.setPageTransformation(get_transformation_string(cmdline)); - dvi2svg.setPageSize(cmdline.bboxOpt.value()); - - dvi2svg.convert(cmdline.pageOpt.value(), &pageinfo); - timer_message(start_time, &pageinfo); - } + size_t numFiles = cmdline.epsOpt.given() ? cmdline.filenames().size() : 1; + for (size_t i=0; i < numFiles; i++) + convert_file(i, cmdline); } catch (DVIException &e) { Message::estream() << "\nDVI error: " << e.what() << '\n'; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.c b/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.c index 4f89c2b6d19..7b6247366a2 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.c +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.c @@ -2,7 +2,7 @@ ** ffwrapper.c ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.h b/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.h index 6474d854a2c..2732a9f1d72 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.h @@ -2,7 +2,7 @@ ** ffwrapper.h ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/macros.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/macros.hpp index 907e402c8c9..489c4de0028 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/macros.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/macros.hpp @@ -2,7 +2,7 @@ ** macros.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.cpp index e5f3b955367..d36314aae41 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.cpp @@ -2,7 +2,7 @@ ** AttributeExtractor.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.hpp index c8ab6bd61a1..19cd4f0fed3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.hpp @@ -2,7 +2,7 @@ ** AttributeExtractor.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/DependencyGraph.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/DependencyGraph.hpp index 912d4a91107..bf1c1cc9737 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/DependencyGraph.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/DependencyGraph.hpp @@ -2,7 +2,7 @@ ** DependencyGraph.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.cpp index 47c0ac44ee5..03fc3ac1855 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.cpp @@ -2,7 +2,7 @@ ** GroupCollapser.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -24,10 +24,12 @@ #include <vector> #include "AttributeExtractor.hpp" #include "GroupCollapser.hpp" +#include "TransformSimplifier.hpp" #include "../XMLNode.hpp" using namespace std; +bool GroupCollapser::COMBINE_TRANSFORMS = true; const char* GroupCollapser::info () const { return "join nested group elements"; @@ -70,8 +72,9 @@ static void remove_ws_nodes (XMLElement *elem) { /** Recursively removes all redundant group elements from the given context element * and moves their attributes to the corresponding parent elements. - * @param[in] context root of the subtree to process */ -void GroupCollapser::execute (XMLElement *context) { + * @param[in] context root of the subtree to process + * @param[in] depth depth of tree node being processed (0 = root of local tree) */ +void GroupCollapser::execute (XMLElement *context, int depth) { if (!context) return; @@ -79,7 +82,7 @@ void GroupCollapser::execute (XMLElement *context) { while (child) { XMLNode *next=child->next(); if (XMLElement *childElement = child->toElement()) { - execute(childElement); + execute(childElement, depth+1); // check for groups without attributes and remove them if (childElement->name() == "g" && childElement->attributes().empty()) { remove_ws_nodes(childElement); @@ -97,6 +100,10 @@ void GroupCollapser::execute (XMLElement *context) { } } } + if (depth == 0 && COMBINE_TRANSFORMS && _transformCombined) { + TransformSimplifier().execute(context); + _transformCombined = false; + } } @@ -107,13 +114,16 @@ void GroupCollapser::execute (XMLElement *context) { * @return true if all attributes have been moved */ bool GroupCollapser::moveAttributes (XMLElement &source, XMLElement &dest) { vector<string> movedAttributes; - for (const XMLElement::Attribute &attr : source.attributes()) { + for (const auto &attr : source.attributes()) { if (attr.name == "transform") { string transform; - if (const char *destvalue = dest.getAttributeValue("transform")) + if (const char *destvalue = dest.getAttributeValue("transform")) { transform = destvalue+attr.value; - else + _transformCombined = true; + } + else { transform = attr.value; + } dest.addAttribute("transform", transform); movedAttributes.emplace_back("transform"); } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.hpp index 2694c4f3558..addf65b4aca 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.hpp @@ -2,7 +2,7 @@ ** GroupCollapser.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -26,11 +26,17 @@ class GroupCollapser : public OptimizerModule { public: void execute (XMLElement*, XMLElement *context) override {execute(context);}; - void execute (XMLElement *context); + void execute (XMLElement *context) {execute(context, 0);} const char* info () const override; + static bool COMBINE_TRANSFORMS; + protected: - static bool moveAttributes (XMLElement &source, XMLElement &dest); + void execute (XMLElement *context, int depth); + bool moveAttributes (XMLElement &source, XMLElement &dest); static bool collapsible (const XMLElement &elem); static bool unwrappable (const XMLElement &source, const XMLElement &dest); + + private: + bool _transformCombined=false; ///< true if transform attributes have been combined }; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/OptimizerModule.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/OptimizerModule.hpp index 91f0263bb86..94e4c743815 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/OptimizerModule.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/OptimizerModule.hpp @@ -2,7 +2,7 @@ ** OptimizerModule.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.cpp index f8d040a3299..7d34bbcd11d 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.cpp @@ -2,7 +2,7 @@ ** RedundantElementRemover.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.hpp index 52ce905c8eb..ce87bf4751f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.hpp @@ -2,7 +2,7 @@ ** RedundantElementRemover.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp index 8f9635a8365..9ff1b8163f3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp @@ -2,7 +2,7 @@ ** SVGOptimizer.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -51,15 +51,21 @@ void SVGOptimizer::execute () { return; if (MODULE_SEQUENCE.empty()) MODULE_SEQUENCE = "remove-clippath"; // default behaviour of previous dvisvgm releases - if (MODULE_SEQUENCE == "all") { - for (const auto &entry : _moduleEntries) - entry.module->execute(_svg->defsNode(), _svg->pageNode()); - } else { - vector<string> names = util::split(MODULE_SEQUENCE, ","); - for (const string &name : names) { - if (OptimizerModule *module = getModule(name)) - module->execute(_svg->defsNode(), _svg->pageNode()); + if (MODULE_SEQUENCE == "all") { + for (const auto &entry: _moduleEntries) + entry.module->execute(_svg->defsNode(), _svg->pageNode()); + } + else { + vector<string> names = util::split(MODULE_SEQUENCE, ","); + auto it = find_if(names.begin(), names.end(), [](const string &name) { + return name == "simplify-transform"; + }); + GroupCollapser::COMBINE_TRANSFORMS = (it != names.end()); + for (const string &name: names) { + if (OptimizerModule *module = getModule(name)) + module->execute(_svg->defsNode(), _svg->pageNode()); + } } } } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.hpp index b15723d9ea4..9cd9e64da3c 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.hpp @@ -2,7 +2,7 @@ ** SVGOptimizer.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.cpp index 72cb0c5bb5e..b07db7701b6 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.cpp @@ -2,7 +2,7 @@ ** TextSimplifier.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -39,7 +39,7 @@ static XMLElement::Attributes common_inheritable_attributes (const vector<XMLEle if (commonAttribs.empty()) { if (intersected) break; - for (const auto attrib : elem->attributes()) { + for (const auto &attrib : elem->attributes()) { if (AttributeExtractor::inheritable(attrib)) commonAttribs.push_back(attrib); } @@ -94,11 +94,11 @@ void TextSimplifier::execute (XMLElement *context) { vector<XMLElement::Attribute> attribs = common_inheritable_attributes(tspans); if (!tspans.empty() && !attribs.empty()) { // move all common tspan attributes to the parent text element - for (const XMLElement::Attribute &attr : attribs) + for (const auto &attr : attribs) context->addAttribute(attr.name, attr.value); // remove all common attributes from the tspan elements for (XMLElement *tspan : tspans) { - for (const XMLElement::Attribute &attr : attribs) + for (const auto &attr : attribs) tspan->removeAttribute(attr.name); // unwrap the tspan if there are no remaining attributes if (tspan->attributes().empty()) diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.hpp index 9ad3e0edb04..8908861366c 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.hpp @@ -2,7 +2,7 @@ ** TextSimplifier.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.cpp index ce0a6d8d7ae..3eca47fc3d3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.cpp @@ -2,7 +2,7 @@ ** TransformSimplifier.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.hpp index 10591dc271f..023c9655ea8 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.hpp @@ -2,7 +2,7 @@ ** TransformSimplifier.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.cpp index 09de2f19bbf..864c13905be 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.cpp @@ -2,7 +2,7 @@ ** WSNodeRemover.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.hpp index 438c21c8fdd..b050b523905 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.hpp @@ -2,7 +2,7 @@ ** WSNodeRemover.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/options.dtd b/Build/source/texk/dvisvgm/dvisvgm-src/src/options.dtd index 21c33a168a2..1b454e38502 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/options.dtd +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/options.dtd @@ -3,7 +3,7 @@ ** options.dtd ** ** ** ** This file is part of dvisvgm - a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/options.xml b/Build/source/texk/dvisvgm/dvisvgm-src/src/options.xml index 1d0d09e3d6d..d39dc17b9bd 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/options.xml +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/options.xml @@ -3,7 +3,7 @@ ** options.xml ** ** ** ** This file is part of dvisvgm - a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -26,7 +26,7 @@ <usage>--eps [options] epsfile</usage> <usage>--pdf [options] pdffile</usage> <description>This program converts DVI files, as created by TeX/LaTeX, as well as\nEPS and PDF files to the XML-based scalable vector graphics format SVG.</description> - <copyright>Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de></copyright> + <copyright>Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de></copyright> </program> <options> <section title="Input options"> diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/psdefs.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/psdefs.cpp index 40de4677d14..8feade148e2 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/psdefs.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/psdefs.cpp @@ -2,7 +2,7 @@ ** psdefs.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -115,47 +115,51 @@ const char *PSInterpreter::PSDEFS = "rgbcolor 3(setrgbcolor)prcmd}def/printgstate{@dodraw @GD/@nulldev get not and{" "matrix currentmatrix aload pop 6(setmatrix)prcmd applyscalevals currentlinewid" "th 1(setlinewidth)prcmd currentlinecap 1(setlinecap)prcmd currentlinejoin 1(se" -"tlinejoin)prcmd currentmiterlimit 1(setmiterlimit)prcmd prcolor currentdash ma" -"rk 3 1 roll exch aload length 1 add -1 roll counttomark(setdash)prcmd pop}if}d" -"ef/strconcat{exch dup length 2 index length add string dup dup 4 2 roll copy l" -"ength 4 -1 roll putinterval}def/setgstate{/setgstate sysexec printgstate}def/s" -"ave{@UD begin/@saveID vmstatus pop pop def end :save @saveID 1(save)prcmd}def/" -"restore{:restore @checknulldev printgstate @UD/@saveID known{@UD begin @saveID" -" end}{0}ifelse 1(restore)prcmd}def/gsave 0 defpr/grestore{:grestore @checknull" -"dev printgstate 0(grestore)prcmd}def/grestoreall{:grestoreall @checknulldev se" -"tstate 0(grestoreall)prcmd}def/rotate{dup type/arraytype ne @dodraw and{dup 1(" -"rotate)prcmd}if/rotate sysexec applyscalevals}def/scale{dup type/arraytype ne " -"@dodraw and{2 copy 2(scale)prcmd}if/scale sysexec applyscalevals}def/translate" -"{dup type/arraytype ne @dodraw and{2 copy 2(translate)prcmd}if/translate sysex" -"ec}def/setmatrix{dup/setmatrix sysexec @dodraw{aload pop 6(setmatrix)prcmd app" -"lyscalevals}{pop}ifelse}def/initmatrix{matrix setmatrix}def/concat{matrix curr" -"entmatrix matrix concatmatrix setmatrix}def/makepattern{gsave<</mx 3 -1 roll>>" -"begin<</XUID[1000000 @patcnt]>>copy mx/makepattern sysexec dup begin PatternTy" -"pe 2 lt{PatternType @patcnt BBox aload pop XStep YStep PaintType mx aload pop " -"15(makepattern)prcmd :newpath matrix setmatrix dup PaintProc 0 1(makepattern)p" -"rcmd @GD/@patcnt @patcnt 1 add put}if end end grestore}def/setpattern{begin Pa" -"tternType 1 eq{PaintType 1 eq{XUID aload pop exch pop 1}{:gsave[currentcolorsp" -"ace aload length -1 roll pop]/setcolorspace sysexec/setcolor sysexec XUID aloa" -"d pop exch pop currentrgbcolor :grestore 4}ifelse(setpattern)prcmd currentcolo" -"rspace 0 get/Pattern ne{[/Pattern currentcolorspace]/setcolorspace sysexec}if " -"currentcolorspace @setcolorspace}{/setpattern sysexec}ifelse end}def/setcolor{" -"dup type/dicttype eq{setpattern}{/setcolor sysexec/currentrgbcolor sysexec set" -"rgbcolor}ifelse}def/setcolorspace{dup/setcolorspace sysexec @setcolorspace}def" -"/@setcolorspace{dup type/arraytype eq{0 get}if/Pattern eq{1}{0}ifelse 1(setcol" -"orspace)prcmd}def/setgray 1 defpr/setcmykcolor 4 defpr/sethsbcolor 3 defpr/set" -"rgbcolor 3 defpr/.setalphaisshape{@SD/.setalphaisshape known{dup/.setalphaissh" -"ape sysexec}if{1}{0}ifelse 1(setisshapealpha)prcmd}bind def/.setfillconstantal" -"pha{@SD/.setfillconstantalpha known{dup/.setfillconstantalpha sysexec}if 1(set" -"fillconstantalpha)prcmd}bind def/.setstrokeconstantalpha{@SD/.setstrokeconstan" -"talpha known{dup/.setstrokeconstantalpha sysexec}if 1(setstrokeconstantalpha)p" -"rcmd}bind def/.setopacityalpha{false .setalphaisshape dup .setfillconstantalph" -"a .setstrokeconstantalpha}bind def/.setshapealpha{true .setalphaisshape dup .s" -"etfillconstantalpha .setstrokeconstantalpha}bind def/.setblendmode{dup/.setble" -"ndmode sysexec<</Normal 0/Compatible 0/Multiply 1/Screen 2/Overlay 3/SoftLight" -" 4/HardLight 5/ColorDodge 6/ColorBurn 7/Darken 8/Lighten 9/Difference 10/Exclu" -"sion 11/Hue 12/Saturation 13/Color 14/Luminosity 15/CompatibleOverprint 16>>ex" -"ch get 1(setblendmode)prcmd}def/@pdfpagecount{(r)file runpdfbegin pdfpagecount" -" runpdfend}def/@pdfpagebox{(r)file runpdfbegin dup dup 1 lt exch pdfpagecount " -"gt or{pop}{pdfgetpage/MediaBox pget pop aload pop}ifelse runpdfend}def DELAYBI" -"ND{.bindnow}if "; +"tlinejoin)prcmd currentmiterlimit 1(setmiterlimit)prcmd revision dup 952 lt{po" +"p}{.currentblendmode .setblendmode 952 eq{.currentopacityalpha .setopacityalph" +"a .currentshapealpha .setshapealpha}{.currentalphaisshape{1}{0}ifelse 1(setalp" +"haisshape)prcmd .currentstrokeconstantalpha 1(setstrokeconstantalpha)prcmd .cu" +"rrentfillconstantalpha 1(setfillconstantalpha)prcmd}ifelse}ifelse prcolor curr" +"entdash mark 3 1 roll exch aload length 1 add -1 roll counttomark(setdash)prcm" +"d pop}if}def/strconcat{exch dup length 2 index length add string dup dup 4 2 r" +"oll copy length 4 -1 roll putinterval}def/setgstate{/setgstate sysexec printgs" +"tate}def/save{@UD begin/@saveID vmstatus pop pop def end :save @saveID 1(save)" +"prcmd}def/restore{:restore @checknulldev printgstate @UD/@saveID known{@UD beg" +"in @saveID end}{0}ifelse 1(restore)prcmd}def/gsave 0 defpr/grestore{:grestore " +"@checknulldev printgstate 0(grestore)prcmd}def/grestoreall{:grestoreall @check" +"nulldev setstate 0(grestoreall)prcmd}def/rotate{dup type/arraytype ne @dodraw " +"and{dup 1(rotate)prcmd}if/rotate sysexec applyscalevals}def/scale{dup type/arr" +"aytype ne @dodraw and{2 copy 2(scale)prcmd}if/scale sysexec applyscalevals}def" +"/translate{dup type/arraytype ne @dodraw and{2 copy 2(translate)prcmd}if/trans" +"late sysexec}def/setmatrix{dup/setmatrix sysexec @dodraw{aload pop 6(setmatrix" +")prcmd applyscalevals}{pop}ifelse}def/initmatrix{matrix setmatrix}def/concat{m" +"atrix currentmatrix matrix concatmatrix setmatrix}def/makepattern{gsave<</mx 3" +" -1 roll>>begin<</XUID[1000000 @patcnt]>>copy mx/makepattern sysexec dup begin" +" PatternType 2 lt{PatternType @patcnt BBox aload pop XStep YStep PaintType mx " +"aload pop 15(makepattern)prcmd :newpath matrix setmatrix dup PaintProc 0 1(mak" +"epattern)prcmd @GD/@patcnt @patcnt 1 add put}if end end grestore}def/setpatter" +"n{dup begin PatternType end 1 eq{begin PaintType 1 eq{XUID aload pop exch pop " +"1}{:gsave[currentcolorspace aload length -1 roll pop]/setcolorspace sysexec/se" +"tcolor sysexec XUID aload pop exch pop currentrgbcolor :grestore 4}ifelse(setp" +"attern)prcmd currentcolorspace 0 get/Pattern ne{[/Pattern currentcolorspace]/s" +"etcolorspace sysexec}if currentcolorspace @setcolorspace end}{/setpattern syse" +"xec}ifelse}def/setcolor{dup type/dicttype eq{setpattern}{/setcolor sysexec/cur" +"rentrgbcolor sysexec setrgbcolor}ifelse}def/setcolorspace{dup/setcolorspace sy" +"sexec @setcolorspace}def/@setcolorspace{dup type/arraytype eq{0 get}if/Pattern" +" eq{1}{0}ifelse 1(setcolorspace)prcmd}def/setgray 1 defpr/setcmykcolor 4 defpr" +"/sethsbcolor 3 defpr/setrgbcolor 3 defpr/.setalphaisshape{@SD/.setalphaisshape" +" known{dup/.setalphaisshape sysexec}if{1}{0}ifelse 1(setalphaisshape)prcmd}bin" +"d def/.setfillconstantalpha{@SD/.setfillconstantalpha known{dup/.setfillconsta" +"ntalpha sysexec}if 1(setfillconstantalpha)prcmd}bind def/.setstrokeconstantalp" +"ha{@SD/.setstrokeconstantalpha known{dup/.setstrokeconstantalpha sysexec}if 1(" +"setstrokeconstantalpha)prcmd}bind def/.setopacityalpha{false .setalphaisshape " +"dup .setfillconstantalpha .setstrokeconstantalpha}bind def/.setshapealpha{true" +" .setalphaisshape dup .setfillconstantalpha .setstrokeconstantalpha}bind def/." +"setblendmode{dup/.setblendmode sysexec<</Normal 0/Compatible 0/Multiply 1/Scre" +"en 2/Overlay 3/SoftLight 4/HardLight 5/ColorDodge 6/ColorBurn 7/Darken 8/Light" +"en 9/Difference 10/Exclusion 11/Hue 12/Saturation 13/Color 14/Luminosity 15/Co" +"mpatibleOverprint 16>>exch get 1(setblendmode)prcmd}def/@pdfpagecount{(r)file " +"runpdfbegin pdfpagecount runpdfend}def/@pdfpagebox{(r)file runpdfbegin dup dup" +" 1 lt exch pdfpagecount gt or{pop}{pdfgetpage/MediaBox pget pop aload pop}ifel" +"se runpdfend}def DELAYBIND{.bindnow}if "; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.cpp index f702d67ce54..56f2c17ae7c 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.cpp @@ -2,7 +2,7 @@ ** utility.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -134,17 +134,17 @@ string util::replace (string str, const string &find, const string &repl) { vector<string> util::split (const string &str, const string &sep) { vector<string> parts; if (str.empty() || sep.empty()) - parts.emplace_back(str); + parts.push_back(str); else { size_t left=0; while (left <= str.length()) { size_t right = str.find(sep, left); if (right == string::npos) { - parts.emplace_back(str.substr(left)); + parts.push_back(str.substr(left)); left = string::npos; } else { - parts.emplace_back(str.substr(left, right-left)); + parts.push_back(str.substr(left, right-left)); left = right+sep.length(); } } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.hpp index ff8387a4190..9ab0d605420 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.hpp @@ -2,7 +2,7 @@ ** utility.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -25,6 +25,7 @@ #include <memory> #include <sstream> #include <string> +#include <type_traits> #include <vector> namespace math { @@ -145,6 +146,17 @@ std::unique_ptr<T> static_unique_ptr_cast (std::unique_ptr<U> &&old){ return std::unique_ptr<T>{static_cast<T*>(old.release())}; } +template <typename T> +struct set_const_of { + template <typename U> + struct by { + using type = typename std::conditional< + std::is_const<U>::value, + typename std::add_const<T>::type, + typename std::remove_const<T>::type + >::type; + }; +}; } // namespace util #endif diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/version.hpp.in b/Build/source/texk/dvisvgm/dvisvgm-src/src/version.hpp.in index 70d27f6e48d..7f673d167a4 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/version.hpp.in +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/version.hpp.in @@ -2,7 +2,7 @@ ** version.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/windows.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/windows.hpp index 5f71bbed1e4..2316f1a1cdf 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/windows.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/windows.hpp @@ -2,7 +2,7 @@ ** windows.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/BezierTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/BezierTest.cpp index aa86660d840..058342ca4d9 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/BezierTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/BezierTest.cpp @@ -2,7 +2,7 @@ ** BezierTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/BitmapTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/BitmapTest.cpp index 547988bf579..7fdb51073a6 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/BitmapTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/BitmapTest.cpp @@ -2,7 +2,7 @@ ** BitmapTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/BoundingBoxTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/BoundingBoxTest.cpp index 15c9ae0e00c..3d882679cfb 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/BoundingBoxTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/BoundingBoxTest.cpp @@ -2,7 +2,7 @@ ** BoundingBoxTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapManagerTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapManagerTest.cpp index 2456780e4ff..3b1fbbcf7c5 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapManagerTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapManagerTest.cpp @@ -2,7 +2,7 @@ ** CMapManagerTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapReaderTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapReaderTest.cpp index e890562f56a..7507910da51 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapReaderTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapReaderTest.cpp @@ -2,7 +2,7 @@ ** CMapReaderTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapTest.cpp index 1b95e31cce4..bbbf3ad0db2 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapTest.cpp @@ -2,7 +2,7 @@ ** CMapTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/CalculatorTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/CalculatorTest.cpp index 09945222d43..600a4f136d4 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/CalculatorTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/CalculatorTest.cpp @@ -2,7 +2,7 @@ ** CalculatorTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorSpecialTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorSpecialTest.cpp index 453ba09a207..7211ba07538 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorSpecialTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorSpecialTest.cpp @@ -2,7 +2,7 @@ ** ColorSpecialTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorTest.cpp index 116400ef917..aa5b18b716e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorTest.cpp @@ -2,7 +2,7 @@ ** ColorTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/CommandLineTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/CommandLineTest.cpp index e9149ffeb60..7e28c334cf8 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/CommandLineTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/CommandLineTest.cpp @@ -2,7 +2,7 @@ ** CommandLineTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/DVIReaderTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/DVIReaderTest.cpp index 9998ccfbccd..64735138763 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/DVIReaderTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/DVIReaderTest.cpp @@ -2,7 +2,7 @@ ** DVIReaderTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/DependencyGraphTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/DependencyGraphTest.cpp index 6246e357384..2f73c00bb15 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/DependencyGraphTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/DependencyGraphTest.cpp @@ -2,7 +2,7 @@ ** DependencyGraphTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/DirectoryTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/DirectoryTest.cpp index 7534cc498ca..2df574b06a8 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/DirectoryTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/DirectoryTest.cpp @@ -2,7 +2,7 @@ ** DirectoryTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/DvisvgmSpecialTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/DvisvgmSpecialTest.cpp index c7963b290c0..ba3c1fe739e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/DvisvgmSpecialTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/DvisvgmSpecialTest.cpp @@ -2,7 +2,7 @@ ** DvisvgmSpecialTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/EllipticalArcTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/EllipticalArcTest.cpp index 4e367a48044..babddde2155 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/EllipticalArcTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/EllipticalArcTest.cpp @@ -2,7 +2,7 @@ ** EllipticalArcTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/EmSpecialTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/EmSpecialTest.cpp index bfd3635b6db..57ed593ce8c 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/EmSpecialTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/EmSpecialTest.cpp @@ -2,7 +2,7 @@ ** EmSpecialTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -152,7 +152,7 @@ TEST_F(EmSpecialTest, vline) { handler.processSpecial("point 1, 10, 10"); handler.processSpecial("point 2, 100, 100"); handler.processSpecial("line 1v, 2v, 10bp"); // cut line ends vertically - EXPECT_EQ(recorder.getPageXML(), "<g id='page1'>\n<polygon points='10,17.07 10,2.93 100,92.93 100,107.07'/>\n</g>"); + EXPECT_EQ(recorder.getPageXML(), "<g id='page1'>\n<polygon points='10 17.07 10 2.93 100 92.93 100 107.07'/>\n</g>"); } @@ -160,7 +160,7 @@ TEST_F(EmSpecialTest, hline) { handler.processSpecial("point 1, 10, 10"); handler.processSpecial("point 2, 100, 100"); handler.processSpecial("line 1h, 2h, 10bp"); // cut line ends horizontally - EXPECT_EQ(recorder.getPageXML(), "<g id='page1'>\n<polygon points='2.93,10 17.07,10 107.07,100 92.93,100'/>\n</g>"); + EXPECT_EQ(recorder.getPageXML(), "<g id='page1'>\n<polygon points='2.93 10 17.07 10 107.07 100 92.93 100'/>\n</g>"); } @@ -168,14 +168,14 @@ TEST_F(EmSpecialTest, hvline) { handler.processSpecial("point 1, 10, 10"); handler.processSpecial("point 2, 100, 100"); handler.processSpecial("line 1h, 2v, 10bp"); // cut line ends horizontally - EXPECT_EQ(recorder.getPageXML(), "<g id='page1'>\n<polygon points='2.93,10 17.07,10 100,92.93 100,107.07'/>\n</g>"); + EXPECT_EQ(recorder.getPageXML(), "<g id='page1'>\n<polygon points='2.93 10 17.07 10 100 92.93 100 107.07'/>\n</g>"); recorder.clear(); recorder.setColor(Color(0.0, 0.0, 1.0)); handler.processSpecial("point 1, 10, 10"); handler.processSpecial("point 2, 100, 100"); handler.processSpecial("line 1v, 2h, 10bp"); // cut line ends horizontally - EXPECT_EQ(recorder.getPageXML(), "<g id='page1'>\n<polygon points='10,17.07 10,2.93 107.07,100 92.93,100' fill='#00f'/>\n</g>"); + EXPECT_EQ(recorder.getPageXML(), "<g id='page1'>\n<polygon points='10 17.07 10 2.93 107.07 100 92.93 100' fill='#00f'/>\n</g>"); } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileFinderTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileFinderTest.cpp index a19bbb3341c..07e4071d55c 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileFinderTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileFinderTest.cpp @@ -2,7 +2,7 @@ ** FileFinderTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/FilePathTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/FilePathTest.cpp index 5232016f452..75d7166a66f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/FilePathTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/FilePathTest.cpp @@ -2,7 +2,7 @@ ** FilePathTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -90,16 +90,27 @@ TEST(FilePathTest, file2) { } +TEST(FilePathTest, file3) { + FilePath fp("/f.ext", true, "/x/y"); + ASSERT_EQ(fp.absolute(), "/f.ext"); + ASSERT_EQ(fp.relative("/a/b"), "../../f.ext"); +} + + TEST(FilePathTest, autodetect) { FileSystem::chdir(SRCDIR); FilePath fp1("FilePathTest.cpp"); ASSERT_TRUE(fp1.isFile()); ASSERT_FALSE(fp1.empty()); string cwd = FileSystem::getcwd(); +#ifdef _WIN32 + if (cwd.length() >=2 && isalpha(cwd[0]) && cwd[1] == ':') + cwd[0] = tolower(cwd[0]); +#endif ASSERT_EQ(fp1.absolute(), cwd + "/FilePathTest.cpp") << "fp1=" << fp1.absolute(); FilePath fp2(""); ASSERT_FALSE(fp2.isFile()); ASSERT_FALSE(fp2.empty()); - ASSERT_EQ(fp2.absolute(), FileSystem::getcwd()); + ASSERT_EQ(fp2.absolute(), cwd); } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileSystemTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileSystemTest.cpp index 93fa58c2929..b0a392db3e7 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileSystemTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileSystemTest.cpp @@ -2,7 +2,7 @@ ** FileSystemTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontCacheTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontCacheTest.cpp index ab7d20ad972..56853ca73e6 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontCacheTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontCacheTest.cpp @@ -2,7 +2,7 @@ ** FontCacheTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontManagerTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontManagerTest.cpp index f2ea9b248a4..1d14478a4fa 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontManagerTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontManagerTest.cpp @@ -2,7 +2,7 @@ ** FontManagerTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -23,16 +23,23 @@ #include "Font.hpp" #include "FontManager.hpp" +#ifndef SRCDIR +#define SRCDIR "." +#endif + + class FontManagerTest : public ::testing::Test { public: FontManagerTest () : fm(FontManager::instance()) { fm.registerFont(10, "cmr10", 1274110073, 10, 10); fm.registerFont(11, "cmr10", 1274110073, 10, 12); fm.registerFont( 9, "cmr10", 1274110073, 10, 14); + fm.registerFont(12, SRCDIR"/data/lmmono12-regular.otf", 0, 12, _fontStyle, Color(.0, .0, 1.0)); } protected: FontManager &fm; + FontStyle _fontStyle; }; @@ -40,11 +47,12 @@ TEST_F(FontManagerTest, fontID1) { EXPECT_EQ(fm.fontID(10), 0); EXPECT_EQ(fm.fontID(11), 1); EXPECT_EQ(fm.fontID(9), 2); + EXPECT_EQ(fm.fontID(12), 3); EXPECT_EQ(fm.fontID(1), -1); } -TEST_F(FontManagerTest, font_ID2) { +TEST_F(FontManagerTest, fontID2) { EXPECT_EQ(fm.fontID("cmr10"), 0); } @@ -54,6 +62,7 @@ TEST_F(FontManagerTest, getFont) { EXPECT_TRUE(f1); EXPECT_EQ(f1->name(), "cmr10"); EXPECT_TRUE(dynamic_cast<const PhysicalFontImpl*>(f1)); + EXPECT_EQ(f1->color(), Color::BLACK); const Font *f2 = fm.getFont(11); EXPECT_TRUE(f2); @@ -61,11 +70,42 @@ TEST_F(FontManagerTest, getFont) { EXPECT_EQ(f2->name(), "cmr10"); EXPECT_TRUE(dynamic_cast<const PhysicalFontProxy*>(f2)); EXPECT_EQ(f2->uniqueFont(), f1); + EXPECT_EQ(f2->color(), Color::BLACK); + + const Font *f3 = fm.getFont(12); + EXPECT_TRUE(f3); + EXPECT_NE(f2, f3); + EXPECT_EQ(f3->name(), "nf0"); + EXPECT_TRUE(dynamic_cast<const NativeFontImpl*>(f3)); + EXPECT_TRUE(dynamic_cast<const PhysicalFont*>(f3)); + EXPECT_EQ(f3->uniqueFont(), f3); + EXPECT_EQ(f3->color(), Color(.0, .0, 1.0)); +} + + +TEST_F(FontManagerTest, font_cast) { + const Font *f1 = fm.getFont(10); + EXPECT_TRUE(f1); + EXPECT_EQ(font_cast<const PhysicalFont*>(f1), f1); + EXPECT_EQ(font_cast<const NativeFont*>(f1), nullptr); + EXPECT_EQ(font_cast<const VirtualFont*>(f1), nullptr); + + const Font *f2 = fm.getFont(11); + EXPECT_TRUE(f2); + EXPECT_EQ(font_cast<const PhysicalFont*>(f2), f2); + EXPECT_EQ(font_cast<const NativeFont*>(f1), nullptr); + EXPECT_EQ(font_cast<const VirtualFont*>(f1), nullptr); + + const Font *f3 = fm.getFont(12); + EXPECT_TRUE(f3); + EXPECT_EQ(font_cast<const PhysicalFont*>(f3), f3); + EXPECT_EQ(font_cast<const NativeFont*>(f3), f3); + EXPECT_EQ(font_cast<const VirtualFont*>(f3), nullptr); } TEST_F(FontManagerTest, getFontById) { EXPECT_EQ(fm.getFont(10), fm.getFontById(0)); EXPECT_EQ(fm.getFont("cmr10"), fm.getFontById(0)); + EXPECT_EQ(fm.getFont(12), fm.getFontById(3)); } - diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontMapTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontMapTest.cpp index 8f3e512feaa..9f88d4d1296 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontMapTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontMapTest.cpp @@ -2,7 +2,7 @@ ** FontMapTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFGlyphTracerTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFGlyphTracerTest.cpp index 071bccf5c64..4ec071c1747 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFGlyphTracerTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFGlyphTracerTest.cpp @@ -2,7 +2,7 @@ ** GFGlyphTracerTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFReaderTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFReaderTest.cpp index 82c11e9eecd..eb5246e175b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFReaderTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFReaderTest.cpp @@ -2,7 +2,7 @@ ** GFReaderTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/GhostscriptTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/GhostscriptTest.cpp index 359d99a8bf0..b01c08f52a1 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/GhostscriptTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/GhostscriptTest.cpp @@ -2,7 +2,7 @@ ** GhostscriptTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/GraphicsPathTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/GraphicsPathTest.cpp index 625314c08d5..feabb61dcb0 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/GraphicsPathTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/GraphicsPathTest.cpp @@ -2,7 +2,7 @@ ** GraphicsPathTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/HashFunctionTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/HashFunctionTest.cpp index bf56ebda2d0..26d6cf542cd 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/HashFunctionTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/HashFunctionTest.cpp @@ -2,7 +2,7 @@ ** HashFunctionTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/JFMReaderTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/JFMReaderTest.cpp index db6cb012f4b..65f807ef4b0 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/JFMReaderTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/JFMReaderTest.cpp @@ -2,7 +2,7 @@ ** JFMReaderTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/LengthTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/LengthTest.cpp index 4db8fe15d91..7c5edcc8ff0 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/LengthTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/LengthTest.cpp @@ -2,7 +2,7 @@ ** LengthTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.am b/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.am index ac841563f39..5582eaf412f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.am +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.am @@ -1,5 +1,5 @@ ## This file is part of dvisvgm -## Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> +## Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ## ## Process this file with automake. diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.in b/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.in index 61c6b3458e3..d6007f031be 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.in +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.in @@ -999,6 +999,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/MapLineTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/MapLineTest.cpp index 155d133e453..e49ba3bd95a 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/MapLineTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/MapLineTest.cpp @@ -2,7 +2,7 @@ ** MapLineTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/MatrixTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/MatrixTest.cpp index 8c7cb421ab1..18d6ae0855e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/MatrixTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/MatrixTest.cpp @@ -2,7 +2,7 @@ ** MatrixTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -48,12 +48,12 @@ TEST(MatrixTest, construct1) { TEST(MatrixTest, construct2) { - Matrix m1 = {1, 2, 3, 4, 5, 6, 7, 8, 9}; + Matrix m1{1, 2, 3, 4, 5, 6, 7, 8, 9}; for (int row=0; row < 3; row++) for (int col=0; col < 3; col++) ASSERT_EQ(m1.get(row, col), 3*row+col+1) << "row=" << row << ", col=" << col; - Matrix m2 = {1, 2, 3, 4, 5, 6}; + Matrix m2{1, 2, 3, 4, 5, 6}; for (int row=0; row < 2; row++) for (int col=0; col < 3; col++) ASSERT_EQ(m2.get(row, col), 3*row+col+1) << "row=" << row << ", col=" << col; diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/MessageExceptionTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/MessageExceptionTest.cpp index 396af63ad73..13ab01f1551 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/MessageExceptionTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/MessageExceptionTest.cpp @@ -2,7 +2,7 @@ ** MessageExceptionTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/PDFParserTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/PDFParserTest.cpp index 39ca9ca27a4..292d1df1776 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/PDFParserTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/PDFParserTest.cpp @@ -2,7 +2,7 @@ ** PDFParserTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/PSInterpreterTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/PSInterpreterTest.cpp index 09a014c98cc..74eed6959ff 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/PSInterpreterTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/PSInterpreterTest.cpp @@ -2,7 +2,7 @@ ** PSInterpreterTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -52,6 +52,7 @@ class PSTestActions : public PSActions { void rotate (vector<double> &p) override {print("rotate", p);} void save(std::vector<double> &p) override {print("save", p);} void scale (vector<double> &p) override {print("scale", p);} + void setalphaisshape (vector<double> &p) override {print("setalphaisshape", p);} void setblendmode (vector<double> &p) override {print("setblendmode", p);} void setcolorspace (vector<double> &p) override {print("setcolorspace", p);} void setcmykcolor (vector<double> &p) override {print("setcmykcolor", p);} @@ -59,7 +60,6 @@ class PSTestActions : public PSActions { void setfillconstantalpha (vector<double> &p) override {print("setfillconstantalpha", p);} void setgray (vector<double> &p) override {print("setgray", p);} void sethsbcolor (vector<double> &p) override {print("sethsbcolor", p);} - void setisshapealpha (vector<double> &p) override {print("setisshapealpha", p);} void setlinecap (vector<double> &p) override {print("setlinecap", p);} void setlinejoin (vector<double> &p) override {print("setlinejoin", p);} void setlinewidth (vector<double> &p) override {print("setlinewidth", p);} @@ -105,7 +105,10 @@ TEST(PSInterpreterTest, gsave_grestore) { actions.clear(); psi.execute("grestore "); - EXPECT_EQ(actions.result(), "setmatrix 1 0 0 1 0 0;applyscalevals 1 1 1;setlinewidth 1;setlinecap 0;setlinejoin 0;setmiterlimit 10;setcolorspace 0;setrgbcolor 0 0 0;setdash 0;grestore;"); + if (psi.hasFullOpacitySupport()) + EXPECT_EQ(actions.result(), "setmatrix 1 0 0 1 0 0;applyscalevals 1 1 1;setlinewidth 1;setlinecap 0;setlinejoin 0;setmiterlimit 10;setblendmode 0;setalphaisshape 0;setstrokeconstantalpha 1;setfillconstantalpha 1;setcolorspace 0;setrgbcolor 0 0 0;setdash 0;grestore;"); + else + EXPECT_EQ(actions.result(), "setmatrix 1 0 0 1 0 0;applyscalevals 1 1 1;setlinewidth 1;setlinecap 0;setlinejoin 0;setmiterlimit 10;setcolorspace 0;setrgbcolor 0 0 0;setdash 0;grestore;"); actions.clear(); psi.execute("1 setlinecap 5 setmiterlimit 0 1 0 setrgbcolor gsave 0 setlinecap 10 setmiterlimit "); @@ -113,7 +116,10 @@ TEST(PSInterpreterTest, gsave_grestore) { actions.clear(); psi.execute("grestore "); - EXPECT_EQ(actions.result(), "setmatrix 1 0 0 1 0 0;applyscalevals 1 1 1;setlinewidth 1;setlinecap 1;setlinejoin 0;setmiterlimit 5;setcolorspace 0;setrgbcolor 0 1 0;setdash 0;grestore;"); + if (psi.hasFullOpacitySupport()) + EXPECT_EQ(actions.result(), "setmatrix 1 0 0 1 0 0;applyscalevals 1 1 1;setlinewidth 1;setlinecap 1;setlinejoin 0;setmiterlimit 5;setblendmode 0;setalphaisshape 0;setstrokeconstantalpha 1;setfillconstantalpha 1;setcolorspace 0;setrgbcolor 0 1 0;setdash 0;grestore;"); + else + EXPECT_EQ(actions.result(), "setmatrix 1 0 0 1 0 0;applyscalevals 1 1 1;setlinewidth 1;setlinecap 1;setlinejoin 0;setmiterlimit 5;setcolorspace 0;setrgbcolor 0 1 0;setdash 0;grestore;"); } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageRagesTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageRagesTest.cpp index 8f7effc9f88..6b0e00878b3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageRagesTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageRagesTest.cpp @@ -2,7 +2,7 @@ ** PageRagesTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageSizeTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageSizeTest.cpp index ed997951b70..eb562e38bf0 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageSizeTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageSizeTest.cpp @@ -2,7 +2,7 @@ ** PageSizeTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/PairTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/PairTest.cpp index e5f502cdbc8..c53b270c6fc 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/PairTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/PairTest.cpp @@ -2,7 +2,7 @@ ** PairTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/PapersizeSpecialTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/PapersizeSpecialTest.cpp index 7cba1c18649..fae2cfcc5eb 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/PapersizeSpecialTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/PapersizeSpecialTest.cpp @@ -2,7 +2,7 @@ ** PapersizeSpecialTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/RangeMapTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/RangeMapTest.cpp index e9ca516d9cd..34ee95ebe67 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/RangeMapTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/RangeMapTest.cpp @@ -2,7 +2,7 @@ ** RangeMapTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/SVGOutputTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/SVGOutputTest.cpp index 79f89728e16..5544c7bfe2f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/SVGOutputTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/SVGOutputTest.cpp @@ -2,7 +2,7 @@ ** SVGOutputTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/ShadingPatchTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/ShadingPatchTest.cpp index 15e643f9773..066617c029f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/ShadingPatchTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/ShadingPatchTest.cpp @@ -2,7 +2,7 @@ ** ShadingPatchTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/SpecialManagerTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/SpecialManagerTest.cpp index 0ccaf5a1724..e3da75a417a 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/SpecialManagerTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/SpecialManagerTest.cpp @@ -2,7 +2,7 @@ ** SpecialManagerTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/SplittedCharInputBufferTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/SplittedCharInputBufferTest.cpp index 093b4c652ef..df5ec5d1d6d 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/SplittedCharInputBufferTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/SplittedCharInputBufferTest.cpp @@ -2,7 +2,7 @@ ** SplittedCharInputBufferTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamInputBufferTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamInputBufferTest.cpp index 845c5f22bab..1d9e7e31ced 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamInputBufferTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamInputBufferTest.cpp @@ -2,7 +2,7 @@ ** StreamInputBufferTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamReaderTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamReaderTest.cpp index 8a517be03c0..56d21d4da23 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamReaderTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamReaderTest.cpp @@ -2,7 +2,7 @@ ** StreamReaderTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamWriterTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamWriterTest.cpp index afddcfdfc27..a84d5cfb70e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamWriterTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamWriterTest.cpp @@ -2,7 +2,7 @@ ** StreamWriterTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/StringMatcherTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/StringMatcherTest.cpp index ca3072c7d34..e8979424d77 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/StringMatcherTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/StringMatcherTest.cpp @@ -2,7 +2,7 @@ ** StringMatcherTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/SubfontTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/SubfontTest.cpp index 95a4476ef73..adac8d1648b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/SubfontTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/SubfontTest.cpp @@ -2,7 +2,7 @@ ** SubfontTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/TFMReaderTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/TFMReaderTest.cpp index 8f8da092cbe..9123ceb9e97 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/TFMReaderTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/TFMReaderTest.cpp @@ -2,7 +2,7 @@ ** TFMReaderTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/TensorProductPatchTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/TensorProductPatchTest.cpp index c31ab1a0258..0453cb2835f 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/TensorProductPatchTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/TensorProductPatchTest.cpp @@ -2,7 +2,7 @@ ** TensorProductPatchTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/ToUnicodeMapTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/ToUnicodeMapTest.cpp index 97ae10c07ea..5cfa366bd90 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/ToUnicodeMapTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/ToUnicodeMapTest.cpp @@ -2,7 +2,7 @@ ** ToUnicodeMapTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/TpicSpecialTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/TpicSpecialTest.cpp index 809b9a5d41c..fc98e020174 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/TpicSpecialTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/TpicSpecialTest.cpp @@ -2,7 +2,7 @@ ** TpicSpecialTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -154,7 +154,7 @@ TEST_F(TpicSpecialTest, stroke_polyline) { handler.processSpecial("pa", "1000 0"); handler.processSpecial("fp"); EXPECT_EQ(recorder.getXMLSnippet(), - "<polyline fill='none' stroke-linecap='round' points='0,0 72,72 72,0' stroke='#000' stroke-width='1'/>" + "<polyline fill='none' stroke-linecap='round' points='0 0 72 72 72 0' stroke='#000'/>" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); @@ -169,7 +169,7 @@ TEST_F(TpicSpecialTest, stroke_polygon) { handler.processSpecial("pa", "0 0"); handler.processSpecial("fp"); EXPECT_EQ(recorder.getXMLSnippet(), - "<polygon fill='none' points='0,0 72,72 72,0' stroke='#000' stroke-width='1'/>" + "<polygon fill='none' points='0 0 72 72 72 0' stroke='#000'/>" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); @@ -184,7 +184,7 @@ TEST_F(TpicSpecialTest, fill_polygon) { handler.processSpecial("wh"); handler.processSpecial("fp"); EXPECT_EQ(recorder.getXMLSnippet(), - "<polygon fill='#fff' points='0,0 72,72 72,0' stroke='#000' stroke-width='1'/>" + "<polygon fill='#fff' points='0 0 72 72 72 0' stroke='#000'/>" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); @@ -196,7 +196,7 @@ TEST_F(TpicSpecialTest, fill_polygon) { handler.processSpecial("wh"); handler.processSpecial("ip"); EXPECT_EQ(recorder.getXMLSnippet(), - "<polygon fill='#fff' points='0,0 72,72 72,0'/>" + "<polygon fill='#fff' points='0 0 72 72 72 0'/>" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); @@ -211,7 +211,7 @@ TEST_F(TpicSpecialTest, fill_dashed_polygon) { handler.processSpecial("wh"); handler.processSpecial("da", "2"); EXPECT_EQ(recorder.getXMLSnippet(), - "<polygon fill='#fff' points='0,0 72,72 72,0' stroke='#000' stroke-width='1' stroke-dasharray='144'/>" + "<polygon fill='#fff' points='0 0 72 72 72 0' stroke='#000' stroke-dasharray='144'/>" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); @@ -227,7 +227,7 @@ TEST_F(TpicSpecialTest, fill_dotted_polygon) { handler.processSpecial("wh"); handler.processSpecial("dt", "2 2"); EXPECT_EQ(recorder.getXMLSnippet(), - "<polygon fill='#fff' points='0,0 72,72 72,0' stroke='#000' stroke-width='36' stroke-dasharray='36 144'/>" + "<polygon fill='#fff' points='0 0 72 72 72 0' stroke='#000' stroke-width='36' stroke-dasharray='36 144'/>" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); @@ -239,7 +239,7 @@ TEST_F(TpicSpecialTest, stroke_spline) { handler.processSpecial("pa", "1000 1000"); handler.processSpecial("sp"); EXPECT_EQ(recorder.getXMLSnippet(), - "<polyline fill='none' stroke-linecap='round' points='0,0 72,72' stroke='#000' stroke-width='1'/>" + "<polyline fill='none' stroke-linecap='round' points='0 0 72 72' stroke='#000'/>" ); recorder.clear(); handler.processSpecial("pa", "0 0"); @@ -250,7 +250,7 @@ TEST_F(TpicSpecialTest, stroke_spline) { handler.processSpecial("pa", "1000 500"); handler.processSpecial("sp"); EXPECT_EQ(recorder.getXMLSnippet(), - "<path fill='none' d='M0 0L36 36Q72 72 90 54T126 54T180 108T144 90L72 36' stroke='#000' stroke-width='1'/>" + "<path fill='none' d='M0 0L36 36Q72 72 90 54T126 54T180 108T144 90L72 36' stroke='#000'/>" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); @@ -266,7 +266,7 @@ TEST_F(TpicSpecialTest, stroke_dashed_spline) { handler.processSpecial("pa", "0 0"); handler.processSpecial("sp", "1"); EXPECT_EQ(recorder.getXMLSnippet(), - "<path fill='none' d='M0 0L36 36Q72 72 90 54T126 54T180 108T108 72Z' stroke='#000' stroke-width='1' stroke-dasharray='72'/>" + "<path fill='none' d='M0 0L36 36Q72 72 90 54T126 54T180 108T108 72Z' stroke='#000' stroke-dasharray='72'/>" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); @@ -282,7 +282,7 @@ TEST_F(TpicSpecialTest, stroke_dotted_spline) { handler.processSpecial("pa", "1000 500"); handler.processSpecial("sp", "-1"); EXPECT_EQ(recorder.getXMLSnippet(), - "<path fill='none' d='M0 0L36 36Q72 72 90 54T126 54T180 108T144 90L72 36' stroke='#000' stroke-width='1' stroke-dasharray='1 72'/>" + "<path fill='none' d='M0 0L36 36Q72 72 90 54T126 54T180 108T144 90L72 36' stroke='#000' stroke-dasharray='1 72'/>" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); @@ -292,12 +292,12 @@ TEST_F(TpicSpecialTest, stroke_dotted_spline) { TEST_F(TpicSpecialTest, stroke_ellipse) { handler.processSpecial("ar", "0 0 500 500 0 7"); EXPECT_EQ(recorder.getXMLSnippet(), - "<circle cx='0' cy='0' r='36' stroke-width='1' stroke='#000' fill='none'/>" + "<circle cx='0' cy='0' r='36' stroke='#000' fill='none'/>" ); recorder.clear(); handler.processSpecial("ar", "0 0 1000 500 0 7"); EXPECT_EQ(recorder.getXMLSnippet(), - "<ellipse cx='0' cy='0' rx='72' ry='36' stroke-width='1' stroke='#000' fill='none'/>" + "<ellipse cx='0' cy='0' rx='72' ry='36' stroke='#000' fill='none'/>" ); recorder.clear(); handler.processSpecial("pn", "100"); @@ -312,13 +312,13 @@ TEST_F(TpicSpecialTest, fill_ellipse) { handler.processSpecial("bk"); handler.processSpecial("ia", "0 0 500 500 0 7"); EXPECT_EQ(recorder.getXMLSnippet(), - "<circle cx='0' cy='0' r='36' fill='#000'/>" + "<circle cx='0' cy='0' r='36'/>" ); recorder.clear(); handler.processSpecial("bk"); handler.processSpecial("ia", "0 0 1000 500 0 7"); EXPECT_EQ(recorder.getXMLSnippet(), - "<ellipse cx='0' cy='0' rx='72' ry='36' fill='#000'/>" + "<ellipse cx='0' cy='0' rx='72' ry='36'/>" ); recorder.clear(); handler.processSpecial("pn", "100"); @@ -333,37 +333,37 @@ TEST_F(TpicSpecialTest, fill_ellipse) { TEST_F(TpicSpecialTest, stroke_arc) { handler.processSpecial("ar", "0 0 1000 500 0 "+to_string(math::PI/4)); EXPECT_EQ(recorder.getXMLSnippet(), - "<path d='M72 0A72 36 0 0 1 50.91 25.46' stroke-width='1' stroke='#000' stroke-linecap='round' fill='none'/>" + "<path d='M72 0A72 36 0 0 1 50.91 25.46' stroke='#000' stroke-linecap='round' fill='none'/>" ); recorder.clear(); handler.processSpecial("ar", "0 0 1000 500 0 "+to_string(math::PI/2)); EXPECT_EQ(recorder.getXMLSnippet(), - "<path d='M72 0A72 36 0 0 1 0 36' stroke-width='1' stroke='#000' stroke-linecap='round' fill='none'/>" + "<path d='M72 0A72 36 0 0 1 0 36' stroke='#000' stroke-linecap='round' fill='none'/>" ); recorder.clear(); handler.processSpecial("ar", "0 0 1000 500 0 "+to_string(3*math::PI/4)); EXPECT_EQ(recorder.getXMLSnippet(), - "<path d='M72 0A72 36 0 0 1-50.91 25.46' stroke-width='1' stroke='#000' stroke-linecap='round' fill='none'/>" + "<path d='M72 0A72 36 0 0 1-50.91 25.46' stroke='#000' stroke-linecap='round' fill='none'/>" ); recorder.clear(); handler.processSpecial("ar", "0 0 1000 500 0 "+to_string(math::PI)); EXPECT_EQ(recorder.getXMLSnippet(), - "<path d='M72 0A72 36 0 1 1-72 0' stroke-width='1' stroke='#000' stroke-linecap='round' fill='none'/>" + "<path d='M72 0A72 36 0 1 1-72 0' stroke='#000' stroke-linecap='round' fill='none'/>" ); recorder.clear(); handler.processSpecial("ar", "0 0 1000 500 0 "+to_string(5*math::PI/4)); EXPECT_EQ(recorder.getXMLSnippet(), - "<path d='M72 0A72 36 0 1 1-50.91-25.46' stroke-width='1' stroke='#000' stroke-linecap='round' fill='none'/>" + "<path d='M72 0A72 36 0 1 1-50.91-25.46' stroke='#000' stroke-linecap='round' fill='none'/>" ); recorder.clear(); handler.processSpecial("ar", "0 0 1000 500 0 "+to_string(3*math::PI/2)); EXPECT_EQ(recorder.getXMLSnippet(), - "<path d='M72 0A72 36 0 1 1 0-36' stroke-width='1' stroke='#000' stroke-linecap='round' fill='none'/>" + "<path d='M72 0A72 36 0 1 1 0-36' stroke='#000' stroke-linecap='round' fill='none'/>" ); recorder.clear(); handler.processSpecial("ar", "0 0 1000 500 0 "+to_string(-3*math::PI/2)); EXPECT_EQ(recorder.getXMLSnippet(), - "<path d='M72 0A72 36 0 0 1 0 36' stroke-width='1' stroke='#000' stroke-linecap='round' fill='none'/>" + "<path d='M72 0A72 36 0 0 1 0 36' stroke='#000' stroke-linecap='round' fill='none'/>" ); } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/TriangularPatchTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/TriangularPatchTest.cpp index 29fa437ad2e..780fba77e0e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/TriangularPatchTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/TriangularPatchTest.cpp @@ -2,7 +2,7 @@ ** TriangularPatchTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/UnicodeTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/UnicodeTest.cpp index 4b39ec2bcea..2cb8753e0be 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/UnicodeTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/UnicodeTest.cpp @@ -2,7 +2,7 @@ ** UnicodeTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/UtilityTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/UtilityTest.cpp index 2e8ae696b7d..b0f0320f69a 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/UtilityTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/UtilityTest.cpp @@ -2,7 +2,7 @@ ** UtilityTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -91,14 +91,14 @@ TEST(UtilityTest, split) { parts = split("1,2 , 3, 4 ,,5", ","); ASSERT_EQ(parts.size(), 6u); size_t count=0; - for (const string &part : {"1", "2 ", " 3", " 4 ", "", "5"}) { + for (string part : {"1", "2 ", " 3", " 4 ", "", "5"}) { EXPECT_EQ(parts[count++], part); } parts = split("1 sep2sep3, sep", "sep"); ASSERT_EQ(parts.size(), 4u); count=0; - for (const string &part : {"1 ", "2", "3, ", ""}) { + for (string part : {"1 ", "2", "3, ", ""}) { EXPECT_EQ(parts[count++], part); } } diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorIteratorTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorIteratorTest.cpp index 8476c9a9cc1..13d17de2a31 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorIteratorTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorIteratorTest.cpp @@ -2,7 +2,7 @@ ** VectorIteratorTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorStreamTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorStreamTest.cpp index 4d767bb425f..e67dbfcbbe0 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorStreamTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorStreamTest.cpp @@ -2,7 +2,7 @@ ** VectorStreamTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLNodeTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLNodeTest.cpp index d7d4159970d..413a3a64daa 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLNodeTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLNodeTest.cpp @@ -2,7 +2,7 @@ ** XMLNodeTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLStringTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLStringTest.cpp index 2ebe8cb0f82..7896bd0ac1b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLStringTest.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLStringTest.cpp @@ -2,7 +2,7 @@ ** XMLStringTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/check-conv b/Build/source/texk/dvisvgm/dvisvgm-src/tests/check-conv index a68e88e888e..2ab0f1199cf 100755 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/check-conv +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/check-conv @@ -2,7 +2,7 @@ # This file is part of the dvisvgm package and published under the # terms of the GNU General Public License version 3 or later. # See file COPYING for further details. -# Copyright (C) 2009-2021 Martin Gieseking <martin.gieseking@uos.de> +# Copyright (C) 2009-2022 Martin Gieseking <martin.gieseking@uos.de> files=(sample frktest) diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.am b/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.am index 731b0a19c6d..62ab94c498c 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.am +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.am @@ -1,5 +1,5 @@ ## This file is part of dvisvgm -## Copyright (C) 2016-2021 Martin Gieseking <martin.gieseking@uos.de> +## Copyright (C) 2016-2022 Martin Gieseking <martin.gieseking@uos.de> ## ## Process this file with automake. @@ -13,6 +13,7 @@ EXTRA_DIST = \ frktest.dvi \ frktest-nf-cmp.svg \ frktest-wf-cmp.svg \ + lmmono12-regular.otf \ sample.dvi \ sample-nf-cmp.svg \ sample.sfd \ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.in b/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.in index 78c73d04c72..3b44c55df08 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.in +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.in @@ -271,6 +271,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -293,6 +294,7 @@ EXTRA_DIST = \ frktest.dvi \ frktest-nf-cmp.svg \ frktest-wf-cmp.svg \ + lmmono12-regular.otf \ sample.dvi \ sample-nf-cmp.svg \ sample.sfd \ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/lmmono12-regular.otf b/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/lmmono12-regular.otf Binary files differnew file mode 100644 index 00000000000..dc59181c101 --- /dev/null +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/lmmono12-regular.otf diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/genhashcheck.py b/Build/source/texk/dvisvgm/dvisvgm-src/tests/genhashcheck.py index 88a08ab671b..a145857a420 100755 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/genhashcheck.py +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/genhashcheck.py @@ -2,7 +2,7 @@ # This file is part of the dvisvgm package and published under the # terms of the GNU General Public License version 3 or later. # See file COPYING for further details. -# Copyright (C) 2016-2021 Martin Gieseking <martin.gieseking@uos.de> +# Copyright (C) 2016-2022 Martin Gieseking <martin.gieseking@uos.de> import re import sys diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-death-test.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-death-test.h index dc878ffbb3a..9b4d4d13374 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-death-test.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-death-test.h @@ -35,8 +35,8 @@ // directly. // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ -#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ +#define GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ #include "gtest/internal/gtest-death-test-internal.h" @@ -97,6 +97,10 @@ GTEST_API_ bool InDeathTestChild(); // // ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!"); // +// The final parameter to each of these macros is a matcher applied to any data +// the sub-process wrote to stderr. For compatibility with existing tests, a +// bare string is interpreted as a regular expression matcher. +// // On the regular expressions used in death tests: // // GOOGLETEST_CM0005 DO NOT DELETE @@ -162,27 +166,27 @@ GTEST_API_ bool InDeathTestChild(); // directory in PATH. // -// Asserts that a given statement causes the program to exit, with an -// integer exit status that satisfies predicate, and emitting error output -// that matches regex. -# define ASSERT_EXIT(statement, predicate, regex) \ - GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_) +// Asserts that a given `statement` causes the program to exit, with an +// integer exit status that satisfies `predicate`, and emitting error output +// that matches `matcher`. +# define ASSERT_EXIT(statement, predicate, matcher) \ + GTEST_DEATH_TEST_(statement, predicate, matcher, GTEST_FATAL_FAILURE_) -// Like ASSERT_EXIT, but continues on to successive tests in the +// Like `ASSERT_EXIT`, but continues on to successive tests in the // test suite, if any: -# define EXPECT_EXIT(statement, predicate, regex) \ - GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_) +# define EXPECT_EXIT(statement, predicate, matcher) \ + GTEST_DEATH_TEST_(statement, predicate, matcher, GTEST_NONFATAL_FAILURE_) -// Asserts that a given statement causes the program to exit, either by +// Asserts that a given `statement` causes the program to exit, either by // explicitly exiting with a nonzero exit code or being killed by a -// signal, and emitting error output that matches regex. -# define ASSERT_DEATH(statement, regex) \ - ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) +// signal, and emitting error output that matches `matcher`. +# define ASSERT_DEATH(statement, matcher) \ + ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, matcher) -// Like ASSERT_DEATH, but continues on to successive tests in the +// Like `ASSERT_DEATH`, but continues on to successive tests in the // test suite, if any: -# define EXPECT_DEATH(statement, regex) \ - EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) +# define EXPECT_DEATH(statement, matcher) \ + EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, matcher) // Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*: @@ -190,11 +194,10 @@ GTEST_API_ bool InDeathTestChild(); class GTEST_API_ ExitedWithCode { public: explicit ExitedWithCode(int exit_code); + ExitedWithCode(const ExitedWithCode&) = default; + void operator=(const ExitedWithCode& other) = delete; bool operator()(int exit_status) const; private: - // No implementation - assignment is unsupported. - void operator=(const ExitedWithCode& other); - const int exit_code_; }; @@ -340,4 +343,4 @@ class GTEST_API_ KilledBySignal { } // namespace testing -#endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-matchers.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-matchers.h index 9de6c2e10a2..9fa34a05ba4 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-matchers.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-matchers.h @@ -32,13 +32,10 @@ // This file implements just enough of the matcher interface to allow // EXPECT_DEATH and friends to accept a matcher argument. -// IWYU pragma: private, include "testing/base/public/gunit.h" -// IWYU pragma: friend third_party/googletest/googlemock/.* -// IWYU pragma: friend third_party/googletest/googletest/.* - -#ifndef GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ -#define GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ +#define GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ +#include <atomic> #include <memory> #include <ostream> #include <string> @@ -63,20 +60,16 @@ GTEST_DISABLE_MSC_WARNINGS_PUSH_( namespace testing { // To implement a matcher Foo for type T, define: -// 1. a class FooMatcherImpl that implements the -// MatcherInterface<T> interface, and -// 2. a factory function that creates a Matcher<T> object from a -// FooMatcherImpl*. -// -// The two-level delegation design makes it possible to allow a user -// to write "v" instead of "Eq(v)" where a Matcher is expected, which -// is impossible if we pass matchers by pointers. It also eases -// ownership management as Matcher objects can now be copied like -// plain values. - -// MatchResultListener is an abstract class. Its << operator can be -// used by a matcher to explain why a value matches or doesn't match. +// 1. a class FooMatcherMatcher that implements the matcher interface: +// using is_gtest_matcher = void; +// bool MatchAndExplain(const T&, std::ostream*); +// (MatchResultListener* can also be used instead of std::ostream*) +// void DescribeTo(std::ostream*); +// void DescribeNegationTo(std::ostream*); // +// 2. a factory function that creates a Matcher<T> object from a +// FooMatcherMatcher. + class MatchResultListener { public: // Creates a listener object with the given underlying ostream. The @@ -113,7 +106,7 @@ inline MatchResultListener::~MatchResultListener() { // An instance of a subclass of this knows how to describe itself as a // matcher. -class MatcherDescriberInterface { +class GTEST_API_ MatcherDescriberInterface { public: virtual ~MatcherDescriberInterface() {} @@ -181,31 +174,6 @@ class MatcherInterface : public MatcherDescriberInterface { namespace internal { -// Converts a MatcherInterface<T> to a MatcherInterface<const T&>. -template <typename T> -class MatcherInterfaceAdapter : public MatcherInterface<const T&> { - public: - explicit MatcherInterfaceAdapter(const MatcherInterface<T>* impl) - : impl_(impl) {} - ~MatcherInterfaceAdapter() override { delete impl_; } - - void DescribeTo(::std::ostream* os) const override { impl_->DescribeTo(os); } - - void DescribeNegationTo(::std::ostream* os) const override { - impl_->DescribeNegationTo(os); - } - - bool MatchAndExplain(const T& x, - MatchResultListener* listener) const override { - return impl_->MatchAndExplain(x, listener); - } - - private: - const MatcherInterface<T>* const impl_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(MatcherInterfaceAdapter); -}; - struct AnyEq { template <typename A, typename B> bool operator()(const A& a, const B& b) const { return a == b; } @@ -252,16 +220,35 @@ class StreamMatchResultListener : public MatchResultListener { GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener); }; +struct SharedPayloadBase { + std::atomic<int> ref{1}; + void Ref() { ref.fetch_add(1, std::memory_order_relaxed); } + bool Unref() { return ref.fetch_sub(1, std::memory_order_acq_rel) == 1; } +}; + +template <typename T> +struct SharedPayload : SharedPayloadBase { + explicit SharedPayload(const T& v) : value(v) {} + explicit SharedPayload(T&& v) : value(std::move(v)) {} + + static void Destroy(SharedPayloadBase* shared) { + delete static_cast<SharedPayload*>(shared); + } + + T value; +}; + // An internal class for implementing Matcher<T>, which will derive // from it. We put functionalities common to all Matcher<T> // specializations here to avoid code duplication. template <typename T> -class MatcherBase { +class MatcherBase : private MatcherDescriberInterface { public: // Returns true if and only if the matcher matches x; also explains the // match result to 'listener'. bool MatchAndExplain(const T& x, MatchResultListener* listener) const { - return impl_->MatchAndExplain(x, listener); + GTEST_CHECK_(vtable_ != nullptr); + return vtable_->match_and_explain(*this, x, listener); } // Returns true if and only if this matcher matches x. @@ -271,11 +258,15 @@ class MatcherBase { } // Describes this matcher to an ostream. - void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } + void DescribeTo(::std::ostream* os) const final { + GTEST_CHECK_(vtable_ != nullptr); + vtable_->describe(*this, os, false); + } // Describes the negation of this matcher to an ostream. - void DescribeNegationTo(::std::ostream* os) const { - impl_->DescribeNegationTo(os); + void DescribeNegationTo(::std::ostream* os) const final { + GTEST_CHECK_(vtable_ != nullptr); + vtable_->describe(*this, os, true); } // Explains why x matches, or doesn't match, the matcher. @@ -288,31 +279,194 @@ class MatcherBase { // of the describer, which is only guaranteed to be alive when // this matcher object is alive. const MatcherDescriberInterface* GetDescriber() const { - return impl_.get(); + if (vtable_ == nullptr) return nullptr; + return vtable_->get_describer(*this); } protected: - MatcherBase() {} + MatcherBase() : vtable_(nullptr) {} // Constructs a matcher from its implementation. - explicit MatcherBase(const MatcherInterface<const T&>* impl) : impl_(impl) {} - template <typename U> - explicit MatcherBase( - const MatcherInterface<U>* impl, - typename std::enable_if<!std::is_same<U, const U&>::value>::type* = - nullptr) - : impl_(new internal::MatcherInterfaceAdapter<U>(impl)) {} + explicit MatcherBase(const MatcherInterface<U>* impl) { + Init(impl); + } + + template <typename M, typename = typename std::remove_reference< + M>::type::is_gtest_matcher> + MatcherBase(M&& m) { // NOLINT + Init(std::forward<M>(m)); + } + + MatcherBase(const MatcherBase& other) + : vtable_(other.vtable_), buffer_(other.buffer_) { + if (IsShared()) buffer_.shared->Ref(); + } + + MatcherBase& operator=(const MatcherBase& other) { + if (this == &other) return *this; + Destroy(); + vtable_ = other.vtable_; + buffer_ = other.buffer_; + if (IsShared()) buffer_.shared->Ref(); + return *this; + } - MatcherBase(const MatcherBase&) = default; - MatcherBase& operator=(const MatcherBase&) = default; - MatcherBase(MatcherBase&&) = default; - MatcherBase& operator=(MatcherBase&&) = default; + MatcherBase(MatcherBase&& other) + : vtable_(other.vtable_), buffer_(other.buffer_) { + other.vtable_ = nullptr; + } + + MatcherBase& operator=(MatcherBase&& other) { + if (this == &other) return *this; + Destroy(); + vtable_ = other.vtable_; + buffer_ = other.buffer_; + other.vtable_ = nullptr; + return *this; + } - virtual ~MatcherBase() {} + ~MatcherBase() override { Destroy(); } private: - std::shared_ptr<const MatcherInterface<const T&>> impl_; + struct VTable { + bool (*match_and_explain)(const MatcherBase&, const T&, + MatchResultListener*); + void (*describe)(const MatcherBase&, std::ostream*, bool negation); + // Returns the captured object if it implements the interface, otherwise + // returns the MatcherBase itself. + const MatcherDescriberInterface* (*get_describer)(const MatcherBase&); + // Called on shared instances when the reference count reaches 0. + void (*shared_destroy)(SharedPayloadBase*); + }; + + bool IsShared() const { + return vtable_ != nullptr && vtable_->shared_destroy != nullptr; + } + + // If the implementation uses a listener, call that. + template <typename P> + static auto MatchAndExplainImpl(const MatcherBase& m, const T& value, + MatchResultListener* listener) + -> decltype(P::Get(m).MatchAndExplain(value, listener->stream())) { + return P::Get(m).MatchAndExplain(value, listener->stream()); + } + + template <typename P> + static auto MatchAndExplainImpl(const MatcherBase& m, const T& value, + MatchResultListener* listener) + -> decltype(P::Get(m).MatchAndExplain(value, listener)) { + return P::Get(m).MatchAndExplain(value, listener); + } + + template <typename P> + static void DescribeImpl(const MatcherBase& m, std::ostream* os, + bool negation) { + if (negation) { + P::Get(m).DescribeNegationTo(os); + } else { + P::Get(m).DescribeTo(os); + } + } + + template <typename P> + static const MatcherDescriberInterface* GetDescriberImpl( + const MatcherBase& m) { + // If the impl is a MatcherDescriberInterface, then return it. + // Otherwise use MatcherBase itself. + // This allows us to implement the GetDescriber() function without support + // from the impl, but some users really want to get their impl back when + // they call GetDescriber(). + // We use std::get on a tuple as a workaround of not having `if constexpr`. + return std::get<( + std::is_convertible<decltype(&P::Get(m)), + const MatcherDescriberInterface*>::value + ? 1 + : 0)>(std::make_tuple(&m, &P::Get(m))); + } + + template <typename P> + const VTable* GetVTable() { + static constexpr VTable kVTable = {&MatchAndExplainImpl<P>, + &DescribeImpl<P>, &GetDescriberImpl<P>, + P::shared_destroy}; + return &kVTable; + } + + union Buffer { + // Add some types to give Buffer some common alignment/size use cases. + void* ptr; + double d; + int64_t i; + // And add one for the out-of-line cases. + SharedPayloadBase* shared; + }; + + void Destroy() { + if (IsShared() && buffer_.shared->Unref()) { + vtable_->shared_destroy(buffer_.shared); + } + } + + template <typename M> + static constexpr bool IsInlined() { + return sizeof(M) <= sizeof(Buffer) && alignof(M) <= alignof(Buffer) && + std::is_trivially_copy_constructible<M>::value && + std::is_trivially_destructible<M>::value; + } + + template <typename M, bool = MatcherBase::IsInlined<M>()> + struct ValuePolicy { + static const M& Get(const MatcherBase& m) { + // When inlined along with Init, need to be explicit to avoid violating + // strict aliasing rules. + const M *ptr = static_cast<const M*>( + static_cast<const void*>(&m.buffer_)); + return *ptr; + } + static void Init(MatcherBase& m, M impl) { + ::new (static_cast<void*>(&m.buffer_)) M(impl); + } + static constexpr auto shared_destroy = nullptr; + }; + + template <typename M> + struct ValuePolicy<M, false> { + using Shared = SharedPayload<M>; + static const M& Get(const MatcherBase& m) { + return static_cast<Shared*>(m.buffer_.shared)->value; + } + template <typename Arg> + static void Init(MatcherBase& m, Arg&& arg) { + m.buffer_.shared = new Shared(std::forward<Arg>(arg)); + } + static constexpr auto shared_destroy = &Shared::Destroy; + }; + + template <typename U, bool B> + struct ValuePolicy<const MatcherInterface<U>*, B> { + using M = const MatcherInterface<U>; + using Shared = SharedPayload<std::unique_ptr<M>>; + static const M& Get(const MatcherBase& m) { + return *static_cast<Shared*>(m.buffer_.shared)->value; + } + static void Init(MatcherBase& m, M* impl) { + m.buffer_.shared = new Shared(std::unique_ptr<M>(impl)); + } + + static constexpr auto shared_destroy = &Shared::Destroy; + }; + + template <typename M> + void Init(M&& m) { + using MM = typename std::decay<M>::type; + using Policy = ValuePolicy<MM>; + vtable_ = GetVTable<Policy>(); + Policy::Init(*this, std::forward<M>(m)); + } + + const VTable* vtable_; + Buffer buffer_; }; } // namespace internal @@ -340,6 +494,10 @@ class Matcher : public internal::MatcherBase<T> { nullptr) : internal::MatcherBase<T>(impl) {} + template <typename M, typename = typename std::remove_reference< + M>::type::is_gtest_matcher> + Matcher(M&& m) : internal::MatcherBase<T>(std::forward<M>(m)) {} // NOLINT + // Implicit constructor here allows people to write // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes Matcher(T value); // NOLINT @@ -357,6 +515,11 @@ class GTEST_API_ Matcher<const std::string&> explicit Matcher(const MatcherInterface<const std::string&>* impl) : internal::MatcherBase<const std::string&>(impl) {} + template <typename M, typename = typename std::remove_reference< + M>::type::is_gtest_matcher> + Matcher(M&& m) // NOLINT + : internal::MatcherBase<const std::string&>(std::forward<M>(m)) {} + // Allows the user to write str instead of Eq(str) sometimes, where // str is a std::string object. Matcher(const std::string& s); // NOLINT @@ -376,6 +539,11 @@ class GTEST_API_ Matcher<std::string> explicit Matcher(const MatcherInterface<std::string>* impl) : internal::MatcherBase<std::string>(impl) {} + template <typename M, typename = typename std::remove_reference< + M>::type::is_gtest_matcher> + Matcher(M&& m) // NOLINT + : internal::MatcherBase<std::string>(std::forward<M>(m)) {} + // Allows the user to write str instead of Eq(str) sometimes, where // str is a string object. Matcher(const std::string& s); // NOLINT @@ -384,18 +552,24 @@ class GTEST_API_ Matcher<std::string> Matcher(const char* s); // NOLINT }; -#if GTEST_HAS_ABSL +#if GTEST_INTERNAL_HAS_STRING_VIEW // The following two specializations allow the user to write str // instead of Eq(str) and "foo" instead of Eq("foo") when a absl::string_view // matcher is expected. template <> -class GTEST_API_ Matcher<const absl::string_view&> - : public internal::MatcherBase<const absl::string_view&> { +class GTEST_API_ Matcher<const internal::StringView&> + : public internal::MatcherBase<const internal::StringView&> { public: Matcher() {} - explicit Matcher(const MatcherInterface<const absl::string_view&>* impl) - : internal::MatcherBase<const absl::string_view&>(impl) {} + explicit Matcher(const MatcherInterface<const internal::StringView&>* impl) + : internal::MatcherBase<const internal::StringView&>(impl) {} + + template <typename M, typename = typename std::remove_reference< + M>::type::is_gtest_matcher> + Matcher(M&& m) // NOLINT + : internal::MatcherBase<const internal::StringView&>(std::forward<M>(m)) { + } // Allows the user to write str instead of Eq(str) sometimes, where // str is a std::string object. @@ -404,20 +578,25 @@ class GTEST_API_ Matcher<const absl::string_view&> // Allows the user to write "foo" instead of Eq("foo") sometimes. Matcher(const char* s); // NOLINT - // Allows the user to pass absl::string_views directly. - Matcher(absl::string_view s); // NOLINT + // Allows the user to pass absl::string_views or std::string_views directly. + Matcher(internal::StringView s); // NOLINT }; template <> -class GTEST_API_ Matcher<absl::string_view> - : public internal::MatcherBase<absl::string_view> { +class GTEST_API_ Matcher<internal::StringView> + : public internal::MatcherBase<internal::StringView> { public: Matcher() {} - explicit Matcher(const MatcherInterface<const absl::string_view&>* impl) - : internal::MatcherBase<absl::string_view>(impl) {} - explicit Matcher(const MatcherInterface<absl::string_view>* impl) - : internal::MatcherBase<absl::string_view>(impl) {} + explicit Matcher(const MatcherInterface<const internal::StringView&>* impl) + : internal::MatcherBase<internal::StringView>(impl) {} + explicit Matcher(const MatcherInterface<internal::StringView>* impl) + : internal::MatcherBase<internal::StringView>(impl) {} + + template <typename M, typename = typename std::remove_reference< + M>::type::is_gtest_matcher> + Matcher(M&& m) // NOLINT + : internal::MatcherBase<internal::StringView>(std::forward<M>(m)) {} // Allows the user to write str instead of Eq(str) sometimes, where // str is a std::string object. @@ -426,10 +605,10 @@ class GTEST_API_ Matcher<absl::string_view> // Allows the user to write "foo" instead of Eq("foo") sometimes. Matcher(const char* s); // NOLINT - // Allows the user to pass absl::string_views directly. - Matcher(absl::string_view s); // NOLINT + // Allows the user to pass absl::string_views or std::string_views directly. + Matcher(internal::StringView s); // NOLINT }; -#endif // GTEST_HAS_ABSL +#endif // GTEST_INTERNAL_HAS_STRING_VIEW // Prints a matcher in a human-readable format. template <typename T> @@ -474,13 +653,13 @@ class PolymorphicMatcher { public: explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} - virtual void DescribeTo(::std::ostream* os) const { impl_.DescribeTo(os); } + void DescribeTo(::std::ostream* os) const override { impl_.DescribeTo(os); } - virtual void DescribeNegationTo(::std::ostream* os) const { + void DescribeNegationTo(::std::ostream* os) const override { impl_.DescribeNegationTo(os); } - virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { + bool MatchAndExplain(T x, MatchResultListener* listener) const override { return impl_.MatchAndExplain(x, listener); } @@ -529,37 +708,32 @@ template <typename D, typename Rhs, typename Op> class ComparisonBase { public: explicit ComparisonBase(const Rhs& rhs) : rhs_(rhs) {} + + using is_gtest_matcher = void; + template <typename Lhs> - operator Matcher<Lhs>() const { - return Matcher<Lhs>(new Impl<const Lhs&>(rhs_)); + bool MatchAndExplain(const Lhs& lhs, std::ostream*) const { + return Op()(lhs, Unwrap(rhs_)); + } + void DescribeTo(std::ostream* os) const { + *os << D::Desc() << " "; + UniversalPrint(Unwrap(rhs_), os); + } + void DescribeNegationTo(std::ostream* os) const { + *os << D::NegatedDesc() << " "; + UniversalPrint(Unwrap(rhs_), os); } private: template <typename T> - static const T& Unwrap(const T& v) { return v; } + static const T& Unwrap(const T& v) { + return v; + } template <typename T> - static const T& Unwrap(std::reference_wrapper<T> v) { return v; } - - template <typename Lhs, typename = Rhs> - class Impl : public MatcherInterface<Lhs> { - public: - explicit Impl(const Rhs& rhs) : rhs_(rhs) {} - bool MatchAndExplain(Lhs lhs, - MatchResultListener* /* listener */) const override { - return Op()(lhs, Unwrap(rhs_)); - } - void DescribeTo(::std::ostream* os) const override { - *os << D::Desc() << " "; - UniversalPrint(Unwrap(rhs_), os); - } - void DescribeNegationTo(::std::ostream* os) const override { - *os << D::NegatedDesc() << " "; - UniversalPrint(Unwrap(rhs_), os); - } + static const T& Unwrap(std::reference_wrapper<T> v) { + return v; + } - private: - Rhs rhs_; - }; Rhs rhs_; }; @@ -612,6 +786,10 @@ class GeMatcher : public ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe> { static const char* NegatedDesc() { return "isn't >="; } }; +template <typename T, typename = typename std::enable_if< + std::is_constructible<std::string, T>::value>::type> +using StringLike = T; + // Implements polymorphic matchers MatchesRegex(regex) and // ContainsRegex(regex), which can be used as a Matcher<T> as long as // T can be converted to a string. @@ -620,12 +798,12 @@ class MatchesRegexMatcher { MatchesRegexMatcher(const RE* regex, bool full_match) : regex_(regex), full_match_(full_match) {} -#if GTEST_HAS_ABSL - bool MatchAndExplain(const absl::string_view& s, +#if GTEST_INTERNAL_HAS_STRING_VIEW + bool MatchAndExplain(const internal::StringView& s, MatchResultListener* listener) const { return MatchAndExplain(std::string(s), listener); } -#endif // GTEST_HAS_ABSL +#endif // GTEST_INTERNAL_HAS_STRING_VIEW // Accepts pointer types, particularly: // const char* @@ -672,9 +850,10 @@ inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( const internal::RE* regex) { return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true)); } -inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( - const std::string& regex) { - return MatchesRegex(new internal::RE(regex)); +template <typename T = std::string> +PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( + const internal::StringLike<T>& regex) { + return MatchesRegex(new internal::RE(std::string(regex))); } // Matches a string that contains regular expression 'regex'. @@ -683,9 +862,10 @@ inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( const internal::RE* regex) { return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false)); } -inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( - const std::string& regex) { - return ContainsRegex(new internal::RE(regex)); +template <typename T = std::string> +PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( + const internal::StringLike<T>& regex) { + return ContainsRegex(new internal::RE(std::string(regex))); } // Creates a polymorphic matcher that matches anything equal to x. @@ -747,4 +927,4 @@ inline internal::NeMatcher<Rhs> Ne(Rhs x) { GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 5046 -#endif // GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-message.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-message.h index 4a80e11e6b2..becfd49fcba 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-message.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-message.h @@ -44,11 +44,12 @@ // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ -#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ +#define GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ #include <limits> #include <memory> +#include <sstream> #include "gtest/internal/gtest-port.h" @@ -215,4 +216,4 @@ std::string StreamableToString(const T& streamable) { GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 -#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-param-test.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-param-test.h index c2e6eae3d83..804e702817b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-param-test.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-param-test.h @@ -30,12 +30,9 @@ // Macros and functions for implementing parameterized tests // in Google C++ Testing and Mocking Framework (Google Test) // -// This file is generated by a SCRIPT. DO NOT EDIT BY HAND! -// // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ -#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ - +#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ +#define GOOGLETEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ // Value-parameterized tests allow you to test your code with different // parameters without writing multiple copies of the same test. @@ -371,8 +368,6 @@ inline internal::ParamGenerator<bool> Bool() { // std::tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types // of elements from sequences produces by gen1, gen2, ..., genN. // -// Combine can have up to 10 arguments. -// // Example: // // This will instantiate tests in test suite AnimalTest each one with @@ -416,19 +411,20 @@ internal::CartesianProductHolder<Generator...> Combine(const Generator&... g) { : public test_suite_name { \ public: \ GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \ - virtual void TestBody(); \ + void TestBody() override; \ \ private: \ static int AddToRegistry() { \ ::testing::UnitTest::GetInstance() \ ->parameterized_test_registry() \ .GetTestSuitePatternHolder<test_suite_name>( \ - #test_suite_name, \ + GTEST_STRINGIFY_(test_suite_name), \ ::testing::internal::CodeLocation(__FILE__, __LINE__)) \ ->AddTestPattern( \ GTEST_STRINGIFY_(test_suite_name), GTEST_STRINGIFY_(test_name), \ new ::testing::internal::TestMetaFactory<GTEST_TEST_CLASS_NAME_( \ - test_suite_name, test_name)>()); \ + test_suite_name, test_name)>(), \ + ::testing::internal::CodeLocation(__FILE__, __LINE__)); \ return 0; \ } \ static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \ @@ -483,13 +479,21 @@ internal::CartesianProductHolder<Generator...> Combine(const Generator&... g) { ::testing::UnitTest::GetInstance() \ ->parameterized_test_registry() \ .GetTestSuitePatternHolder<test_suite_name>( \ - #test_suite_name, \ + GTEST_STRINGIFY_(test_suite_name), \ ::testing::internal::CodeLocation(__FILE__, __LINE__)) \ ->AddTestSuiteInstantiation( \ - #prefix, >est_##prefix##test_suite_name##_EvalGenerator_, \ + GTEST_STRINGIFY_(prefix), \ + >est_##prefix##test_suite_name##_EvalGenerator_, \ >est_##prefix##test_suite_name##_EvalGenerateName_, \ __FILE__, __LINE__) + +// Allow Marking a Parameterized test class as not needing to be instantiated. +#define GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(T) \ + namespace gtest_do_not_use_outside_namespace_scope {} \ + static const ::testing::internal::MarkAsIgnored gtest_allow_ignore_##T( \ + GTEST_STRINGIFY_(T)) + // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ #define INSTANTIATE_TEST_CASE_P \ @@ -500,4 +504,4 @@ internal::CartesianProductHolder<Generator...> Combine(const Generator&... g) { } // namespace testing -#endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-printers.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-printers.h index 56a05450ef5..076c9de1f41 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-printers.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-printers.h @@ -97,10 +97,11 @@ // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ -#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ +#define GOOGLETEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ #include <functional> +#include <memory> #include <ostream> // NOLINT #include <sstream> #include <string> @@ -108,64 +109,124 @@ #include <type_traits> #include <utility> #include <vector> + #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-port.h" -#if GTEST_HAS_ABSL -#include "absl/strings/string_view.h" -#include "absl/types/optional.h" -#include "absl/types/variant.h" -#endif // GTEST_HAS_ABSL - namespace testing { -// Definitions in the 'internal' and 'internal2' name spaces are -// subject to change without notice. DO NOT USE THEM IN USER CODE! -namespace internal2 { +// Definitions in the internal* namespaces are subject to change without notice. +// DO NOT USE THEM IN USER CODE! +namespace internal { -// Prints the given number of bytes in the given object to the given -// ostream. -GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes, - size_t count, - ::std::ostream* os); +template <typename T> +void UniversalPrint(const T& value, ::std::ostream* os); -// For selecting which printer to use when a given type has neither << -// nor PrintTo(). -enum TypeKind { - kProtobuf, // a protobuf type - kConvertibleToInteger, // a type implicitly convertible to BiggestInt - // (e.g. a named or unnamed enum type) -#if GTEST_HAS_ABSL - kConvertibleToStringView, // a type implicitly convertible to - // absl::string_view -#endif - kOtherType // anything else +// Used to print an STL-style container when the user doesn't define +// a PrintTo() for it. +struct ContainerPrinter { + template <typename T, + typename = typename std::enable_if< + (sizeof(IsContainerTest<T>(0)) == sizeof(IsContainer)) && + !IsRecursiveContainer<T>::value>::type> + static void PrintValue(const T& container, std::ostream* os) { + const size_t kMaxCount = 32; // The maximum number of elements to print. + *os << '{'; + size_t count = 0; + for (auto&& elem : container) { + if (count > 0) { + *os << ','; + if (count == kMaxCount) { // Enough has been printed. + *os << " ..."; + break; + } + } + *os << ' '; + // We cannot call PrintTo(elem, os) here as PrintTo() doesn't + // handle `elem` being a native array. + internal::UniversalPrint(elem, os); + ++count; + } + + if (count > 0) { + *os << ' '; + } + *os << '}'; + } }; -// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called -// by the universal printer to print a value of type T when neither -// operator<< nor PrintTo() is defined for T, where kTypeKind is the -// "kind" of T as defined by enum TypeKind. -template <typename T, TypeKind kTypeKind> -class TypeWithoutFormatter { - public: - // This default version is called when kTypeKind is kOtherType. +// Used to print a pointer that is neither a char pointer nor a member +// pointer, when the user doesn't define PrintTo() for it. (A member +// variable pointer or member function pointer doesn't really point to +// a location in the address space. Their representation is +// implementation-defined. Therefore they will be printed as raw +// bytes.) +struct FunctionPointerPrinter { + template <typename T, typename = typename std::enable_if< + std::is_function<T>::value>::type> + static void PrintValue(T* p, ::std::ostream* os) { + if (p == nullptr) { + *os << "NULL"; + } else { + // T is a function type, so '*os << p' doesn't do what we want + // (it just prints p as bool). We want to print p as a const + // void*. + *os << reinterpret_cast<const void*>(p); + } + } +}; + +struct PointerPrinter { + template <typename T> + static void PrintValue(T* p, ::std::ostream* os) { + if (p == nullptr) { + *os << "NULL"; + } else { + // T is not a function type. We just call << to print p, + // relying on ADL to pick up user-defined << for their pointer + // types, if any. + *os << p; + } + } +}; + +namespace internal_stream_operator_without_lexical_name_lookup { + +// The presence of an operator<< here will terminate lexical scope lookup +// straight away (even though it cannot be a match because of its argument +// types). Thus, the two operator<< calls in StreamPrinter will find only ADL +// candidates. +struct LookupBlocker {}; +void operator<<(LookupBlocker, LookupBlocker); + +struct StreamPrinter { + template <typename T, + // Don't accept member pointers here. We'd print them via implicit + // conversion to bool, which isn't useful. + typename = typename std::enable_if< + !std::is_member_pointer<T>::value>::type, + // Only accept types for which we can find a streaming operator via + // ADL (possibly involving implicit conversions). + typename = decltype(std::declval<std::ostream&>() + << std::declval<const T&>())> static void PrintValue(const T& value, ::std::ostream* os) { - PrintBytesInObjectTo( - static_cast<const unsigned char*>( - reinterpret_cast<const void*>(std::addressof(value))), - sizeof(value), os); + // Call streaming operator found by ADL, possibly with implicit conversions + // of the arguments. + *os << value; } }; -// We print a protobuf using its ShortDebugString() when the string -// doesn't exceed this many characters; otherwise we print it using -// DebugString() for better readability. -const size_t kProtobufOneLinerMaxLength = 50; +} // namespace internal_stream_operator_without_lexical_name_lookup -template <typename T> -class TypeWithoutFormatter<T, kProtobuf> { - public: +struct ProtobufPrinter { + // We print a protobuf using its ShortDebugString() when the string + // doesn't exceed this many characters; otherwise we print it using + // DebugString() for better readability. + static const size_t kProtobufOneLinerMaxLength = 50; + + template <typename T, + typename = typename std::enable_if< + internal::HasDebugStringAndShortDebugString<T>::value>::type> static void PrintValue(const T& value, ::std::ostream* os) { std::string pretty_str = value.ShortDebugString(); if (pretty_str.length() > kProtobufOneLinerMaxLength) { @@ -175,9 +236,7 @@ class TypeWithoutFormatter<T, kProtobuf> { } }; -template <typename T> -class TypeWithoutFormatter<T, kConvertibleToInteger> { - public: +struct ConvertibleToIntegerPrinter { // Since T has no << operator or PrintTo() but can be implicitly // converted to BiggestInt, we print it as a BiggestInt. // @@ -185,112 +244,73 @@ class TypeWithoutFormatter<T, kConvertibleToInteger> { // case printing it as an integer is the desired behavior. In case // T is not an enum, printing it as an integer is the best we can do // given that it has no user-defined printer. - static void PrintValue(const T& value, ::std::ostream* os) { - const internal::BiggestInt kBigInt = value; - *os << kBigInt; + static void PrintValue(internal::BiggestInt value, ::std::ostream* os) { + *os << value; } }; -#if GTEST_HAS_ABSL -template <typename T> -class TypeWithoutFormatter<T, kConvertibleToStringView> { - public: - // Since T has neither operator<< nor PrintTo() but can be implicitly - // converted to absl::string_view, we print it as a absl::string_view. - // - // Note: the implementation is further below, as it depends on - // internal::PrintTo symbol which is defined later in the file. - static void PrintValue(const T& value, ::std::ostream* os); -}; -#endif - -// Prints the given value to the given ostream. If the value is a -// protocol message, its debug string is printed; if it's an enum or -// of a type implicitly convertible to BiggestInt, it's printed as an -// integer; otherwise the bytes in the value are printed. This is -// what UniversalPrinter<T>::Print() does when it knows nothing about -// type T and T has neither << operator nor PrintTo(). -// -// A user can override this behavior for a class type Foo by defining -// a << operator in the namespace where Foo is defined. -// -// We put this operator in namespace 'internal2' instead of 'internal' -// to simplify the implementation, as much code in 'internal' needs to -// use << in STL, which would conflict with our own << were it defined -// in 'internal'. -// -// Note that this operator<< takes a generic std::basic_ostream<Char, -// CharTraits> type instead of the more restricted std::ostream. If -// we define it to take an std::ostream instead, we'll get an -// "ambiguous overloads" compiler error when trying to print a type -// Foo that supports streaming to std::basic_ostream<Char, -// CharTraits>, as the compiler cannot tell whether -// operator<<(std::ostream&, const T&) or -// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more -// specific. -template <typename Char, typename CharTraits, typename T> -::std::basic_ostream<Char, CharTraits>& operator<<( - ::std::basic_ostream<Char, CharTraits>& os, const T& x) { - TypeWithoutFormatter<T, (internal::IsAProtocolMessage<T>::value - ? kProtobuf - : std::is_convertible< - const T&, internal::BiggestInt>::value - ? kConvertibleToInteger - : -#if GTEST_HAS_ABSL - std::is_convertible< - const T&, absl::string_view>::value - ? kConvertibleToStringView - : +struct ConvertibleToStringViewPrinter { +#if GTEST_INTERNAL_HAS_STRING_VIEW + static void PrintValue(internal::StringView value, ::std::ostream* os) { + internal::UniversalPrint(value, os); + } #endif - kOtherType)>::PrintValue(x, &os); - return os; -} +}; -} // namespace internal2 -} // namespace testing -// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up -// magic needed for implementing UniversalPrinter won't work. -namespace testing_internal { +// Prints the given number of bytes in the given object to the given +// ostream. +GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes, + size_t count, + ::std::ostream* os); +struct RawBytesPrinter { + // SFINAE on `sizeof` to make sure we have a complete type. + template <typename T, size_t = sizeof(T)> + static void PrintValue(const T& value, ::std::ostream* os) { + PrintBytesInObjectTo( + static_cast<const unsigned char*>( + // Load bearing cast to void* to support iOS + reinterpret_cast<const void*>(std::addressof(value))), + sizeof(value), os); + } +}; -// Used to print a value that is not an STL-style container when the -// user doesn't define PrintTo() for it. -template <typename T> -void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) { - // With the following statement, during unqualified name lookup, - // testing::internal2::operator<< appears as if it was declared in - // the nearest enclosing namespace that contains both - // ::testing_internal and ::testing::internal2, i.e. the global - // namespace. For more details, refer to the C++ Standard section - // 7.3.4-1 [namespace.udir]. This allows us to fall back onto - // testing::internal2::operator<< in case T doesn't come with a << - // operator. - // - // We cannot write 'using ::testing::internal2::operator<<;', which - // gcc 3.3 fails to compile due to a compiler bug. - using namespace ::testing::internal2; // NOLINT +struct FallbackPrinter { + template <typename T> + static void PrintValue(const T&, ::std::ostream* os) { + *os << "(incomplete type)"; + } +}; - // Assuming T is defined in namespace foo, in the next statement, - // the compiler will consider all of: - // - // 1. foo::operator<< (thanks to Koenig look-up), - // 2. ::operator<< (as the current namespace is enclosed in ::), - // 3. testing::internal2::operator<< (thanks to the using statement above). - // - // The operator<< whose type matches T best will be picked. - // - // We deliberately allow #2 to be a candidate, as sometimes it's - // impossible to define #1 (e.g. when foo is ::std, defining - // anything in it is undefined behavior unless you are a compiler - // vendor.). - *os << value; -} +// Try every printer in order and return the first one that works. +template <typename T, typename E, typename Printer, typename... Printers> +struct FindFirstPrinter : FindFirstPrinter<T, E, Printers...> {}; -} // namespace testing_internal +template <typename T, typename Printer, typename... Printers> +struct FindFirstPrinter< + T, decltype(Printer::PrintValue(std::declval<const T&>(), nullptr)), + Printer, Printers...> { + using type = Printer; +}; -namespace testing { -namespace internal { +// Select the best printer in the following order: +// - Print containers (they have begin/end/etc). +// - Print function pointers. +// - Print object pointers. +// - Use the stream operator, if available. +// - Print protocol buffers. +// - Print types convertible to BiggestInt. +// - Print types convertible to StringView, if available. +// - Fallback to printing the raw bytes of the object. +template <typename T> +void PrintWithFallback(const T& value, ::std::ostream* os) { + using Printer = typename FindFirstPrinter< + T, void, ContainerPrinter, FunctionPointerPrinter, PointerPrinter, + internal_stream_operator_without_lexical_name_lookup::StreamPrinter, + ProtobufPrinter, ConvertibleToIntegerPrinter, + ConvertibleToStringViewPrinter, RawBytesPrinter, FallbackPrinter>::type; + Printer::PrintValue(value, os); +} // FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a // value of type ToPrint that is an operand of a comparison assertion @@ -340,6 +360,14 @@ GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char); GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char); GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t); GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t); +#ifdef __cpp_char8_t +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char8_t); +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char8_t); +#endif +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char16_t); +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char16_t); +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char32_t); +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char32_t); #undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_ @@ -357,6 +385,14 @@ GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t); GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string); GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string); +#ifdef __cpp_char8_t +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char8_t, ::std::u8string); +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char8_t, ::std::u8string); +#endif +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char16_t, ::std::u16string); +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char16_t, ::std::u16string); +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char32_t, ::std::u32string); +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char32_t, ::std::u32string); #if GTEST_HAS_STD_WSTRING GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring); @@ -389,85 +425,6 @@ std::string FormatForComparisonFailureMessage( template <typename T> class UniversalPrinter; -template <typename T> -void UniversalPrint(const T& value, ::std::ostream* os); - -enum DefaultPrinterType { - kPrintContainer, - kPrintPointer, - kPrintFunctionPointer, - kPrintOther, -}; -template <DefaultPrinterType type> struct WrapPrinterType {}; - -// Used to print an STL-style container when the user doesn't define -// a PrintTo() for it. -template <typename C> -void DefaultPrintTo(WrapPrinterType<kPrintContainer> /* dummy */, - const C& container, ::std::ostream* os) { - const size_t kMaxCount = 32; // The maximum number of elements to print. - *os << '{'; - size_t count = 0; - for (typename C::const_iterator it = container.begin(); - it != container.end(); ++it, ++count) { - if (count > 0) { - *os << ','; - if (count == kMaxCount) { // Enough has been printed. - *os << " ..."; - break; - } - } - *os << ' '; - // We cannot call PrintTo(*it, os) here as PrintTo() doesn't - // handle *it being a native array. - internal::UniversalPrint(*it, os); - } - - if (count > 0) { - *os << ' '; - } - *os << '}'; -} - -// Used to print a pointer that is neither a char pointer nor a member -// pointer, when the user doesn't define PrintTo() for it. (A member -// variable pointer or member function pointer doesn't really point to -// a location in the address space. Their representation is -// implementation-defined. Therefore they will be printed as raw -// bytes.) -template <typename T> -void DefaultPrintTo(WrapPrinterType<kPrintPointer> /* dummy */, - T* p, ::std::ostream* os) { - if (p == nullptr) { - *os << "NULL"; - } else { - // T is not a function type. We just call << to print p, - // relying on ADL to pick up user-defined << for their pointer - // types, if any. - *os << p; - } -} -template <typename T> -void DefaultPrintTo(WrapPrinterType<kPrintFunctionPointer> /* dummy */, - T* p, ::std::ostream* os) { - if (p == nullptr) { - *os << "NULL"; - } else { - // T is a function type, so '*os << p' doesn't do what we want - // (it just prints p as bool). We want to print p as a const - // void*. - *os << reinterpret_cast<const void*>(p); - } -} - -// Used to print a non-container, non-pointer value when the user -// doesn't define PrintTo() for it. -template <typename T> -void DefaultPrintTo(WrapPrinterType<kPrintOther> /* dummy */, - const T& value, ::std::ostream* os) { - ::testing_internal::DefaultPrintNonContainerTo(value, os); -} - // Prints the given value using the << operator if it has one; // otherwise prints the bytes in it. This is what // UniversalPrinter<T>::Print() does when PrintTo() is not specialized @@ -481,36 +438,7 @@ void DefaultPrintTo(WrapPrinterType<kPrintOther> /* dummy */, // wants). template <typename T> void PrintTo(const T& value, ::std::ostream* os) { - // DefaultPrintTo() is overloaded. The type of its first argument - // determines which version will be picked. - // - // Note that we check for container types here, prior to we check - // for protocol message types in our operator<<. The rationale is: - // - // For protocol messages, we want to give people a chance to - // override Google Mock's format by defining a PrintTo() or - // operator<<. For STL containers, other formats can be - // incompatible with Google Mock's format for the container - // elements; therefore we check for container types here to ensure - // that our format is used. - // - // Note that MSVC and clang-cl do allow an implicit conversion from - // pointer-to-function to pointer-to-object, but clang-cl warns on it. - // So don't use ImplicitlyConvertible if it can be helped since it will - // cause this warning, and use a separate overload of DefaultPrintTo for - // function pointers so that the `*os << p` in the object pointer overload - // doesn't cause that warning either. - DefaultPrintTo( - WrapPrinterType < - (sizeof(IsContainerTest<T>(0)) == sizeof(IsContainer)) && - !IsRecursiveContainer<T>::value - ? kPrintContainer - : !std::is_pointer<T>::value - ? kPrintOther - : std::is_function<typename std::remove_pointer<T>::type>::value - ? kPrintFunctionPointer - : kPrintPointer > (), - value, os); + internal::PrintWithFallback(value, os); } // The following list of PrintTo() overloads tells @@ -541,6 +469,16 @@ inline void PrintTo(bool x, ::std::ostream* os) { // is implemented as an unsigned type. GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os); +GTEST_API_ void PrintTo(char32_t c, ::std::ostream* os); +inline void PrintTo(char16_t c, ::std::ostream* os) { + PrintTo(ImplicitCast_<char32_t>(c), os); +} +#ifdef __cpp_char8_t +inline void PrintTo(char8_t c, ::std::ostream* os) { + PrintTo(ImplicitCast_<char32_t>(c), os); +} +#endif + // Overloads for C strings. GTEST_API_ void PrintTo(const char* s, ::std::ostream* os); inline void PrintTo(char* s, ::std::ostream* os) { @@ -561,6 +499,23 @@ inline void PrintTo(const unsigned char* s, ::std::ostream* os) { inline void PrintTo(unsigned char* s, ::std::ostream* os) { PrintTo(ImplicitCast_<const void*>(s), os); } +#ifdef __cpp_char8_t +// Overloads for u8 strings. +GTEST_API_ void PrintTo(const char8_t* s, ::std::ostream* os); +inline void PrintTo(char8_t* s, ::std::ostream* os) { + PrintTo(ImplicitCast_<const char8_t*>(s), os); +} +#endif +// Overloads for u16 strings. +GTEST_API_ void PrintTo(const char16_t* s, ::std::ostream* os); +inline void PrintTo(char16_t* s, ::std::ostream* os) { + PrintTo(ImplicitCast_<const char16_t*>(s), os); +} +// Overloads for u32 strings. +GTEST_API_ void PrintTo(const char32_t* s, ::std::ostream* os); +inline void PrintTo(char32_t* s, ::std::ostream* os) { + PrintTo(ImplicitCast_<const char32_t*>(s), os); +} // MSVC can be configured to define wchar_t as a typedef of unsigned // short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native @@ -595,6 +550,26 @@ inline void PrintTo(const ::std::string& s, ::std::ostream* os) { PrintStringTo(s, os); } +// Overloads for ::std::u8string +#ifdef __cpp_char8_t +GTEST_API_ void PrintU8StringTo(const ::std::u8string& s, ::std::ostream* os); +inline void PrintTo(const ::std::u8string& s, ::std::ostream* os) { + PrintU8StringTo(s, os); +} +#endif + +// Overloads for ::std::u16string +GTEST_API_ void PrintU16StringTo(const ::std::u16string& s, ::std::ostream* os); +inline void PrintTo(const ::std::u16string& s, ::std::ostream* os) { + PrintU16StringTo(s, os); +} + +// Overloads for ::std::u32string +GTEST_API_ void PrintU32StringTo(const ::std::u32string& s, ::std::ostream* os); +inline void PrintTo(const ::std::u32string& s, ::std::ostream* os) { + PrintU32StringTo(s, os); +} + // Overloads for ::std::wstring. #if GTEST_HAS_STD_WSTRING GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os); @@ -603,12 +578,12 @@ inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) { } #endif // GTEST_HAS_STD_WSTRING -#if GTEST_HAS_ABSL -// Overload for absl::string_view. -inline void PrintTo(absl::string_view sp, ::std::ostream* os) { +#if GTEST_INTERNAL_HAS_STRING_VIEW +// Overload for internal::StringView. +inline void PrintTo(internal::StringView sp, ::std::ostream* os) { PrintTo(::std::string(sp), os); } -#endif // GTEST_HAS_ABSL +#endif // GTEST_INTERNAL_HAS_STRING_VIEW inline void PrintTo(std::nullptr_t, ::std::ostream* os) { *os << "(nullptr)"; } @@ -617,6 +592,43 @@ void PrintTo(std::reference_wrapper<T> ref, ::std::ostream* os) { UniversalPrinter<T&>::Print(ref.get(), os); } +inline const void* VoidifyPointer(const void* p) { return p; } +inline const void* VoidifyPointer(volatile const void* p) { + return const_cast<const void*>(p); +} + +template <typename T, typename Ptr> +void PrintSmartPointer(const Ptr& ptr, std::ostream* os, char) { + if (ptr == nullptr) { + *os << "(nullptr)"; + } else { + // We can't print the value. Just print the pointer.. + *os << "(" << (VoidifyPointer)(ptr.get()) << ")"; + } +} +template <typename T, typename Ptr, + typename = typename std::enable_if<!std::is_void<T>::value && + !std::is_array<T>::value>::type> +void PrintSmartPointer(const Ptr& ptr, std::ostream* os, int) { + if (ptr == nullptr) { + *os << "(nullptr)"; + } else { + *os << "(ptr = " << (VoidifyPointer)(ptr.get()) << ", value = "; + UniversalPrinter<T>::Print(*ptr, os); + *os << ")"; + } +} + +template <typename T, typename D> +void PrintTo(const std::unique_ptr<T, D>& ptr, std::ostream* os) { + (PrintSmartPointer<T>)(ptr, os, 0); +} + +template <typename T> +void PrintTo(const std::shared_ptr<T>& ptr, std::ostream* os) { + (PrintSmartPointer<T>)(ptr, os, 0); +} + // Helper function for printing a tuple. T must be instantiated with // a tuple type. template <typename T> @@ -682,14 +694,46 @@ class UniversalPrinter { GTEST_DISABLE_MSC_WARNINGS_POP_() }; -#if GTEST_HAS_ABSL +// Remove any const-qualifiers before passing a type to UniversalPrinter. +template <typename T> +class UniversalPrinter<const T> : public UniversalPrinter<T> {}; + +#if GTEST_INTERNAL_HAS_ANY + +// Printer for std::any / absl::any -// Printer for absl::optional +template <> +class UniversalPrinter<Any> { + public: + static void Print(const Any& value, ::std::ostream* os) { + if (value.has_value()) { + *os << "value of type " << GetTypeName(value); + } else { + *os << "no value"; + } + } + + private: + static std::string GetTypeName(const Any& value) { +#if GTEST_HAS_RTTI + return internal::GetTypeName(value.type()); +#else + static_cast<void>(value); // possibly unused + return "<unknown_type>"; +#endif // GTEST_HAS_RTTI + } +}; + +#endif // GTEST_INTERNAL_HAS_ANY + +#if GTEST_INTERNAL_HAS_OPTIONAL + +// Printer for std::optional / absl::optional template <typename T> -class UniversalPrinter<::absl::optional<T>> { +class UniversalPrinter<Optional<T>> { public: - static void Print(const ::absl::optional<T>& value, ::std::ostream* os) { + static void Print(const Optional<T>& value, ::std::ostream* os) { *os << '('; if (!value) { *os << "nullopt"; @@ -700,14 +744,22 @@ class UniversalPrinter<::absl::optional<T>> { } }; -// Printer for absl::variant +#endif // GTEST_INTERNAL_HAS_OPTIONAL + +#if GTEST_INTERNAL_HAS_VARIANT + +// Printer for std::variant / absl::variant template <typename... T> -class UniversalPrinter<::absl::variant<T...>> { +class UniversalPrinter<Variant<T...>> { public: - static void Print(const ::absl::variant<T...>& value, ::std::ostream* os) { + static void Print(const Variant<T...>& value, ::std::ostream* os) { *os << '('; - absl::visit(Visitor{os}, value); +#if GTEST_HAS_ABSL + absl::visit(Visitor{os, value.index()}, value); +#else + std::visit(Visitor{os, value.index()}, value); +#endif // GTEST_HAS_ABSL *os << ')'; } @@ -715,14 +767,16 @@ class UniversalPrinter<::absl::variant<T...>> { struct Visitor { template <typename U> void operator()(const U& u) const { - *os << "'" << GetTypeName<U>() << "' with value "; + *os << "'" << GetTypeName<U>() << "(index = " << index + << ")' with value "; UniversalPrint(u, os); } ::std::ostream* os; + std::size_t index; }; }; -#endif // GTEST_HAS_ABSL +#endif // GTEST_INTERNAL_HAS_VARIANT // UniversalPrintArray(begin, len, os) prints an array of 'len' // elements, starting at address 'begin'. @@ -751,6 +805,20 @@ void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) { GTEST_API_ void UniversalPrintArray( const char* begin, size_t len, ::std::ostream* os); +#ifdef __cpp_char8_t +// This overload prints a (const) char8_t array compactly. +GTEST_API_ void UniversalPrintArray(const char8_t* begin, size_t len, + ::std::ostream* os); +#endif + +// This overload prints a (const) char16_t array compactly. +GTEST_API_ void UniversalPrintArray(const char16_t* begin, size_t len, + ::std::ostream* os); + +// This overload prints a (const) char32_t array compactly. +GTEST_API_ void UniversalPrintArray(const char32_t* begin, size_t len, + ::std::ostream* os); + // This overload prints a (const) wchar_t array compactly. GTEST_API_ void UniversalPrintArray( const wchar_t* begin, size_t len, ::std::ostream* os); @@ -823,12 +891,55 @@ class UniversalTersePrinter<const char*> { } }; template <> -class UniversalTersePrinter<char*> { +class UniversalTersePrinter<char*> : public UniversalTersePrinter<const char*> { +}; + +#ifdef __cpp_char8_t +template <> +class UniversalTersePrinter<const char8_t*> { public: - static void Print(char* str, ::std::ostream* os) { - UniversalTersePrinter<const char*>::Print(str, os); + static void Print(const char8_t* str, ::std::ostream* os) { + if (str == nullptr) { + *os << "NULL"; + } else { + UniversalPrint(::std::u8string(str), os); + } } }; +template <> +class UniversalTersePrinter<char8_t*> + : public UniversalTersePrinter<const char8_t*> {}; +#endif + +template <> +class UniversalTersePrinter<const char16_t*> { + public: + static void Print(const char16_t* str, ::std::ostream* os) { + if (str == nullptr) { + *os << "NULL"; + } else { + UniversalPrint(::std::u16string(str), os); + } + } +}; +template <> +class UniversalTersePrinter<char16_t*> + : public UniversalTersePrinter<const char16_t*> {}; + +template <> +class UniversalTersePrinter<const char32_t*> { + public: + static void Print(const char32_t* str, ::std::ostream* os) { + if (str == nullptr) { + *os << "NULL"; + } else { + UniversalPrint(::std::u32string(str), os); + } + } +}; +template <> +class UniversalTersePrinter<char32_t*> + : public UniversalTersePrinter<const char32_t*> {}; #if GTEST_HAS_STD_WSTRING template <> @@ -901,16 +1012,6 @@ Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) { } // namespace internal -#if GTEST_HAS_ABSL -namespace internal2 { -template <typename T> -void TypeWithoutFormatter<T, kConvertibleToStringView>::PrintValue( - const T& value, ::std::ostream* os) { - internal::PrintTo(absl::string_view(value), os); -} -} // namespace internal2 -#endif - template <typename T> ::std::string PrintToString(const T& value) { ::std::stringstream ss; @@ -925,4 +1026,4 @@ template <typename T> // declarations from this file. #include "gtest/internal/custom/gtest-printers.h" -#endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-spi.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-spi.h index aa38870e8e1..eacef44669e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-spi.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-spi.h @@ -33,8 +33,8 @@ // GOOGLETEST_CM0004 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_ -#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_ +#define GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_ #include "gtest/gtest.h" @@ -235,4 +235,4 @@ GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 }\ } while (::testing::internal::AlwaysFalse()) -#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-test-part.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-test-part.h index 05a79853586..203fdf98c69 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-test-part.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-test-part.h @@ -29,8 +29,8 @@ // // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ -#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ +#define GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ #include <iosfwd> #include <vector> @@ -181,4 +181,4 @@ class GTEST_API_ HasNewFatalFailureHelper GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 -#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-typed-test.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-typed-test.h index 095ce058022..9fdc6be10dc 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-typed-test.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-typed-test.h @@ -27,11 +27,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ -#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ +#define GOOGLETEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ // This header implements typed tests and type-parameterized tests. @@ -170,13 +169,12 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); #endif // 0 +#include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-port.h" #include "gtest/internal/gtest-type-util.h" // Implements typed tests. -#if GTEST_HAS_TYPED_TEST - // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Expands to the name of the typedef for the type parameters of the @@ -188,24 +186,25 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); #define GTEST_NAME_GENERATOR_(TestSuiteName) \ gtest_type_params_##TestSuiteName##_NameGenerator -#define TYPED_TEST_SUITE(CaseName, Types, ...) \ - typedef ::testing::internal::TypeList<Types>::type GTEST_TYPE_PARAMS_( \ - CaseName); \ - typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \ +#define TYPED_TEST_SUITE(CaseName, Types, ...) \ + typedef ::testing::internal::GenerateTypeList<Types>::type \ + GTEST_TYPE_PARAMS_(CaseName); \ + typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \ GTEST_NAME_GENERATOR_(CaseName) -# define TYPED_TEST(CaseName, TestName) \ +#define TYPED_TEST(CaseName, TestName) \ + static_assert(sizeof(GTEST_STRINGIFY_(TestName)) > 1, \ + "test-name must not be empty"); \ template <typename gtest_TypeParam_> \ class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \ : public CaseName<gtest_TypeParam_> { \ private: \ typedef CaseName<gtest_TypeParam_> TestFixture; \ typedef gtest_TypeParam_ TypeParam; \ - virtual void TestBody(); \ + void TestBody() override; \ }; \ static bool gtest_##CaseName##_##TestName##_registered_ \ - GTEST_ATTRIBUTE_UNUSED_ = \ - ::testing::internal::TypeParameterizedTest< \ + GTEST_ATTRIBUTE_UNUSED_ = ::testing::internal::TypeParameterizedTest< \ CaseName, \ ::testing::internal::TemplateSel<GTEST_TEST_CLASS_NAME_(CaseName, \ TestName)>, \ @@ -213,7 +212,8 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); CaseName)>::Register("", \ ::testing::internal::CodeLocation( \ __FILE__, __LINE__), \ - #CaseName, #TestName, 0, \ + GTEST_STRINGIFY_(CaseName), \ + GTEST_STRINGIFY_(TestName), 0, \ ::testing::internal::GenerateNames< \ GTEST_NAME_GENERATOR_(CaseName), \ GTEST_TYPE_PARAMS_(CaseName)>()); \ @@ -228,12 +228,8 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); TYPED_TEST_SUITE #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -#endif // GTEST_HAS_TYPED_TEST - // Implements type-parameterized tests. -#if GTEST_HAS_TYPED_TEST_P - // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Expands to the namespace name that the type-parameterized tests for @@ -276,24 +272,26 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); private: \ typedef SuiteName<gtest_TypeParam_> TestFixture; \ typedef gtest_TypeParam_ TypeParam; \ - virtual void TestBody(); \ + void TestBody() override; \ }; \ static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \ GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName( \ - __FILE__, __LINE__, #SuiteName, #TestName); \ + __FILE__, __LINE__, GTEST_STRINGIFY_(SuiteName), \ + GTEST_STRINGIFY_(TestName)); \ } \ template <typename gtest_TypeParam_> \ void GTEST_SUITE_NAMESPACE_( \ SuiteName)::TestName<gtest_TypeParam_>::TestBody() -#define REGISTER_TYPED_TEST_SUITE_P(SuiteName, ...) \ - namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \ - typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \ - } \ - static const char* const GTEST_REGISTERED_TEST_NAMES_( \ - SuiteName) GTEST_ATTRIBUTE_UNUSED_ = \ - GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).VerifyRegisteredTestNames( \ - __FILE__, __LINE__, #__VA_ARGS__) +// Note: this won't work correctly if the trailing arguments are macros. +#define REGISTER_TYPED_TEST_SUITE_P(SuiteName, ...) \ + namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \ + typedef ::testing::internal::Templates<__VA_ARGS__> gtest_AllTests_; \ + } \ + static const char* const GTEST_REGISTERED_TEST_NAMES_( \ + SuiteName) GTEST_ATTRIBUTE_UNUSED_ = \ + GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).VerifyRegisteredTestNames( \ + GTEST_STRINGIFY_(SuiteName), __FILE__, __LINE__, #__VA_ARGS__) // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ @@ -304,18 +302,21 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ #define INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, SuiteName, Types, ...) \ + static_assert(sizeof(GTEST_STRINGIFY_(Prefix)) > 1, \ + "test-suit-prefix must not be empty"); \ static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ = \ ::testing::internal::TypeParameterizedTestSuite< \ SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_, \ - ::testing::internal::TypeList<Types>::type>:: \ - Register(#Prefix, \ + ::testing::internal::GenerateTypeList<Types>::type>:: \ + Register(GTEST_STRINGIFY_(Prefix), \ ::testing::internal::CodeLocation(__FILE__, __LINE__), \ - >EST_TYPED_TEST_SUITE_P_STATE_(SuiteName), #SuiteName, \ + >EST_TYPED_TEST_SUITE_P_STATE_(SuiteName), \ + GTEST_STRINGIFY_(SuiteName), \ GTEST_REGISTERED_TEST_NAMES_(SuiteName), \ ::testing::internal::GenerateNames< \ ::testing::internal::NameGeneratorSelector< \ __VA_ARGS__>::type, \ - ::testing::internal::TypeList<Types>::type>()) + ::testing::internal::GenerateTypeList<Types>::type>()) // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ @@ -325,6 +326,4 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); INSTANTIATE_TYPED_TEST_SUITE_P #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -#endif // GTEST_HAS_TYPED_TEST_P - -#endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest.h index dbe5b1c2c3f..20f8930fcfd 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest.h @@ -49,8 +49,8 @@ // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_GTEST_H_ -#define GTEST_INCLUDE_GTEST_GTEST_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_H_ +#define GOOGLETEST_INCLUDE_GTEST_GTEST_H_ #include <cstddef> #include <limits> @@ -101,6 +101,10 @@ GTEST_DECLARE_bool_(catch_exceptions); // to let Google Test decide. GTEST_DECLARE_string_(color); +// This flag controls whether the test runner should continue execution past +// first failure. +GTEST_DECLARE_bool_(fail_fast); + // This flag sets up the filter to select by name using a glob pattern // the tests to run. If the filter is not given all tests are executed. GTEST_DECLARE_string_(filter); @@ -117,6 +121,9 @@ GTEST_DECLARE_bool_(list_tests); // in addition to its normal textual output. GTEST_DECLARE_string_(output); +// This flags control whether Google Test prints only test failures. +GTEST_DECLARE_bool_(brief); + // This flags control whether Google Test prints the elapsed time for each // test. GTEST_DECLARE_bool_(print_time); @@ -177,7 +184,12 @@ class FuchsiaDeathTest; class UnitTestImpl* GetUnitTestImpl(); void ReportFailureInUnknownLocation(TestPartResult::Type result_type, const std::string& message); +std::set<std::string>* GetIgnoredParameterizedTestSuites(); + +enum class GTestColor { kDefault, kRed, kGreen, kYellow }; +GTEST_ATTRIBUTE_PRINTF_(2, 3) +void ColoredPrintf(GTestColor color, const char *fmt, ...); } // namespace internal // The friend relationship of some of these classes is cyclic. @@ -278,7 +290,11 @@ class GTEST_API_ AssertionResult { // Used in EXPECT_TRUE/FALSE(assertion_result). AssertionResult(const AssertionResult& other); -#if defined(_MSC_VER) && _MSC_VER < 1910 +// C4800 is a level 3 warning in Visual Studio 2015 and earlier. +// This warning is not emitted in Visual Studio 2017. +// This warning is off by default starting in Visual Studio 2019 but can be +// enabled with command-line options. +#if defined(_MSC_VER) && (_MSC_VER < 1910 || _MSC_VER >= 1920) GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 /* forcing value to bool */) #endif @@ -298,7 +314,7 @@ class GTEST_API_ AssertionResult { = nullptr) : success_(success) {} -#if defined(_MSC_VER) && _MSC_VER < 1910 +#if defined(_MSC_VER) && (_MSC_VER < 1910 || _MSC_VER >= 1920) GTEST_DISABLE_MSC_WARNINGS_POP_() #endif @@ -406,27 +422,24 @@ class GTEST_API_ Test { // The d'tor is virtual as we intend to inherit from Test. virtual ~Test(); - // Sets up the stuff shared by all tests in this test case. + // Sets up the stuff shared by all tests in this test suite. // // Google Test will call Foo::SetUpTestSuite() before running the first - // test in test case Foo. Hence a sub-class can define its own + // test in test suite Foo. Hence a sub-class can define its own // SetUpTestSuite() method to shadow the one defined in the super // class. - // Failures that happen during SetUpTestSuite are logged but otherwise - // ignored. static void SetUpTestSuite() {} // Tears down the stuff shared by all tests in this test suite. // // Google Test will call Foo::TearDownTestSuite() after running the last - // test in test case Foo. Hence a sub-class can define its own + // test in test suite Foo. Hence a sub-class can define its own // TearDownTestSuite() method to shadow the one defined in the super // class. - // Failures that happen during TearDownTestSuite are logged but otherwise - // ignored. static void TearDownTestSuite() {} - // Legacy API is deprecated but still available + // Legacy API is deprecated but still available. Use SetUpTestSuite and + // TearDownTestSuite instead. #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ static void TearDownTestCase() {} static void SetUpTestCase() {} @@ -664,7 +677,7 @@ class GTEST_API_ TestResult { // Protects mutable state of the property vector and of owned // properties, whose values may be updated. - internal::Mutex test_properites_mutex_; + internal::Mutex test_properties_mutex_; // The vector of TestPartResults std::vector<TestPartResult> test_part_results_; @@ -794,6 +807,9 @@ class GTEST_API_ TestInfo { // deletes it. void Run(); + // Skip and records the test result for this object. + void Skip(); + static void ClearTestResult(TestInfo* test_info) { test_info->result_.Clear(); } @@ -889,7 +905,9 @@ class GTEST_API_ TestSuite { bool Passed() const { return !Failed(); } // Returns true if and only if the test suite failed. - bool Failed() const { return failed_test_count() > 0; } + bool Failed() const { + return failed_test_count() > 0 || ad_hoc_test_result().Failed(); + } // Returns the elapsed time, in milliseconds. TimeInMillis elapsed_time() const { return elapsed_time_; } @@ -940,6 +958,9 @@ class GTEST_API_ TestSuite { // Runs every test in this TestSuite. void Run(); + // Skips the execution of tests under this TestSuite + void Skip(); + // Runs SetUpTestSuite() for this TestSuite. This wrapper is needed // for catching exceptions thrown from SetUpTestSuite(). void RunSetUpTestSuite() { @@ -1420,6 +1441,7 @@ class GTEST_API_ UnitTest { friend class internal::StreamingListenerTest; friend class internal::UnitTestRecordPropertyTestHelper; friend Environment* AddGlobalTestEnvironment(Environment* env); + friend std::set<std::string>* internal::GetIgnoredParameterizedTestSuites(); friend internal::UnitTestImpl* internal::GetUnitTestImpl(); friend void internal::ReportFailureInUnknownLocation( TestPartResult::Type result_type, @@ -1531,14 +1553,6 @@ AssertionResult CmpHelperEQ(const char* lhs_expression, return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs); } -// With this overloaded version, we allow anonymous enums to be used -// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums -// can be implicitly cast to BiggestInt. -GTEST_API_ AssertionResult CmpHelperEQ(const char* lhs_expression, - const char* rhs_expression, - BiggestInt lhs, - BiggestInt rhs); - class EqHelper { public: // This templatized version is for the general case. @@ -1595,11 +1609,6 @@ AssertionResult CmpHelperOpFailure(const char* expr1, const char* expr2, // ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste // of similar code. // -// For each templatized helper function, we also define an overloaded -// version for BiggestInt in order to reduce code bloat and allow -// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled -// with gcc 4. -// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. #define GTEST_IMPL_CMP_HELPER_(op_name, op)\ @@ -1611,22 +1620,20 @@ AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ } else {\ return CmpHelperOpFailure(expr1, expr2, val1, val2, #op);\ }\ -}\ -GTEST_API_ AssertionResult CmpHelper##op_name(\ - const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2) +} // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // Implements the helper function for {ASSERT|EXPECT}_NE -GTEST_IMPL_CMP_HELPER_(NE, !=); +GTEST_IMPL_CMP_HELPER_(NE, !=) // Implements the helper function for {ASSERT|EXPECT}_LE -GTEST_IMPL_CMP_HELPER_(LE, <=); +GTEST_IMPL_CMP_HELPER_(LE, <=) // Implements the helper function for {ASSERT|EXPECT}_LT -GTEST_IMPL_CMP_HELPER_(LT, <); +GTEST_IMPL_CMP_HELPER_(LT, <) // Implements the helper function for {ASSERT|EXPECT}_GE -GTEST_IMPL_CMP_HELPER_(GE, >=); +GTEST_IMPL_CMP_HELPER_(GE, >=) // Implements the helper function for {ASSERT|EXPECT}_GT -GTEST_IMPL_CMP_HELPER_(GT, >); +GTEST_IMPL_CMP_HELPER_(GT, >) #undef GTEST_IMPL_CMP_HELPER_ @@ -1803,12 +1810,6 @@ class GTEST_API_ AssertHelper { GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper); }; -enum GTestColor { COLOR_DEFAULT, COLOR_RED, COLOR_GREEN, COLOR_YELLOW }; - -GTEST_API_ GTEST_ATTRIBUTE_PRINTF_(2, 3) void ColoredPrintf(GTestColor color, - const char* fmt, - ...); - } // namespace internal // The pure interface class that all value-parameterized tests inherit from. @@ -1889,7 +1890,7 @@ class TestWithParam : public Test, public WithParamInterface<T> { // Skips test in runtime. // Skipping test aborts current function. // Skipped tests are neither successful nor failed. -#define GTEST_SKIP() GTEST_SKIP_("Skipped") +#define GTEST_SKIP() GTEST_SKIP_("") // ADD_FAILURE unconditionally adds a failure to the current test. // SUCCEED generates a success - it doesn't automatically make the @@ -1965,19 +1966,38 @@ class TestWithParam : public Test, public WithParamInterface<T> { // Boolean assertions. Condition can be either a Boolean expression or an // AssertionResult. For more information on how to use AssertionResult with // these macros see comments on that class. -#define EXPECT_TRUE(condition) \ +#define GTEST_EXPECT_TRUE(condition) \ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ GTEST_NONFATAL_FAILURE_) -#define EXPECT_FALSE(condition) \ +#define GTEST_EXPECT_FALSE(condition) \ GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ GTEST_NONFATAL_FAILURE_) -#define ASSERT_TRUE(condition) \ +#define GTEST_ASSERT_TRUE(condition) \ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ GTEST_FATAL_FAILURE_) -#define ASSERT_FALSE(condition) \ +#define GTEST_ASSERT_FALSE(condition) \ GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ GTEST_FATAL_FAILURE_) +// Define these macros to 1 to omit the definition of the corresponding +// EXPECT or ASSERT, which clashes with some users' own code. + +#if !GTEST_DONT_DEFINE_EXPECT_TRUE +#define EXPECT_TRUE(condition) GTEST_EXPECT_TRUE(condition) +#endif + +#if !GTEST_DONT_DEFINE_EXPECT_FALSE +#define EXPECT_FALSE(condition) GTEST_EXPECT_FALSE(condition) +#endif + +#if !GTEST_DONT_DEFINE_ASSERT_TRUE +#define ASSERT_TRUE(condition) GTEST_ASSERT_TRUE(condition) +#endif + +#if !GTEST_DONT_DEFINE_ASSERT_FALSE +#define ASSERT_FALSE(condition) GTEST_ASSERT_FALSE(condition) +#endif + // Macros for testing equalities and inequalities. // // * {ASSERT|EXPECT}_EQ(v1, v2): Tests that v1 == v2 @@ -2298,8 +2318,7 @@ class GTEST_API_ ScopedTrace { // to cause a compiler error. template <typename T1, typename T2> constexpr bool StaticAssertTypeEq() noexcept { - static_assert(std::is_same<T1, T2>::value, - "type1 and type2 are not the same type"); + static_assert(std::is_same<T1, T2>::value, "T1 and T2 are not the same type"); return true; } @@ -2365,9 +2384,11 @@ constexpr bool StaticAssertTypeEq() noexcept { // } // // GOOGLETEST_CM0011 DO NOT DELETE +#if !GTEST_DONT_DEFINE_TEST #define TEST_F(test_fixture, test_name)\ GTEST_TEST_(test_fixture, test_name, test_fixture, \ ::testing::internal::GetTypeId<test_fixture>()) +#endif // !GTEST_DONT_DEFINE_TEST // Returns a path to temporary directory. // Tries to determine an appropriate directory for the platform. @@ -2475,4 +2496,4 @@ inline int RUN_ALL_TESTS() { GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 -#endif // GTEST_INCLUDE_GTEST_GTEST_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_pred_impl.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_pred_impl.h index d514255c733..5029a9bb02a 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_pred_impl.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_pred_impl.h @@ -33,8 +33,8 @@ // Implements a family of generic predicate assertion macros. // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ -#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ +#define GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ #include "gtest/gtest.h" @@ -356,4 +356,4 @@ AssertionResult AssertPred5Helper(const char* pred_text, } // namespace testing -#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_prod.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_prod.h index e651671ebde..38b9d85a51e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_prod.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_prod.h @@ -31,8 +31,8 @@ // Google C++ Testing and Mocking Framework definitions useful in production code. // GOOGLETEST_CM0003 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_ -#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PROD_H_ +#define GOOGLETEST_INCLUDE_GTEST_GTEST_PROD_H_ // When you need to test the private or protected members of a class, // use the FRIEND_TEST macro to declare your tests as friends of the @@ -58,4 +58,4 @@ #define FRIEND_TEST(test_case_name, test_name)\ friend class test_case_name##_##test_name##_Test -#endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_PROD_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-port.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-port.h index cd85d956d2d..db02881c0c8 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-port.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-port.h @@ -31,7 +31,7 @@ // // ** Custom implementation starts here ** -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ +#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ -#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-printers.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-printers.h index eb4467abcab..b9495d83783 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-printers.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-printers.h @@ -36,7 +36,7 @@ // // ** Custom implementation starts here ** -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ +#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ -#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest.h index 4c8e07be23f..afaaf17ba28 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest.h @@ -31,7 +31,7 @@ // // ** Custom implementation starts here ** -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ +#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ -#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-death-test-internal.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-death-test-internal.h index 68bd3530618..490296dfad2 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-death-test-internal.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-death-test-internal.h @@ -33,8 +33,8 @@ // death tests. They are subject to change without notice. // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ +#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ #include "gtest/gtest-matchers.h" #include "gtest/internal/gtest-internal.h" @@ -301,4 +301,4 @@ InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag(); } // namespace internal } // namespace testing -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-filepath.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-filepath.h index c11b101516e..0c033abc34e 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-filepath.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-filepath.h @@ -37,8 +37,8 @@ // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ +#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ #include "gtest/internal/gtest-string.h" @@ -195,7 +195,7 @@ class GTEST_API_ FilePath { void Normalize(); - // Returns a pointer to the last occurence of a valid path separator in + // Returns a pointer to the last occurrence of a valid path separator in // the FilePath. On Windows, for example, both '/' and '\' are valid path // separators. Returns NULL if no path separator was found. const char* FindLastPathSeparator() const; @@ -208,4 +208,4 @@ class GTEST_API_ FilePath { GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-internal.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-internal.h index 94c816a28bd..f8cbdbd81d9 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-internal.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-internal.h @@ -34,8 +34,8 @@ // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ +#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ #include "gtest/internal/gtest-port.h" @@ -53,6 +53,7 @@ #include <ctype.h> #include <float.h> #include <string.h> +#include <cstdint> #include <iomanip> #include <limits> #include <map> @@ -78,9 +79,20 @@ #define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar // Stringifies its argument. -#define GTEST_STRINGIFY_(name) #name +// Work around a bug in visual studio which doesn't accept code like this: +// +// #define GTEST_STRINGIFY_(name) #name +// #define MACRO(a, b, c) ... GTEST_STRINGIFY_(a) ... +// MACRO(, x, y) +// +// Complaining about the argument to GTEST_STRINGIFY_ being empty. +// This is allowed by the spec. +#define GTEST_STRINGIFY_HELPER_(name, ...) #name +#define GTEST_STRINGIFY_(...) GTEST_STRINGIFY_HELPER_(__VA_ARGS__, ) -namespace proto2 { class Message; } +namespace proto2 { +class MessageLite; +} namespace testing { @@ -275,7 +287,7 @@ class FloatingPoint { // // See the following article for more details on ULP: // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ - static const size_t kMaxUlps = 4; + static const uint32_t kMaxUlps = 4; // Constructs a FloatingPoint from a raw floating-point number. // @@ -508,6 +520,7 @@ struct SuiteApiResolver : T { static SetUpTearDownSuiteFuncType GetSetUpCaseOrSuite(const char* filename, int line_num) { +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ SetUpTearDownSuiteFuncType test_case_fp = GetNotDefaultOrNull(&T::SetUpTestCase, &Test::SetUpTestCase); SetUpTearDownSuiteFuncType test_suite_fp = @@ -519,10 +532,16 @@ struct SuiteApiResolver : T { << filename << ":" << line_num; return test_case_fp != nullptr ? test_case_fp : test_suite_fp; +#else + (void)(filename); + (void)(line_num); + return &T::SetUpTestSuite; +#endif } static SetUpTearDownSuiteFuncType GetTearDownCaseOrSuite(const char* filename, int line_num) { +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ SetUpTearDownSuiteFuncType test_case_fp = GetNotDefaultOrNull(&T::TearDownTestCase, &Test::TearDownTestCase); SetUpTearDownSuiteFuncType test_suite_fp = @@ -534,6 +553,11 @@ struct SuiteApiResolver : T { << filename << ":" << line_num; return test_case_fp != nullptr ? test_case_fp : test_suite_fp; +#else + (void)(filename); + (void)(line_num); + return &T::TearDownTestSuite; +#endif } }; @@ -542,11 +566,11 @@ struct SuiteApiResolver : T { // // Arguments: // -// test_suite_name: name of the test suite +// test_suite_name: name of the test suite // name: name of the test -// type_param the name of the test's type parameter, or NULL if +// type_param: the name of the test's type parameter, or NULL if // this is not a typed or a type-parameterized test. -// value_param text representation of the test's value parameter, +// value_param: text representation of the test's value parameter, // or NULL if this is not a type-parameterized test. // code_location: code location where the test is defined // fixture_class_id: ID of the test fixture class @@ -566,8 +590,6 @@ GTEST_API_ TestInfo* MakeAndRegisterTestInfo( // and returns false. None of pstr, *pstr, and prefix can be NULL. GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr); -#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P - GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ /* class A needs to have dll-interface to be used by clients of class B */) @@ -607,8 +629,9 @@ class GTEST_API_ TypedTestSuitePState { // Verifies that registered_tests match the test names in // defined_test_names_; returns registered_tests if successful, or // aborts the program otherwise. - const char* VerifyRegisteredTestNames( - const char* file, int line, const char* registered_tests); + const char* VerifyRegisteredTestNames(const char* test_suite_name, + const char* file, int line, + const char* registered_tests); private: typedef ::std::map<std::string, CodeLocation> RegisteredTestsMap; @@ -662,7 +685,7 @@ struct NameGeneratorSelector { }; template <typename NameGenerator> -void GenerateNamesRecursively(Types0, std::vector<std::string>*, int) {} +void GenerateNamesRecursively(internal::None, std::vector<std::string>*, int) {} template <typename NameGenerator, typename Types> void GenerateNamesRecursively(Types, std::vector<std::string>* result, int i) { @@ -729,7 +752,7 @@ class TypeParameterizedTest { // The base case for the compile time recursion. template <GTEST_TEMPLATE_ Fixture, class TestSel> -class TypeParameterizedTest<Fixture, TestSel, Types0> { +class TypeParameterizedTest<Fixture, TestSel, internal::None> { public: static bool Register(const char* /*prefix*/, const CodeLocation&, const char* /*case_name*/, const char* /*test_names*/, @@ -740,6 +763,11 @@ class TypeParameterizedTest<Fixture, TestSel, Types0> { } }; +GTEST_API_ void RegisterTypeParameterizedTestSuite(const char* test_suite_name, + CodeLocation code_location); +GTEST_API_ void RegisterTypeParameterizedTestSuiteInstantiation( + const char* case_name); + // TypeParameterizedTestSuite<Fixture, Tests, Types>::Register() // registers *all combinations* of 'Tests' and 'Types' with Google // Test. The return value is insignificant - we just need to return @@ -752,6 +780,7 @@ class TypeParameterizedTestSuite { const char* test_names, const std::vector<std::string>& type_names = GenerateNames<DefaultNameGenerator, Types>()) { + RegisterTypeParameterizedTestSuiteInstantiation(case_name); std::string test_name = StripTrailingSpaces( GetPrefixUntilComma(test_names)); if (!state->TestExists(test_name)) { @@ -781,7 +810,7 @@ class TypeParameterizedTestSuite { // The base case for the compile time recursion. template <GTEST_TEMPLATE_ Fixture, typename Types> -class TypeParameterizedTestSuite<Fixture, Templates0, Types> { +class TypeParameterizedTestSuite<Fixture, internal::None, Types> { public: static bool Register(const char* /*prefix*/, const CodeLocation&, const TypedTestSuitePState* /*state*/, @@ -792,8 +821,6 @@ class TypeParameterizedTestSuite<Fixture, Templates0, Types> { } }; -#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P - // Returns the current OS stack trace as an std::string. // // The maximum number of stack frames to be included is specified by @@ -825,6 +852,16 @@ struct GTEST_API_ ConstCharPtr { const char* value; }; +// Helper for declaring std::string within 'if' statement +// in pre C++17 build environment. +struct TrueWithString { + TrueWithString() = default; + explicit TrueWithString(const char* str) : value(str) {} + explicit TrueWithString(const std::string& str) : value(str) {} + explicit operator bool() const { return true; } + std::string value; +}; + // A simple Linear Congruential Generator for generating random // numbers with a uniform distribution. Unlike rand() and srand(), it // doesn't use global state (and therefore can't interfere with user @@ -832,18 +869,18 @@ struct GTEST_API_ ConstCharPtr { // but it's good enough for our purposes. class GTEST_API_ Random { public: - static const UInt32 kMaxRange = 1u << 31; + static const uint32_t kMaxRange = 1u << 31; - explicit Random(UInt32 seed) : state_(seed) {} + explicit Random(uint32_t seed) : state_(seed) {} - void Reseed(UInt32 seed) { state_ = seed; } + void Reseed(uint32_t seed) { state_ = seed; } // Generates a random number from [0, range). Crashes if 'range' is // 0 or greater than kMaxRange. - UInt32 Generate(UInt32 range); + uint32_t Generate(uint32_t range); private: - UInt32 state_; + uint32_t state_; GTEST_DISALLOW_COPY_AND_ASSIGN_(Random); }; @@ -851,12 +888,34 @@ class GTEST_API_ Random { #define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \ typename std::remove_const<typename std::remove_reference<T>::type>::type -// IsAProtocolMessage<T>::value is a compile-time bool constant that's -// true if and only if T is type proto2::Message or a subclass of it. +// HasDebugStringAndShortDebugString<T>::value is a compile-time bool constant +// that's true if and only if T has methods DebugString() and ShortDebugString() +// that return std::string. template <typename T> -struct IsAProtocolMessage - : public bool_constant< - std::is_convertible<const T*, const ::proto2::Message*>::value> {}; +class HasDebugStringAndShortDebugString { + private: + template <typename C> + static auto CheckDebugString(C*) -> typename std::is_same< + std::string, decltype(std::declval<const C>().DebugString())>::type; + template <typename> + static std::false_type CheckDebugString(...); + + template <typename C> + static auto CheckShortDebugString(C*) -> typename std::is_same< + std::string, decltype(std::declval<const C>().ShortDebugString())>::type; + template <typename> + static std::false_type CheckShortDebugString(...); + + using HasDebugStringType = decltype(CheckDebugString<T>(nullptr)); + using HasShortDebugStringType = decltype(CheckShortDebugString<T>(nullptr)); + + public: + static constexpr bool value = + HasDebugStringType::value && HasShortDebugStringType::value; +}; + +template <typename T> +constexpr bool HasDebugStringAndShortDebugString<T>::value; // When the compiler sees expression IsContainerTest<C>(0), if C is an // STL-style container class, the first overload of IsContainerTest @@ -1092,8 +1151,6 @@ class NativeArray { const Element* array_; size_t size_; void (NativeArray::*clone_)(const Element*, size_t); - - GTEST_DISALLOW_ASSIGN_(NativeArray); }; // Backport of std::index_sequence. @@ -1117,32 +1174,44 @@ struct DoubleSequence<false, IndexSequence<I...>, sizeofT> { // Backport of std::make_index_sequence. // It uses O(ln(N)) instantiation depth. template <size_t N> -struct MakeIndexSequence - : DoubleSequence<N % 2 == 1, typename MakeIndexSequence<N / 2>::type, +struct MakeIndexSequenceImpl + : DoubleSequence<N % 2 == 1, typename MakeIndexSequenceImpl<N / 2>::type, N / 2>::type {}; template <> -struct MakeIndexSequence<0> : IndexSequence<> {}; +struct MakeIndexSequenceImpl<0> : IndexSequence<> {}; + +template <size_t N> +using MakeIndexSequence = typename MakeIndexSequenceImpl<N>::type; -// FIXME: This implementation of ElemFromList is O(1) in instantiation depth, -// but it is O(N^2) in total instantiations. Not sure if this is the best -// tradeoff, as it will make it somewhat slow to compile. -template <typename T, size_t, size_t> -struct ElemFromListImpl {}; +template <typename... T> +using IndexSequenceFor = typename MakeIndexSequence<sizeof...(T)>::type; + +template <size_t> +struct Ignore { + Ignore(...); // NOLINT +}; -template <typename T, size_t I> -struct ElemFromListImpl<T, I, I> { - using type = T; +template <typename> +struct ElemFromListImpl; +template <size_t... I> +struct ElemFromListImpl<IndexSequence<I...>> { + // We make Ignore a template to solve a problem with MSVC. + // A non-template Ignore would work fine with `decltype(Ignore(I))...`, but + // MSVC doesn't understand how to deal with that pack expansion. + // Use `0 * I` to have a single instantiation of Ignore. + template <typename R> + static R Apply(Ignore<0 * I>..., R (*)(), ...); }; -// Get the Nth element from T... -// It uses O(1) instantiation depth. -template <size_t N, typename I, typename... T> -struct ElemFromList; +template <size_t N, typename... T> +struct ElemFromList { + using type = + decltype(ElemFromListImpl<typename MakeIndexSequence<N>::type>::Apply( + static_cast<T (*)()>(nullptr)...)); +}; -template <size_t N, size_t... I, typename... T> -struct ElemFromList<N, IndexSequence<I...>, T...> - : ElemFromListImpl<T, N, I>... {}; +struct FlatTupleConstructTag {}; template <typename... T> class FlatTuple; @@ -1152,11 +1221,11 @@ struct FlatTupleElemBase; template <typename... T, size_t I> struct FlatTupleElemBase<FlatTuple<T...>, I> { - using value_type = - typename ElemFromList<I, typename MakeIndexSequence<sizeof...(T)>::type, - T...>::type; + using value_type = typename ElemFromList<I, T...>::type; FlatTupleElemBase() = default; - explicit FlatTupleElemBase(value_type t) : value(std::move(t)) {} + template <typename Arg> + explicit FlatTupleElemBase(FlatTupleConstructTag, Arg&& t) + : value(std::forward<Arg>(t)) {} value_type value; }; @@ -1168,13 +1237,35 @@ struct FlatTupleBase<FlatTuple<T...>, IndexSequence<Idx...>> : FlatTupleElemBase<FlatTuple<T...>, Idx>... { using Indices = IndexSequence<Idx...>; FlatTupleBase() = default; - explicit FlatTupleBase(T... t) - : FlatTupleElemBase<FlatTuple<T...>, Idx>(std::move(t))... {} + template <typename... Args> + explicit FlatTupleBase(FlatTupleConstructTag, Args&&... args) + : FlatTupleElemBase<FlatTuple<T...>, Idx>(FlatTupleConstructTag{}, + std::forward<Args>(args))... {} + + template <size_t I> + const typename ElemFromList<I, T...>::type& Get() const { + return FlatTupleElemBase<FlatTuple<T...>, I>::value; + } + + template <size_t I> + typename ElemFromList<I, T...>::type& Get() { + return FlatTupleElemBase<FlatTuple<T...>, I>::value; + } + + template <typename F> + auto Apply(F&& f) -> decltype(std::forward<F>(f)(this->Get<Idx>()...)) { + return std::forward<F>(f)(Get<Idx>()...); + } + + template <typename F> + auto Apply(F&& f) const -> decltype(std::forward<F>(f)(this->Get<Idx>()...)) { + return std::forward<F>(f)(Get<Idx>()...); + } }; // Analog to std::tuple but with different tradeoffs. // This class minimizes the template instantiation depth, thus allowing more -// elements that std::tuple would. std::tuple has been seen to require an +// elements than std::tuple would. std::tuple has been seen to require an // instantiation depth of more than 10x the number of elements in some // implementations. // FlatTuple and ElemFromList are not recursive and have a fixed depth @@ -1185,21 +1276,17 @@ template <typename... T> class FlatTuple : private FlatTupleBase<FlatTuple<T...>, typename MakeIndexSequence<sizeof...(T)>::type> { - using Indices = typename FlatTuple::FlatTupleBase::Indices; + using Indices = typename FlatTupleBase< + FlatTuple<T...>, typename MakeIndexSequence<sizeof...(T)>::type>::Indices; public: FlatTuple() = default; - explicit FlatTuple(T... t) : FlatTuple::FlatTupleBase(std::move(t)...) {} - - template <size_t I> - const typename ElemFromList<I, Indices, T...>::type& Get() const { - return static_cast<const FlatTupleElemBase<FlatTuple, I>*>(this)->value; - } + template <typename... Args> + explicit FlatTuple(FlatTupleConstructTag tag, Args&&... args) + : FlatTuple::FlatTupleBase(tag, std::forward<Args>(args)...) {} - template <size_t I> - typename ElemFromList<I, Indices, T...>::type& Get() { - return static_cast<FlatTupleElemBase<FlatTuple, I>*>(this)->value; - } + using FlatTuple::FlatTupleBase::Apply; + using FlatTuple::FlatTupleBase::Get; }; // Utility functions to be called with static_assert to induce deprecation @@ -1232,6 +1319,22 @@ constexpr bool InstantiateTypedTestCase_P_IsDeprecated() { return true; } } // namespace internal } // namespace testing +namespace std { +// Some standard library implementations use `struct tuple_size` and some use +// `class tuple_size`. Clang warns about the mismatch. +// https://reviews.llvm.org/D55466 +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmismatched-tags" +#endif +template <typename... Ts> +struct tuple_size<testing::internal::FlatTuple<Ts...>> + : std::integral_constant<size_t, sizeof...(Ts)> {}; +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +} // namespace std + #define GTEST_MESSAGE_AT_(file, line, message, result_type) \ ::testing::internal::AssertHelper(result_type, file, line, message) \ = ::testing::Message() @@ -1254,48 +1357,122 @@ constexpr bool InstantiateTypedTestCase_P_IsDeprecated() { return true; } // Suppress MSVC warning 4072 (unreachable code) for the code following // statement if it returns or throws (or doesn't return or throw in some // situations). +// NOTE: The "else" is important to keep this expansion to prevent a top-level +// "else" from attaching to our "if". #define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \ - if (::testing::internal::AlwaysTrue()) { statement; } + if (::testing::internal::AlwaysTrue()) { \ + statement; \ + } else /* NOLINT */ \ + static_assert(true, "") // User must have a semicolon after expansion. -#define GTEST_TEST_THROW_(statement, expected_exception, fail) \ - GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (::testing::internal::ConstCharPtr gtest_msg = "") { \ - bool gtest_caught_expected = false; \ - try { \ - GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ - } \ - catch (expected_exception const&) { \ - gtest_caught_expected = true; \ - } \ - catch (...) { \ - gtest_msg.value = \ - "Expected: " #statement " throws an exception of type " \ - #expected_exception ".\n Actual: it throws a different type."; \ - goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ - } \ - if (!gtest_caught_expected) { \ - gtest_msg.value = \ - "Expected: " #statement " throws an exception of type " \ - #expected_exception ".\n Actual: it throws nothing."; \ - goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ - } \ - } else \ - GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \ - fail(gtest_msg.value) +#if GTEST_HAS_EXCEPTIONS + +namespace testing { +namespace internal { + +class NeverThrown { + public: + const char* what() const noexcept { + return "this exception should never be thrown"; + } +}; + +} // namespace internal +} // namespace testing + +#if GTEST_HAS_RTTI + +#define GTEST_EXCEPTION_TYPE_(e) ::testing::internal::GetTypeName(typeid(e)) + +#else // GTEST_HAS_RTTI + +#define GTEST_EXCEPTION_TYPE_(e) \ + std::string { "an std::exception-derived error" } + +#endif // GTEST_HAS_RTTI + +#define GTEST_TEST_THROW_CATCH_STD_EXCEPTION_(statement, expected_exception) \ + catch (typename std::conditional< \ + std::is_same<typename std::remove_cv<typename std::remove_reference< \ + expected_exception>::type>::type, \ + std::exception>::value, \ + const ::testing::internal::NeverThrown&, const std::exception&>::type \ + e) { \ + gtest_msg.value = "Expected: " #statement \ + " throws an exception of type " #expected_exception \ + ".\n Actual: it throws "; \ + gtest_msg.value += GTEST_EXCEPTION_TYPE_(e); \ + gtest_msg.value += " with description \""; \ + gtest_msg.value += e.what(); \ + gtest_msg.value += "\"."; \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ + } + +#else // GTEST_HAS_EXCEPTIONS + +#define GTEST_TEST_THROW_CATCH_STD_EXCEPTION_(statement, expected_exception) + +#endif // GTEST_HAS_EXCEPTIONS + +#define GTEST_TEST_THROW_(statement, expected_exception, fail) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (::testing::internal::TrueWithString gtest_msg{}) { \ + bool gtest_caught_expected = false; \ + try { \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + } catch (expected_exception const&) { \ + gtest_caught_expected = true; \ + } \ + GTEST_TEST_THROW_CATCH_STD_EXCEPTION_(statement, expected_exception) \ + catch (...) { \ + gtest_msg.value = "Expected: " #statement \ + " throws an exception of type " #expected_exception \ + ".\n Actual: it throws a different type."; \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ + } \ + if (!gtest_caught_expected) { \ + gtest_msg.value = "Expected: " #statement \ + " throws an exception of type " #expected_exception \ + ".\n Actual: it throws nothing."; \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ + } \ + } else /*NOLINT*/ \ + GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__) \ + : fail(gtest_msg.value.c_str()) + +#if GTEST_HAS_EXCEPTIONS + +#define GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_() \ + catch (std::exception const& e) { \ + gtest_msg.value = "it throws "; \ + gtest_msg.value += GTEST_EXCEPTION_TYPE_(e); \ + gtest_msg.value += " with description \""; \ + gtest_msg.value += e.what(); \ + gtest_msg.value += "\"."; \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ + } + +#else // GTEST_HAS_EXCEPTIONS + +#define GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_() + +#endif // GTEST_HAS_EXCEPTIONS #define GTEST_TEST_NO_THROW_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (::testing::internal::AlwaysTrue()) { \ + if (::testing::internal::TrueWithString gtest_msg{}) { \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ + GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_() \ catch (...) { \ + gtest_msg.value = "it throws."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \ - fail("Expected: " #statement " doesn't throw an exception.\n" \ - " Actual: it throws.") + fail(("Expected: " #statement " doesn't throw an exception.\n" \ + " Actual: " + gtest_msg.value).c_str()) #define GTEST_TEST_ANY_THROW_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ @@ -1318,7 +1495,7 @@ constexpr bool InstantiateTypedTestCase_P_IsDeprecated() { return true; } // Implements Boolean test assertions such as EXPECT_TRUE. expression can be // either a boolean expression or an AssertionResult. text is a textual -// represenation of expression as it was passed into the EXPECT_TRUE. +// representation of expression as it was passed into the EXPECT_TRUE. #define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (const ::testing::AssertionResult gtest_ar_ = \ @@ -1355,13 +1532,16 @@ constexpr bool InstantiateTypedTestCase_P_IsDeprecated() { return true; } class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ : public parent_class { \ public: \ - GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \ + GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() = default; \ + ~GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() override = default; \ + GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \ + test_name)); \ + GTEST_DISALLOW_MOVE_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \ + test_name)); \ \ private: \ - virtual void TestBody(); \ + void TestBody() override; \ static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_; \ - GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \ - test_name)); \ }; \ \ ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name, \ @@ -1377,4 +1557,4 @@ constexpr bool InstantiateTypedTestCase_P_IsDeprecated() { return true; } test_suite_name, test_name)>); \ void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody() -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-param-util.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-param-util.h index 97533993c0c..c2ef6e3124b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-param-util.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-param-util.h @@ -32,8 +32,8 @@ // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ +#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ #include <ctype.h> @@ -42,12 +42,14 @@ #include <memory> #include <set> #include <tuple> +#include <type_traits> #include <utility> #include <vector> #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-port.h" #include "gtest/gtest-printers.h" +#include "gtest/gtest-test-part.h" namespace testing { // Input to a parameterized test name generator, describing a test parameter. @@ -457,7 +459,7 @@ class ParameterizedTestSuiteInfoBase { // Base part of test suite name for display purposes. virtual const std::string& GetTestSuiteName() const = 0; - // Test case id to verify identity. + // Test suite id to verify identity. virtual TypeId GetTestSuiteTypeId() const = 0; // UnitTest class invokes this method to register tests in this // test suite right before running them in RUN_ALL_TESTS macro. @@ -474,6 +476,17 @@ class ParameterizedTestSuiteInfoBase { // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // +// Report a the name of a test_suit as safe to ignore +// as the side effect of construction of this type. +struct GTEST_API_ MarkAsIgnored { + explicit MarkAsIgnored(const char* test_suite); +}; + +GTEST_API_ void InsertSyntheticTestCase(const std::string& name, + CodeLocation location, bool has_test_p); + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// // ParameterizedTestSuiteInfo accumulates tests obtained from TEST_P // macro invocations for a particular test suite and generators // obtained from INSTANTIATE_TEST_SUITE_P macro invocations for that @@ -494,11 +507,11 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { CodeLocation code_location) : test_suite_name_(name), code_location_(code_location) {} - // Test case base name for display purposes. + // Test suite base name for display purposes. const std::string& GetTestSuiteName() const override { return test_suite_name_; } - // Test case id to verify identity. + // Test suite id to verify identity. TypeId GetTestSuiteTypeId() const override { return GetTypeId<TestSuite>(); } // TEST_P macro uses AddTestPattern() to record information // about a single test in a LocalTestInfo structure. @@ -507,9 +520,10 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is // test suite base name and DoBar is test base name. void AddTestPattern(const char* test_suite_name, const char* test_base_name, - TestMetaFactoryBase<ParamType>* meta_factory) { - tests_.push_back(std::shared_ptr<TestInfo>( - new TestInfo(test_suite_name, test_base_name, meta_factory))); + TestMetaFactoryBase<ParamType>* meta_factory, + CodeLocation code_location) { + tests_.push_back(std::shared_ptr<TestInfo>(new TestInfo( + test_suite_name, test_base_name, meta_factory, code_location))); } // INSTANTIATE_TEST_SUITE_P macro uses AddGenerator() to record information // about a generator. @@ -522,11 +536,13 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { return 0; // Return value used only to run this method in namespace scope. } // UnitTest class invokes this method to register tests in this test suite - // test suites right before running tests in RUN_ALL_TESTS macro. + // right before running tests in RUN_ALL_TESTS macro. // This method should not be called more than once on any single // instance of a ParameterizedTestSuiteInfoBase derived class. // UnitTest has a guard to prevent from calling this method more than once. void RegisterTests() override { + bool generated_instantiations = false; + for (typename TestInfoContainer::iterator test_it = tests_.begin(); test_it != tests_.end(); ++test_it) { std::shared_ptr<TestInfo> test_info = *test_it; @@ -549,6 +565,8 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { for (typename ParamGenerator<ParamType>::iterator param_it = generator.begin(); param_it != generator.end(); ++param_it, ++i) { + generated_instantiations = true; + Message test_name_stream; std::string param_name = name_func( @@ -572,7 +590,7 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { MakeAndRegisterTestInfo( test_suite_name.c_str(), test_name_stream.GetString().c_str(), nullptr, // No type parameter. - PrintToString(*param_it).c_str(), code_location_, + PrintToString(*param_it).c_str(), test_info->code_location, GetTestSuiteTypeId(), SuiteApiResolver<TestSuite>::GetSetUpCaseOrSuite(file, line), SuiteApiResolver<TestSuite>::GetTearDownCaseOrSuite(file, line), @@ -580,6 +598,12 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { } // for param_it } // for gen_it } // for test_it + + if (!generated_instantiations) { + // There are no generaotrs, or they all generate nothing ... + InsertSyntheticTestCase(GetTestSuiteName(), code_location_, + !tests_.empty()); + } } // RegisterTests private: @@ -587,14 +611,17 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { // with TEST_P macro. struct TestInfo { TestInfo(const char* a_test_suite_base_name, const char* a_test_base_name, - TestMetaFactoryBase<ParamType>* a_test_meta_factory) + TestMetaFactoryBase<ParamType>* a_test_meta_factory, + CodeLocation a_code_location) : test_suite_base_name(a_test_suite_base_name), test_base_name(a_test_base_name), - test_meta_factory(a_test_meta_factory) {} + test_meta_factory(a_test_meta_factory), + code_location(a_code_location) {} const std::string test_suite_base_name; const std::string test_base_name; const std::unique_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory; + const CodeLocation code_location; }; using TestInfoContainer = ::std::vector<std::shared_ptr<TestInfo> >; // Records data received from INSTANTIATE_TEST_SUITE_P macros: @@ -627,7 +654,7 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { // Check for invalid characters for (std::string::size_type index = 0; index < name.size(); ++index) { - if (!isalnum(name[index]) && name[index] != '_') + if (!IsAlNum(name[index]) && name[index] != '_') return false; } @@ -717,6 +744,34 @@ class ParameterizedTestSuiteRegistry { GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteRegistry); }; +// Keep track of what type-parameterized test suite are defined and +// where as well as which are intatiated. This allows susequently +// identifying suits that are defined but never used. +class TypeParameterizedTestSuiteRegistry { + public: + // Add a suite definition + void RegisterTestSuite(const char* test_suite_name, + CodeLocation code_location); + + // Add an instantiation of a suit. + void RegisterInstantiation(const char* test_suite_name); + + // For each suit repored as defined but not reported as instantiation, + // emit a test that reports that fact (configurably, as an error). + void CheckForInstantiations(); + + private: + struct TypeParameterizedTestSuiteInfo { + explicit TypeParameterizedTestSuiteInfo(CodeLocation c) + : code_location(c), instantiated(false) {} + + CodeLocation code_location; + bool instantiated; + }; + + std::map<std::string, TypeParameterizedTestSuiteInfo> suites_; +}; + } // namespace internal // Forward declarations of ValuesIn(), which is implemented in @@ -728,10 +783,15 @@ internal::ParamGenerator<typename Container::value_type> ValuesIn( namespace internal { // Used in the Values() function to provide polymorphic capabilities. +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4100) +#endif + template <typename... Ts> class ValueArray { public: - ValueArray(Ts... v) : v_{std::move(v)...} {} + explicit ValueArray(Ts... v) : v_(FlatTupleConstructTag{}, std::move(v)...) {} template <typename T> operator ParamGenerator<T>() const { // NOLINT @@ -747,6 +807,10 @@ class ValueArray { FlatTuple<Ts...> v_; }; +#ifdef _MSC_VER +#pragma warning(pop) +#endif + template <typename... T> class CartesianProductGenerator : public ParamGeneratorInterface<::std::tuple<T...>> { @@ -880,4 +944,4 @@ class CartesianProductHolder { } // namespace internal } // namespace testing -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port-arch.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port-arch.h index cece93dba12..dd845915e3c 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port-arch.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port-arch.h @@ -32,8 +32,8 @@ // This header file defines the GTEST_OS_* macro. // It is separate from gtest-port.h so that custom/gtest-port.h can include it. -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ +#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ // Determines the platform on which Google Test is compiled. #ifdef __CYGWIN__ @@ -68,6 +68,7 @@ # define GTEST_OS_OS2 1 #elif defined __APPLE__ # define GTEST_OS_MAC 1 +# include <TargetConditionals.h> # if TARGET_OS_IPHONE # define GTEST_OS_IOS 1 # endif @@ -102,6 +103,12 @@ # define GTEST_OS_QNX 1 #elif defined(__HAIKU__) #define GTEST_OS_HAIKU 1 +#elif defined ESP8266 +#define GTEST_OS_ESP8266 1 +#elif defined ESP32 +#define GTEST_OS_ESP32 1 +#elif defined(__XTENSA__) +#define GTEST_OS_XTENSA 1 #endif // __CYGWIN__ -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port.h index 063fcb1083b..0953a781c05 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port.h @@ -40,8 +40,8 @@ // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ +#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ // Environment-describing macros // ----------------------------- @@ -190,13 +190,27 @@ // GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning. // GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a // variable don't have to be used. -// GTEST_DISALLOW_ASSIGN_ - disables operator=. +// GTEST_DISALLOW_ASSIGN_ - disables copy operator=. // GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=. +// GTEST_DISALLOW_MOVE_ASSIGN_ - disables move operator=. +// GTEST_DISALLOW_MOVE_AND_ASSIGN_ - disables move ctor and operator=. // GTEST_MUST_USE_RESULT_ - declares that a function's result must be used. // GTEST_INTENTIONAL_CONST_COND_PUSH_ - start code section where MSVC C4127 is // suppressed (constant conditional). // GTEST_INTENTIONAL_CONST_COND_POP_ - finish code section where MSVC C4127 // is suppressed. +// GTEST_INTERNAL_HAS_ANY - for enabling UniversalPrinter<std::any> or +// UniversalPrinter<absl::any> specializations. +// GTEST_INTERNAL_HAS_OPTIONAL - for enabling UniversalPrinter<std::optional> +// or +// UniversalPrinter<absl::optional> +// specializations. +// GTEST_INTERNAL_HAS_STRING_VIEW - for enabling Matcher<std::string_view> or +// Matcher<absl::string_view> +// specializations. +// GTEST_INTERNAL_HAS_VARIANT - for enabling UniversalPrinter<std::variant> or +// UniversalPrinter<absl::variant> +// specializations. // // Synchronization: // Mutex, MutexLock, ThreadLocal, GetThreadCount() @@ -223,8 +237,7 @@ // // Integer types: // TypeWithSize - maps an integer to a int type. -// Int32, UInt32, Int64, UInt64, TimeInMillis -// - integers of known sizes. +// TimeInMillis - integers of known sizes. // BiggestInt - the biggest signed integer type. // // Command-line utilities: @@ -235,7 +248,7 @@ // Environment variable utilities: // GetEnv() - gets the value of an environment variable. // BoolFromGTestEnv() - parses a bool environment variable. -// Int32FromGTestEnv() - parses an Int32 environment variable. +// Int32FromGTestEnv() - parses an int32_t environment variable. // StringFromGTestEnv() - parses a string environment variable. // // Deprecation warnings: @@ -248,7 +261,10 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <memory> + +#include <cerrno> +#include <cstdint> +#include <limits> #include <type_traits> #ifndef _WIN32_WCE @@ -261,16 +277,15 @@ # include <TargetConditionals.h> #endif -#include <algorithm> // NOLINT -#include <iostream> // NOLINT -#include <sstream> // NOLINT -#include <string> // NOLINT +#include <iostream> // NOLINT +#include <locale> +#include <memory> +#include <string> // NOLINT #include <tuple> -#include <utility> #include <vector> // NOLINT -#include "gtest/internal/gtest-port-arch.h" #include "gtest/internal/custom/gtest-port.h" +#include "gtest/internal/gtest-port-arch.h" #if !defined(GTEST_DEV_EMAIL_) # define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" @@ -344,6 +359,10 @@ typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION; // WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION. typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; #endif +#elif GTEST_OS_XTENSA +#include <unistd.h> +// Xtensa toolchains define strcasecmp in the string.h header instead of +// strings.h. string.h is already included. #else // This assumes that non-Windows OSes provide unistd.h. For OSes where this // is not the case, we need to include headers that provide the functions @@ -364,7 +383,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; // On Android, <regex.h> is only available starting with Gingerbread. # define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9) # else -# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS) +#define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS && !GTEST_OS_XTENSA) # endif #endif @@ -441,15 +460,6 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; # endif // defined(_MSC_VER) || defined(__BORLANDC__) #endif // GTEST_HAS_EXCEPTIONS -#if !defined(GTEST_HAS_STD_STRING) -// Even though we don't use this macro any longer, we keep it in case -// some clients still depend on it. -# define GTEST_HAS_STD_STRING 1 -#elif !GTEST_HAS_STD_STRING -// The user told us that ::std::string isn't available. -# error "::std::string isn't available." -#endif // !defined(GTEST_HAS_STD_STRING) - #ifndef GTEST_HAS_STD_WSTRING // The user didn't tell us whether ::std::wstring is available, so we need // to figure it out. @@ -458,7 +468,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; // no support for it at least as recent as Froyo (2.2). #define GTEST_HAS_STD_WSTRING \ (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ - GTEST_OS_HAIKU)) + GTEST_OS_HAIKU || GTEST_OS_ESP32 || GTEST_OS_ESP8266 || GTEST_OS_XTENSA)) #endif // GTEST_HAS_STD_WSTRING @@ -582,7 +592,8 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; #ifndef GTEST_HAS_STREAM_REDIRECTION // By default, we assume that stream redirection is supported on all // platforms except known mobile ones. -# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT +#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \ + GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_XTENSA # define GTEST_HAS_STREAM_REDIRECTION 0 # else # define GTEST_HAS_STREAM_REDIRECTION 1 @@ -676,16 +687,27 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; #endif -// A macro to disallow operator= +// A macro to disallow copy operator= // This should be used in the private: declarations for a class. #define GTEST_DISALLOW_ASSIGN_(type) \ - void operator=(type const &) = delete + type& operator=(type const &) = delete // A macro to disallow copy constructor and operator= // This should be used in the private: declarations for a class. #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \ - type(type const &) = delete; \ - GTEST_DISALLOW_ASSIGN_(type) + type(type const&) = delete; \ + type& operator=(type const&) = delete + +// A macro to disallow move operator= +// This should be used in the private: declarations for a class. +#define GTEST_DISALLOW_MOVE_ASSIGN_(type) \ + type& operator=(type &&) noexcept = delete + +// A macro to disallow move constructor and operator= +// This should be used in the private: declarations for a class. +#define GTEST_DISALLOW_MOVE_AND_ASSIGN_(type) \ + type(type&&) noexcept = delete; \ + type& operator=(type&&) noexcept = delete // Tell the compiler to warn about unused return values for functions declared // with this macro. The macro should be used on function declarations @@ -856,9 +878,6 @@ class Secret; // expression is false, compiler will issue an error containing this identifier. #define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg) -// Evaluates to the number of elements in 'array'. -#define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0])) - // A helper for suppressing warnings on constant condition. It just // returns 'condition'. GTEST_API_ bool IsTrue(bool condition); @@ -915,8 +934,6 @@ class GTEST_API_ RE { const char* full_pattern_; // For FullMatch(); # endif - - GTEST_DISALLOW_ASSIGN_(RE); }; #endif // GTEST_USES_PCRE @@ -1599,7 +1616,7 @@ class ThreadLocal : public ThreadLocalBase { class DefaultValueHolderFactory : public ValueHolderFactory { public: DefaultValueHolderFactory() {} - virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); } + ValueHolder* MakeNewHolder() const override { return new ValueHolder(); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory); @@ -1608,7 +1625,7 @@ class ThreadLocal : public ThreadLocalBase { class InstanceValueHolderFactory : public ValueHolderFactory { public: explicit InstanceValueHolderFactory(const T& value) : value_(value) {} - virtual ValueHolder* MakeNewHolder() const { + ValueHolder* MakeNewHolder() const override { return new ValueHolder(value_); } @@ -1808,7 +1825,7 @@ class GTEST_API_ ThreadLocal { class DefaultValueHolderFactory : public ValueHolderFactory { public: DefaultValueHolderFactory() {} - virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); } + ValueHolder* MakeNewHolder() const override { return new ValueHolder(); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory); @@ -1817,7 +1834,7 @@ class GTEST_API_ ThreadLocal { class InstanceValueHolderFactory : public ValueHolderFactory { public: explicit InstanceValueHolderFactory(const T& value) : value_(value) {} - virtual ValueHolder* MakeNewHolder() const { + ValueHolder* MakeNewHolder() const override { return new ValueHolder(value_); } @@ -1887,18 +1904,12 @@ class GTEST_API_ ThreadLocal { // we cannot detect it. GTEST_API_ size_t GetThreadCount(); -template <bool B> -using bool_constant = std::integral_constant<bool, B>; - #if GTEST_OS_WINDOWS # define GTEST_PATH_SEP_ "\\" # define GTEST_HAS_ALT_PATH_SEP_ 1 -// The biggest signed integer type the compiler supports. -typedef __int64 BiggestInt; #else # define GTEST_PATH_SEP_ "/" # define GTEST_HAS_ALT_PATH_SEP_ 0 -typedef long long BiggestInt; // NOLINT #endif // GTEST_OS_WINDOWS // Utilities for char. @@ -1929,6 +1940,19 @@ inline bool IsUpper(char ch) { inline bool IsXDigit(char ch) { return isxdigit(static_cast<unsigned char>(ch)) != 0; } +#ifdef __cpp_char8_t +inline bool IsXDigit(char8_t ch) { + return isxdigit(static_cast<unsigned char>(ch)) != 0; +} +#endif +inline bool IsXDigit(char16_t ch) { + const unsigned char low_byte = static_cast<unsigned char>(ch); + return ch == low_byte && isxdigit(low_byte) != 0; +} +inline bool IsXDigit(char32_t ch) { + const unsigned char low_byte = static_cast<unsigned char>(ch); + return ch == low_byte && isxdigit(low_byte) != 0; +} inline bool IsXDigit(wchar_t ch) { const unsigned char low_byte = static_cast<unsigned char>(ch); return ch == low_byte && isxdigit(low_byte) != 0; @@ -1963,16 +1987,16 @@ namespace posix { typedef struct _stat StatStruct; # ifdef __BORLANDC__ -inline int IsATTY(int fd) { return isatty(fd); } +inline int DoIsATTY(int fd) { return isatty(fd); } inline int StrCaseCmp(const char* s1, const char* s2) { return stricmp(s1, s2); } inline char* StrDup(const char* src) { return strdup(src); } # else // !__BORLANDC__ # if GTEST_OS_WINDOWS_MOBILE -inline int IsATTY(int /* fd */) { return 0; } +inline int DoIsATTY(int /* fd */) { return 0; } # else -inline int IsATTY(int fd) { return _isatty(fd); } +inline int DoIsATTY(int fd) { return _isatty(fd); } # endif // GTEST_OS_WINDOWS_MOBILE inline int StrCaseCmp(const char* s1, const char* s2) { return _stricmp(s1, s2); @@ -1993,12 +2017,28 @@ inline bool IsDir(const StatStruct& st) { } # endif // GTEST_OS_WINDOWS_MOBILE +#elif GTEST_OS_ESP8266 +typedef struct stat StatStruct; + +inline int FileNo(FILE* file) { return fileno(file); } +inline int DoIsATTY(int fd) { return isatty(fd); } +inline int Stat(const char* path, StatStruct* buf) { + // stat function not implemented on ESP8266 + return 0; +} +inline int StrCaseCmp(const char* s1, const char* s2) { + return strcasecmp(s1, s2); +} +inline char* StrDup(const char* src) { return strdup(src); } +inline int RmDir(const char* dir) { return rmdir(dir); } +inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } + #else typedef struct stat StatStruct; inline int FileNo(FILE* file) { return fileno(file); } -inline int IsATTY(int fd) { return isatty(fd); } +inline int DoIsATTY(int fd) { return isatty(fd); } inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); } inline int StrCaseCmp(const char* s1, const char* s2) { return strcasecmp(s1, s2); @@ -2009,23 +2049,39 @@ inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } #endif // GTEST_OS_WINDOWS +inline int IsATTY(int fd) { + // DoIsATTY might change errno (for example ENOTTY in case you redirect stdout + // to a file on Linux), which is unexpected, so save the previous value, and + // restore it after the call. + int savedErrno = errno; + int isAttyValue = DoIsATTY(fd); + errno = savedErrno; + + return isAttyValue; +} + // Functions deprecated by MSVC 8.0. GTEST_DISABLE_MSC_DEPRECATED_PUSH_() -inline const char* StrNCpy(char* dest, const char* src, size_t n) { - return strncpy(dest, src, n); -} - // ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and // StrError() aren't needed on Windows CE at this time and thus not // defined there. -#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT +#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && \ + !GTEST_OS_WINDOWS_RT && !GTEST_OS_ESP8266 && !GTEST_OS_XTENSA inline int ChDir(const char* dir) { return chdir(dir); } #endif inline FILE* FOpen(const char* path, const char* mode) { +#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW + struct wchar_codecvt : public std::codecvt<wchar_t, char, std::mbstate_t> {}; + std::wstring_convert<wchar_codecvt> converter; + std::wstring wide_path = converter.from_bytes(path); + std::wstring wide_mode = converter.from_bytes(mode); + return _wfopen(wide_path.c_str(), wide_mode.c_str()); +#else // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW return fopen(path, mode); +#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW } #if !GTEST_OS_WINDOWS_MOBILE inline FILE *FReopen(const char* path, const char* mode, FILE* stream) { @@ -2045,8 +2101,9 @@ inline int Close(int fd) { return close(fd); } inline const char* StrError(int errnum) { return strerror(errnum); } #endif inline const char* GetEnv(const char* name) { -#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT - // We are on Windows CE, which has no environment variables. +#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \ + GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_XTENSA + // We are on an embedded platform, which has no environment variables. static_cast<void>(name); // To prevent 'unused argument' warning. return nullptr; #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) @@ -2088,15 +2145,13 @@ GTEST_DISABLE_MSC_DEPRECATED_POP_() # define GTEST_SNPRINTF_ snprintf #endif -// The maximum number a BiggestInt can represent. This definition -// works no matter BiggestInt is represented in one's complement or -// two's complement. +// The biggest signed integer type the compiler supports. // -// We cannot rely on numeric_limits in STL, as __int64 and long long -// are not part of standard C++ and numeric_limits doesn't need to be -// defined for them. -const BiggestInt kMaxBiggestInt = - ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1)); +// long long is guaranteed to be at least 64-bits in C++11. +using BiggestInt = long long; // NOLINT + +// The maximum number a BiggestInt can represent. +constexpr BiggestInt kMaxBiggestInt = (std::numeric_limits<BiggestInt>::max)(); // This template class serves as a compile-time function from size to // type. It maps a size in bytes to a primitive type with that @@ -2121,40 +2176,27 @@ class TypeWithSize { public: // This prevents the user from using TypeWithSize<N> with incorrect // values of N. - typedef void UInt; + using UInt = void; }; // The specialization for size 4. template <> class TypeWithSize<4> { public: - // unsigned int has size 4 in both gcc and MSVC. - // - // As base/basictypes.h doesn't compile on Windows, we cannot use - // uint32, uint64, and etc here. - typedef int Int; - typedef unsigned int UInt; + using Int = std::int32_t; + using UInt = std::uint32_t; }; // The specialization for size 8. template <> class TypeWithSize<8> { public: -#if GTEST_OS_WINDOWS - typedef __int64 Int; - typedef unsigned __int64 UInt; -#else - typedef long long Int; // NOLINT - typedef unsigned long long UInt; // NOLINT -#endif // GTEST_OS_WINDOWS + using Int = std::int64_t; + using UInt = std::uint64_t; }; // Integer types of known sizes. -typedef TypeWithSize<4>::Int Int32; -typedef TypeWithSize<4>::UInt UInt32; -typedef TypeWithSize<8>::Int Int64; -typedef TypeWithSize<8>::UInt UInt64; -typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds. +using TimeInMillis = int64_t; // Represents time in milliseconds. // Utilities for command line flags and environment variables. @@ -2173,7 +2215,7 @@ typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds. // Macros for declaring flags. # define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name) # define GTEST_DECLARE_int32_(name) \ - GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name) + GTEST_API_ extern std::int32_t GTEST_FLAG(name) # define GTEST_DECLARE_string_(name) \ GTEST_API_ extern ::std::string GTEST_FLAG(name) @@ -2181,7 +2223,7 @@ typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds. # define GTEST_DEFINE_bool_(name, default_val, doc) \ GTEST_API_ bool GTEST_FLAG(name) = (default_val) # define GTEST_DEFINE_int32_(name, default_val, doc) \ - GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val) + GTEST_API_ std::int32_t GTEST_FLAG(name) = (default_val) # define GTEST_DEFINE_string_(name, default_val, doc) \ GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val) @@ -2196,12 +2238,13 @@ typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds. // Parses 'str' for a 32-bit signed integer. If successful, writes the result // to *value and returns true; otherwise leaves *value unchanged and returns // false. -bool ParseInt32(const Message& src_text, const char* str, Int32* value); +GTEST_API_ bool ParseInt32(const Message& src_text, const char* str, + int32_t* value); -// Parses a bool/Int32/string from the environment variable +// Parses a bool/int32_t/string from the environment variable // corresponding to the given Google Test flag. bool BoolFromGTestEnv(const char* flag, bool default_val); -GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val); +GTEST_API_ int32_t Int32FromGTestEnv(const char* flag, int32_t default_val); std::string OutputFlagAlsoCheckEnvVar(); const char* StringFromGTestEnv(const char* flag, const char* default_val); @@ -2228,4 +2271,119 @@ const char* StringFromGTestEnv(const char* flag, const char* default_val); #endif // !defined(GTEST_INTERNAL_DEPRECATED) -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ +#if GTEST_HAS_ABSL +// Always use absl::any for UniversalPrinter<> specializations if googletest +// is built with absl support. +#define GTEST_INTERNAL_HAS_ANY 1 +#include "absl/types/any.h" +namespace testing { +namespace internal { +using Any = ::absl::any; +} // namespace internal +} // namespace testing +#else +#ifdef __has_include +#if __has_include(<any>) && __cplusplus >= 201703L +// Otherwise for C++17 and higher use std::any for UniversalPrinter<> +// specializations. +#define GTEST_INTERNAL_HAS_ANY 1 +#include <any> +namespace testing { +namespace internal { +using Any = ::std::any; +} // namespace internal +} // namespace testing +// The case where absl is configured NOT to alias std::any is not +// supported. +#endif // __has_include(<any>) && __cplusplus >= 201703L +#endif // __has_include +#endif // GTEST_HAS_ABSL + +#if GTEST_HAS_ABSL +// Always use absl::optional for UniversalPrinter<> specializations if +// googletest is built with absl support. +#define GTEST_INTERNAL_HAS_OPTIONAL 1 +#include "absl/types/optional.h" +namespace testing { +namespace internal { +template <typename T> +using Optional = ::absl::optional<T>; +} // namespace internal +} // namespace testing +#else +#ifdef __has_include +#if __has_include(<optional>) && __cplusplus >= 201703L +// Otherwise for C++17 and higher use std::optional for UniversalPrinter<> +// specializations. +#define GTEST_INTERNAL_HAS_OPTIONAL 1 +#include <optional> +namespace testing { +namespace internal { +template <typename T> +using Optional = ::std::optional<T>; +} // namespace internal +} // namespace testing +// The case where absl is configured NOT to alias std::optional is not +// supported. +#endif // __has_include(<optional>) && __cplusplus >= 201703L +#endif // __has_include +#endif // GTEST_HAS_ABSL + +#if GTEST_HAS_ABSL +// Always use absl::string_view for Matcher<> specializations if googletest +// is built with absl support. +# define GTEST_INTERNAL_HAS_STRING_VIEW 1 +#include "absl/strings/string_view.h" +namespace testing { +namespace internal { +using StringView = ::absl::string_view; +} // namespace internal +} // namespace testing +#else +# ifdef __has_include +# if __has_include(<string_view>) && __cplusplus >= 201703L +// Otherwise for C++17 and higher use std::string_view for Matcher<> +// specializations. +# define GTEST_INTERNAL_HAS_STRING_VIEW 1 +#include <string_view> +namespace testing { +namespace internal { +using StringView = ::std::string_view; +} // namespace internal +} // namespace testing +// The case where absl is configured NOT to alias std::string_view is not +// supported. +# endif // __has_include(<string_view>) && __cplusplus >= 201703L +# endif // __has_include +#endif // GTEST_HAS_ABSL + +#if GTEST_HAS_ABSL +// Always use absl::variant for UniversalPrinter<> specializations if googletest +// is built with absl support. +#define GTEST_INTERNAL_HAS_VARIANT 1 +#include "absl/types/variant.h" +namespace testing { +namespace internal { +template <typename... T> +using Variant = ::absl::variant<T...>; +} // namespace internal +} // namespace testing +#else +#ifdef __has_include +#if __has_include(<variant>) && __cplusplus >= 201703L +// Otherwise for C++17 and higher use std::variant for UniversalPrinter<> +// specializations. +#define GTEST_INTERNAL_HAS_VARIANT 1 +#include <variant> +namespace testing { +namespace internal { +template <typename... T> +using Variant = ::std::variant<T...>; +} // namespace internal +} // namespace testing +// The case where absl is configured NOT to alias std::variant is not supported. +#endif // __has_include(<variant>) && __cplusplus >= 201703L +#endif // __has_include +#endif // GTEST_HAS_ABSL + +#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-string.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-string.h index 82aaa63bf46..10f774f9660 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-string.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-string.h @@ -38,8 +38,8 @@ // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ +#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ #ifdef __BORLANDC__ // string.h is not guaranteed to provide strcpy on C++ Builder. @@ -47,6 +47,7 @@ #endif #include <string.h> +#include <cstdint> #include <string> #include "gtest/internal/gtest-port.h" @@ -148,11 +149,14 @@ class GTEST_API_ String { // Formats an int value as "%02d". static std::string FormatIntWidth2(int value); // "%02d" for width == 2 + // Formats an int value to given width with leading zeros. + static std::string FormatIntWidthN(int value, int width); + // Formats an int value as "%X". static std::string FormatHexInt(int value); // Formats an int value as "%X". - static std::string FormatHexUInt32(UInt32 value); + static std::string FormatHexUInt32(uint32_t value); // Formats a byte as "%02X". static std::string FormatByte(unsigned char value); @@ -168,4 +172,4 @@ GTEST_API_ std::string StringStreamToString(::std::stringstream* stream); } // namespace internal } // namespace testing -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-type-util.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-type-util.h index 3d7542d1fb3..b87a2e2cace 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-type-util.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-type-util.h @@ -1,7 +1,3 @@ -// This file was GENERATED by command: -// pump.py gtest-type-util.h.pump -// DO NOT EDIT BY HAND!!! - // Copyright 2008 Google Inc. // All Rights Reserved. // @@ -32,17 +28,12 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Type utilities needed for implementing typed and type-parameterized -// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND! -// -// Currently we support at most 50 types in a list, and at most 50 -// type-parameterized tests in one type-parameterized test suite. -// Please contact googletestframework@googlegroups.com if you need -// more. +// tests. // GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ +#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ +#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ #include "gtest/internal/gtest-port.h" @@ -73,1556 +64,43 @@ inline std::string CanonicalizeForStdLibVersioning(std::string s) { return s; } -// GetTypeName<T>() returns a human-readable name of type T. -// NB: This function is also used in Google Mock, so don't move it inside of -// the typed-test-only section below. -template <typename T> -std::string GetTypeName() { -# if GTEST_HAS_RTTI - - const char* const name = typeid(T).name(); -# if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC) +#if GTEST_HAS_RTTI +// GetTypeName(const std::type_info&) returns a human-readable name of type T. +inline std::string GetTypeName(const std::type_info& type) { + const char* const name = type.name(); +#if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC) int status = 0; // gcc's implementation of typeid(T).name() mangles the type name, // so we have to demangle it. -# if GTEST_HAS_CXXABI_H_ +#if GTEST_HAS_CXXABI_H_ using abi::__cxa_demangle; -# endif // GTEST_HAS_CXXABI_H_ +#endif // GTEST_HAS_CXXABI_H_ char* const readable_name = __cxa_demangle(name, nullptr, nullptr, &status); const std::string name_str(status == 0 ? readable_name : name); free(readable_name); return CanonicalizeForStdLibVersioning(name_str); -# else +#else return name; -# endif // GTEST_HAS_CXXABI_H_ || __HP_aCC - -# else +#endif // GTEST_HAS_CXXABI_H_ || __HP_aCC +} +#endif // GTEST_HAS_RTTI +// GetTypeName<T>() returns a human-readable name of type T if and only if +// RTTI is enabled, otherwise it returns a dummy type name. +// NB: This function is also used in Google Mock, so don't move it inside of +// the typed-test-only section below. +template <typename T> +std::string GetTypeName() { +#if GTEST_HAS_RTTI + return GetTypeName(typeid(T)); +#else return "<type>"; - -# endif // GTEST_HAS_RTTI +#endif // GTEST_HAS_RTTI } -#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P - -// A unique type used as the default value for the arguments of class -// template Types. This allows us to simulate variadic templates -// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't -// support directly. +// A unique type indicating an empty node struct None {}; -// The following family of struct and struct templates are used to -// represent type lists. In particular, TypesN<T1, T2, ..., TN> -// represents a type list with N types (T1, T2, ..., and TN) in it. -// Except for Types0, every struct in the family has two member types: -// Head for the first type in the list, and Tail for the rest of the -// list. - -// The empty type list. -struct Types0 {}; - -// Type lists of length 1, 2, 3, and so on. - -template <typename T1> -struct Types1 { - typedef T1 Head; - typedef Types0 Tail; -}; -template <typename T1, typename T2> -struct Types2 { - typedef T1 Head; - typedef Types1<T2> Tail; -}; - -template <typename T1, typename T2, typename T3> -struct Types3 { - typedef T1 Head; - typedef Types2<T2, T3> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4> -struct Types4 { - typedef T1 Head; - typedef Types3<T2, T3, T4> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5> -struct Types5 { - typedef T1 Head; - typedef Types4<T2, T3, T4, T5> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6> -struct Types6 { - typedef T1 Head; - typedef Types5<T2, T3, T4, T5, T6> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7> -struct Types7 { - typedef T1 Head; - typedef Types6<T2, T3, T4, T5, T6, T7> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8> -struct Types8 { - typedef T1 Head; - typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9> -struct Types9 { - typedef T1 Head; - typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10> -struct Types10 { - typedef T1 Head; - typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11> -struct Types11 { - typedef T1 Head; - typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12> -struct Types12 { - typedef T1 Head; - typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13> -struct Types13 { - typedef T1 Head; - typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14> -struct Types14 { - typedef T1 Head; - typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15> -struct Types15 { - typedef T1 Head; - typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16> -struct Types16 { - typedef T1 Head; - typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17> -struct Types17 { - typedef T1 Head; - typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18> -struct Types18 { - typedef T1 Head; - typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19> -struct Types19 { - typedef T1 Head; - typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20> -struct Types20 { - typedef T1 Head; - typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21> -struct Types21 { - typedef T1 Head; - typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22> -struct Types22 { - typedef T1 Head; - typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23> -struct Types23 { - typedef T1 Head; - typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24> -struct Types24 { - typedef T1 Head; - typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25> -struct Types25 { - typedef T1 Head; - typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26> -struct Types26 { - typedef T1 Head; - typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27> -struct Types27 { - typedef T1 Head; - typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28> -struct Types28 { - typedef T1 Head; - typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29> -struct Types29 { - typedef T1 Head; - typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30> -struct Types30 { - typedef T1 Head; - typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31> -struct Types31 { - typedef T1 Head; - typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32> -struct Types32 { - typedef T1 Head; - typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33> -struct Types33 { - typedef T1 Head; - typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34> -struct Types34 { - typedef T1 Head; - typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35> -struct Types35 { - typedef T1 Head; - typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36> -struct Types36 { - typedef T1 Head; - typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37> -struct Types37 { - typedef T1 Head; - typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38> -struct Types38 { - typedef T1 Head; - typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39> -struct Types39 { - typedef T1 Head; - typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40> -struct Types40 { - typedef T1 Head; - typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41> -struct Types41 { - typedef T1 Head; - typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42> -struct Types42 { - typedef T1 Head; - typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43> -struct Types43 { - typedef T1 Head; - typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, - T43> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43, typename T44> -struct Types44 { - typedef T1 Head; - typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, - T44> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43, typename T44, typename T45> -struct Types45 { - typedef T1 Head; - typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, - T44, T45> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43, typename T44, typename T45, - typename T46> -struct Types46 { - typedef T1 Head; - typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, - T44, T45, T46> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43, typename T44, typename T45, - typename T46, typename T47> -struct Types47 { - typedef T1 Head; - typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, - T44, T45, T46, T47> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43, typename T44, typename T45, - typename T46, typename T47, typename T48> -struct Types48 { - typedef T1 Head; - typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, - T44, T45, T46, T47, T48> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43, typename T44, typename T45, - typename T46, typename T47, typename T48, typename T49> -struct Types49 { - typedef T1 Head; - typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, - T44, T45, T46, T47, T48, T49> Tail; -}; - -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43, typename T44, typename T45, - typename T46, typename T47, typename T48, typename T49, typename T50> -struct Types50 { - typedef T1 Head; - typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, - T44, T45, T46, T47, T48, T49, T50> Tail; -}; - - -} // namespace internal - -// We don't want to require the users to write TypesN<...> directly, -// as that would require them to count the length. Types<...> is much -// easier to write, but generates horrible messages when there is a -// compiler error, as gcc insists on printing out each template -// argument, even if it has the default value (this means Types<int> -// will appear as Types<int, None, None, ..., None> in the compiler -// errors). -// -// Our solution is to combine the best part of the two approaches: a -// user would write Types<T1, ..., TN>, and Google Test will translate -// that to TypesN<T1, ..., TN> internally to make error messages -// readable. The translation is done by the 'type' member of the -// Types template. -template <typename T1 = internal::None, typename T2 = internal::None, - typename T3 = internal::None, typename T4 = internal::None, - typename T5 = internal::None, typename T6 = internal::None, - typename T7 = internal::None, typename T8 = internal::None, - typename T9 = internal::None, typename T10 = internal::None, - typename T11 = internal::None, typename T12 = internal::None, - typename T13 = internal::None, typename T14 = internal::None, - typename T15 = internal::None, typename T16 = internal::None, - typename T17 = internal::None, typename T18 = internal::None, - typename T19 = internal::None, typename T20 = internal::None, - typename T21 = internal::None, typename T22 = internal::None, - typename T23 = internal::None, typename T24 = internal::None, - typename T25 = internal::None, typename T26 = internal::None, - typename T27 = internal::None, typename T28 = internal::None, - typename T29 = internal::None, typename T30 = internal::None, - typename T31 = internal::None, typename T32 = internal::None, - typename T33 = internal::None, typename T34 = internal::None, - typename T35 = internal::None, typename T36 = internal::None, - typename T37 = internal::None, typename T38 = internal::None, - typename T39 = internal::None, typename T40 = internal::None, - typename T41 = internal::None, typename T42 = internal::None, - typename T43 = internal::None, typename T44 = internal::None, - typename T45 = internal::None, typename T46 = internal::None, - typename T47 = internal::None, typename T48 = internal::None, - typename T49 = internal::None, typename T50 = internal::None> -struct Types { - typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, - T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type; -}; - -template <> -struct Types<internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None> { - typedef internal::Types0 type; -}; -template <typename T1> -struct Types<T1, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None> { - typedef internal::Types1<T1> type; -}; -template <typename T1, typename T2> -struct Types<T1, T2, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None> { - typedef internal::Types2<T1, T2> type; -}; -template <typename T1, typename T2, typename T3> -struct Types<T1, T2, T3, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None> { - typedef internal::Types3<T1, T2, T3> type; -}; -template <typename T1, typename T2, typename T3, typename T4> -struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None> { - typedef internal::Types4<T1, T2, T3, T4> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5> -struct Types<T1, T2, T3, T4, T5, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None> { - typedef internal::Types5<T1, T2, T3, T4, T5> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6> -struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None> { - typedef internal::Types6<T1, T2, T3, T4, T5, T6> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7> -struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None> { - typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None> { - typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None> { - typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None> { - typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None> { - typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None> { - typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, - T12> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None> { - typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None> { - typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None> { - typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None> { - typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None> { - typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None> { - typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None> { - typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None> { - typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None> { - typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None> { - typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None> { - typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None> { - typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None> { - typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None> { - typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, - T26> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None> { - typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None> { - typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None> { - typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None> { - typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None> { - typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None> { - typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None> { - typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None> { - typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None> { - typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, T36, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None> { - typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None> { - typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None> { - typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None> { - typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None> { - typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, - T40> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None, internal::None> { - typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, - T41> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None> { - typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, - T41, T42> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None, internal::None> { - typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, - T41, T42, T43> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43, typename T44> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, - internal::None, internal::None, internal::None, internal::None, - internal::None, internal::None> { - typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, - T41, T42, T43, T44> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43, typename T44, typename T45> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, - internal::None, internal::None, internal::None, internal::None, - internal::None> { - typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, - T41, T42, T43, T44, T45> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43, typename T44, typename T45, - typename T46> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, - T46, internal::None, internal::None, internal::None, internal::None> { - typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, - T41, T42, T43, T44, T45, T46> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43, typename T44, typename T45, - typename T46, typename T47> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, - T46, T47, internal::None, internal::None, internal::None> { - typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, - T41, T42, T43, T44, T45, T46, T47> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43, typename T44, typename T45, - typename T46, typename T47, typename T48> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, - T46, T47, T48, internal::None, internal::None> { - typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, - T41, T42, T43, T44, T45, T46, T47, T48> type; -}; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43, typename T44, typename T45, - typename T46, typename T47, typename T48, typename T49> -struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, - T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45, - T46, T47, T48, T49, internal::None> { - typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, - T41, T42, T43, T44, T45, T46, T47, T48, T49> type; -}; - -namespace internal { - # define GTEST_TEMPLATE_ template <typename T> class // The template "selector" struct TemplateSel<Tmpl> is used to @@ -1644,1692 +122,62 @@ struct TemplateSel { # define GTEST_BIND_(TmplSel, T) \ TmplSel::template Bind<T>::type -// A unique struct template used as the default value for the -// arguments of class template Templates. This allows us to simulate -// variadic templates (e.g. Templates<int>, Templates<int, double>, -// and etc), which C++ doesn't support directly. -template <typename T> -struct NoneT {}; - -// The following family of struct and struct templates are used to -// represent template lists. In particular, TemplatesN<T1, T2, ..., -// TN> represents a list of N templates (T1, T2, ..., and TN). Except -// for Templates0, every struct in the family has two member types: -// Head for the selector of the first template in the list, and Tail -// for the rest of the list. - -// The empty template list. -struct Templates0 {}; - -// Template lists of length 1, 2, 3, and so on. - -template <GTEST_TEMPLATE_ T1> -struct Templates1 { - typedef TemplateSel<T1> Head; - typedef Templates0 Tail; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2> -struct Templates2 { - typedef TemplateSel<T1> Head; - typedef Templates1<T2> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3> -struct Templates3 { - typedef TemplateSel<T1> Head; - typedef Templates2<T2, T3> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4> -struct Templates4 { - typedef TemplateSel<T1> Head; - typedef Templates3<T2, T3, T4> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5> -struct Templates5 { - typedef TemplateSel<T1> Head; - typedef Templates4<T2, T3, T4, T5> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6> -struct Templates6 { - typedef TemplateSel<T1> Head; - typedef Templates5<T2, T3, T4, T5, T6> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7> -struct Templates7 { - typedef TemplateSel<T1> Head; - typedef Templates6<T2, T3, T4, T5, T6, T7> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8> -struct Templates8 { - typedef TemplateSel<T1> Head; - typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9> -struct Templates9 { - typedef TemplateSel<T1> Head; - typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10> -struct Templates10 { - typedef TemplateSel<T1> Head; - typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11> -struct Templates11 { - typedef TemplateSel<T1> Head; - typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12> -struct Templates12 { - typedef TemplateSel<T1> Head; - typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13> -struct Templates13 { - typedef TemplateSel<T1> Head; - typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14> -struct Templates14 { - typedef TemplateSel<T1> Head; - typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15> -struct Templates15 { - typedef TemplateSel<T1> Head; - typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16> -struct Templates16 { - typedef TemplateSel<T1> Head; - typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17> -struct Templates17 { - typedef TemplateSel<T1> Head; - typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18> -struct Templates18 { - typedef TemplateSel<T1> Head; - typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19> -struct Templates19 { - typedef TemplateSel<T1> Head; - typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20> -struct Templates20 { - typedef TemplateSel<T1> Head; - typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21> -struct Templates21 { - typedef TemplateSel<T1> Head; - typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22> -struct Templates22 { - typedef TemplateSel<T1> Head; - typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23> -struct Templates23 { - typedef TemplateSel<T1> Head; - typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24> -struct Templates24 { - typedef TemplateSel<T1> Head; - typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25> -struct Templates25 { - typedef TemplateSel<T1> Head; - typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26> -struct Templates26 { - typedef TemplateSel<T1> Head; - typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27> -struct Templates27 { - typedef TemplateSel<T1> Head; - typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28> -struct Templates28 { - typedef TemplateSel<T1> Head; - typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29> -struct Templates29 { - typedef TemplateSel<T1> Head; - typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30> -struct Templates30 { - typedef TemplateSel<T1> Head; - typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31> -struct Templates31 { - typedef TemplateSel<T1> Head; - typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32> -struct Templates32 { - typedef TemplateSel<T1> Head; - typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33> -struct Templates33 { - typedef TemplateSel<T1> Head; - typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34> -struct Templates34 { - typedef TemplateSel<T1> Head; - typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35> -struct Templates35 { - typedef TemplateSel<T1> Head; - typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36> -struct Templates36 { - typedef TemplateSel<T1> Head; - typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37> -struct Templates37 { - typedef TemplateSel<T1> Head; - typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38> -struct Templates38 { - typedef TemplateSel<T1> Head; - typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39> -struct Templates39 { - typedef TemplateSel<T1> Head; - typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40> -struct Templates40 { - typedef TemplateSel<T1> Head; - typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41> -struct Templates41 { - typedef TemplateSel<T1> Head; - typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42> -struct Templates42 { - typedef TemplateSel<T1> Head; - typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, - T42> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43> -struct Templates43 { - typedef TemplateSel<T1> Head; - typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, - T43> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44> -struct Templates44 { - typedef TemplateSel<T1> Head; - typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, - T43, T44> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45> -struct Templates45 { - typedef TemplateSel<T1> Head; - typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, - T43, T44, T45> Tail; -}; - -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, - GTEST_TEMPLATE_ T46> -struct Templates46 { - typedef TemplateSel<T1> Head; - typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, - T43, T44, T45, T46> Tail; +template <GTEST_TEMPLATE_ Head_, GTEST_TEMPLATE_... Tail_> +struct Templates { + using Head = TemplateSel<Head_>; + using Tail = Templates<Tail_...>; }; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, - GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47> -struct Templates47 { - typedef TemplateSel<T1> Head; - typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, - T43, T44, T45, T46, T47> Tail; +template <GTEST_TEMPLATE_ Head_> +struct Templates<Head_> { + using Head = TemplateSel<Head_>; + using Tail = None; }; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, - GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48> -struct Templates48 { - typedef TemplateSel<T1> Head; - typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, - T43, T44, T45, T46, T47, T48> Tail; +// Tuple-like type lists +template <typename Head_, typename... Tail_> +struct Types { + using Head = Head_; + using Tail = Types<Tail_...>; }; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, - GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48, - GTEST_TEMPLATE_ T49> -struct Templates49 { - typedef TemplateSel<T1> Head; - typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, - T43, T44, T45, T46, T47, T48, T49> Tail; +template <typename Head_> +struct Types<Head_> { + using Head = Head_; + using Tail = None; }; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, - GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48, - GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50> -struct Templates50 { - typedef TemplateSel<T1> Head; - typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, - T43, T44, T45, T46, T47, T48, T49, T50> Tail; +// Helper metafunctions to tell apart a single type from types +// generated by ::testing::Types +template <typename... Ts> +struct ProxyTypeList { + using type = Types<Ts...>; }; +template <typename> +struct is_proxy_type_list : std::false_type {}; -// We don't want to require the users to write TemplatesN<...> directly, -// as that would require them to count the length. Templates<...> is much -// easier to write, but generates horrible messages when there is a -// compiler error, as gcc insists on printing out each template -// argument, even if it has the default value (this means Templates<list> -// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler -// errors). -// -// Our solution is to combine the best part of the two approaches: a -// user would write Templates<T1, ..., TN>, and Google Test will translate -// that to TemplatesN<T1, ..., TN> internally to make error messages -// readable. The translation is done by the 'type' member of the -// Templates template. -template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT, - GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT, - GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT, - GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT, - GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT, - GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT, - GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT, - GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT, - GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT, - GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT, - GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT, - GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT, - GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT, - GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT, - GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT, - GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT, - GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT, - GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT, - GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT, - GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT, - GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT, - GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT, - GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT, - GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT, - GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT> -struct Templates { - typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, - T42, T43, T44, T45, T46, T47, T48, T49, T50> type; -}; - -template <> -struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT> { - typedef Templates0 type; -}; -template <GTEST_TEMPLATE_ T1> -struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT> { - typedef Templates1<T1> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2> -struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT> { - typedef Templates2<T1, T2> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3> -struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates3<T1, T2, T3> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4> -struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates4<T1, T2, T3, T4> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5> -struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates5<T1, T2, T3, T4, T5> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6> -struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates6<T1, T2, T3, T4, T5, T6> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7> -struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT> { - typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT> { - typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT> { - typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT> { - typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT> { - typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT> { - typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT> { - typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT> { - typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT> { - typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT> { - typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT> { - typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT> { - typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, - T41> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, - T42> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, - T42, T43> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, - NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, - T42, T43, T44> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, - T45, NoneT, NoneT, NoneT, NoneT, NoneT> { - typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, - T42, T43, T44, T45> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, - GTEST_TEMPLATE_ T46> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, - T45, T46, NoneT, NoneT, NoneT, NoneT> { - typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, - T42, T43, T44, T45, T46> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, - GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, - T45, T46, T47, NoneT, NoneT, NoneT> { - typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, - T42, T43, T44, T45, T46, T47> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, - GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, - T45, T46, T47, T48, NoneT, NoneT> { - typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, - T42, T43, T44, T45, T46, T47, T48> type; -}; -template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3, - GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6, - GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9, - GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12, - GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15, - GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18, - GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21, - GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24, - GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27, - GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30, - GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33, - GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36, - GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39, - GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42, - GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45, - GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48, - GTEST_TEMPLATE_ T49> -struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, - T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, - T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, - T45, T46, T47, T48, T49, NoneT> { - typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, - T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, - T42, T43, T44, T45, T46, T47, T48, T49> type; -}; - -// The TypeList template makes it possible to use either a single type -// or a Types<...> list in TYPED_TEST_SUITE() and -// INSTANTIATE_TYPED_TEST_SUITE_P(). +template <typename... Ts> +struct is_proxy_type_list<ProxyTypeList<Ts...>> : std::true_type {}; +// Generator which conditionally creates type lists. +// It recognizes if a requested type list should be created +// and prevents creating a new type list nested within another one. template <typename T> -struct TypeList { - typedef Types1<T> type; -}; +struct GenerateTypeList { + private: + using proxy = typename std::conditional<is_proxy_type_list<T>::value, T, + ProxyTypeList<T>>::type; -template <typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10, - typename T11, typename T12, typename T13, typename T14, typename T15, - typename T16, typename T17, typename T18, typename T19, typename T20, - typename T21, typename T22, typename T23, typename T24, typename T25, - typename T26, typename T27, typename T28, typename T29, typename T30, - typename T31, typename T32, typename T33, typename T34, typename T35, - typename T36, typename T37, typename T38, typename T39, typename T40, - typename T41, typename T42, typename T43, typename T44, typename T45, - typename T46, typename T47, typename T48, typename T49, typename T50> -struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, - T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, - T44, T45, T46, T47, T48, T49, T50> > { - typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, - T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, - T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, - T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type; + public: + using type = typename proxy::type; }; -#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P - } // namespace internal + +template <typename... Ts> +using Types = internal::ProxyTypeList<Ts...>; + } // namespace testing -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ +#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-death-test.cc b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-death-test.cc index da09a1cfc23..bf4f6331dac 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-death-test.cc +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-death-test.cc @@ -32,6 +32,7 @@ #include "gtest/gtest-death-test.h" +#include <functional> #include <utility> #include "gtest/internal/gtest-port.h" @@ -247,7 +248,7 @@ static std::string DeathTestThreadWarning(size_t thread_count) { msg << "detected " << thread_count << " threads."; } msg << " See " - "https://github.com/google/googletest/blob/master/googletest/docs/" + "https://github.com/google/googletest/blob/master/docs/" "advanced.md#death-tests-and-threads" << " for more explanation and suggested solutions, especially if" << " this is the last message you see before your test times out."; @@ -864,7 +865,7 @@ class Arguments { } int size() { - return args_.size() - 1; + return static_cast<int>(args_.size()) - 1; } private: @@ -890,18 +891,17 @@ int FuchsiaDeathTest::Wait() { // Register to wait for the child process to terminate. status_zx = child_process_.wait_async( - port, kProcessKey, ZX_PROCESS_TERMINATED, ZX_WAIT_ASYNC_ONCE); + port, kProcessKey, ZX_PROCESS_TERMINATED, 0); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); // Register to wait for the socket to be readable or closed. status_zx = stderr_socket_.wait_async( - port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, - ZX_WAIT_ASYNC_ONCE); + port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, 0); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); // Register to wait for an exception. status_zx = exception_channel_.wait_async( - port, kExceptionKey, ZX_CHANNEL_READABLE, ZX_WAIT_ASYNC_ONCE); + port, kExceptionKey, ZX_CHANNEL_READABLE, 0); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); bool process_terminated = false; @@ -941,8 +941,7 @@ int FuchsiaDeathTest::Wait() { } else { GTEST_DEATH_TEST_CHECK_(status_zx == ZX_ERR_SHOULD_WAIT); status_zx = stderr_socket_.wait_async( - port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, - ZX_WAIT_ASYNC_ONCE); + port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, 0); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); } } else { @@ -955,12 +954,12 @@ int FuchsiaDeathTest::Wait() { ReadAndInterpretStatusByte(); zx_info_process_t buffer; - status_zx = child_process_.get_info( - ZX_INFO_PROCESS, &buffer, sizeof(buffer), nullptr, nullptr); + status_zx = child_process_.get_info(ZX_INFO_PROCESS, &buffer, sizeof(buffer), + nullptr, nullptr); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); - GTEST_DEATH_TEST_CHECK_(buffer.exited); - set_status(buffer.return_code); + GTEST_DEATH_TEST_CHECK_(buffer.flags & ZX_INFO_PROCESS_FLAG_EXITED); + set_status(static_cast<int>(buffer.return_code)); return status(); } @@ -1225,21 +1224,9 @@ struct ExecDeathTestArgs { int close_fd; // File descriptor to close; the read end of a pipe }; -# if GTEST_OS_MAC -inline char** GetEnviron() { - // When Google Test is built as a framework on MacOS X, the environ variable - // is unavailable. Apple's documentation (man environ) recommends using - // _NSGetEnviron() instead. - return *_NSGetEnviron(); -} -# else -// Some POSIX platforms expect you to declare environ. extern "C" makes -// it reside in the global namespace. +# if GTEST_OS_QNX extern "C" char** environ; -inline char** GetEnviron() { return environ; } -# endif // GTEST_OS_MAC - -# if !GTEST_OS_QNX +# else // GTEST_OS_QNX // The main function for a threadsafe-style death test child process. // This function is called in a clone()-ed process and thus must avoid // any potentially unsafe operations like malloc or libc functions. @@ -1259,18 +1246,18 @@ static int ExecDeathTestChildMain(void* child_arg) { return EXIT_FAILURE; } - // We can safely call execve() as it's a direct system call. We + // We can safely call execv() as it's almost a direct system call. We // cannot use execvp() as it's a libc function and thus potentially - // unsafe. Since execve() doesn't search the PATH, the user must + // unsafe. Since execv() doesn't search the PATH, the user must // invoke the test program via a valid path that contains at least // one path separator. - execve(args->argv[0], args->argv, GetEnviron()); - DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " + + execv(args->argv[0], args->argv); + DeathTestAbort(std::string("execv(") + args->argv[0] + ", ...) in " + original_dir + " failed: " + GetLastErrnoDescription()); return EXIT_FAILURE; } -# endif // !GTEST_OS_QNX +# endif // GTEST_OS_QNX # if GTEST_HAS_CLONE // Two utility routines that together determine the direction the stack @@ -1284,19 +1271,24 @@ static int ExecDeathTestChildMain(void* child_arg) { // correct answer. static void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_; +// Make sure sanitizers do not tamper with the stack here. +// Ideally, we want to use `__builtin_frame_address` instead of a local variable +// address with sanitizer disabled, but it does not work when the +// compiler optimizes the stack frame out, which happens on PowerPC targets. // HWAddressSanitizer add a random tag to the MSB of the local variable address, // making comparison result unpredictable. +GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ static void StackLowerThanAddress(const void* ptr, bool* result) { - int dummy; - *result = (&dummy < ptr); + int dummy = 0; + *result = std::less<const void*>()(&dummy, ptr); } // Make sure AddressSanitizer does not tamper with the stack here. GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ static bool StackGrowsDown() { - int dummy; + int dummy = 0; bool result; StackLowerThanAddress(&dummy, &result); return result; @@ -1339,8 +1331,7 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) { fd_flags | FD_CLOEXEC)); struct inheritance inherit = {0}; // spawn is a system call. - child_pid = - spawn(args.argv[0], 0, nullptr, &inherit, args.argv, GetEnviron()); + child_pid = spawn(args.argv[0], 0, nullptr, &inherit, args.argv, environ); // Restores the current working directory. GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1); GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd)); @@ -1364,7 +1355,7 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) { if (!use_fork) { static const bool stack_grows_down = StackGrowsDown(); - const auto stack_size = static_cast<size_t>(getpagesize()); + const auto stack_size = static_cast<size_t>(getpagesize() * 2); // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead. void* const stack = mmap(nullptr, stack_size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-filepath.cc b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-filepath.cc index bd7b99ff03e..0b5629401b5 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-filepath.cc +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-filepath.cc @@ -92,8 +92,9 @@ static bool IsPathSeparator(char c) { // Returns the current working directory, or "" if unsuccessful. FilePath FilePath::GetCurrentDir() { -#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \ - GTEST_OS_WINDOWS_RT || ARDUINO || defined(ESP_PLATFORM) +#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \ + GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_ESP32 || \ + GTEST_OS_XTENSA // These platforms do not have a current directory, so we just return // something reasonable. return FilePath(kCurrentDirectoryString); @@ -209,7 +210,7 @@ bool FilePath::FileOrDirectoryExists() const { delete [] unicode; return attributes != kInvalidFileAttributes; #else - posix::StatStruct file_stat; + posix::StatStruct file_stat{}; return posix::Stat(pathname_.c_str(), &file_stat) == 0; #endif // GTEST_OS_WINDOWS_MOBILE } @@ -236,7 +237,7 @@ bool FilePath::DirectoryExists() const { result = true; } #else - posix::StatStruct file_stat; + posix::StatStruct file_stat{}; result = posix::Stat(path.c_str(), &file_stat) == 0 && posix::IsDir(file_stat); #endif // GTEST_OS_WINDOWS_MOBILE @@ -323,6 +324,9 @@ bool FilePath::CreateFolder() const { delete [] unicode; #elif GTEST_OS_WINDOWS int result = _mkdir(pathname_.c_str()); +#elif GTEST_OS_ESP8266 || GTEST_OS_XTENSA + // do nothing + int result = 0; #else int result = mkdir(pathname_.c_str(), 0777); #endif // GTEST_OS_WINDOWS_MOBILE @@ -346,33 +350,19 @@ FilePath FilePath::RemoveTrailingPathSeparator() const { // For example, "bar///foo" becomes "bar/foo". Does not eliminate other // redundancies that might be in a pathname involving "." or "..". void FilePath::Normalize() { - if (pathname_.c_str() == nullptr) { - pathname_ = ""; - return; - } - const char* src = pathname_.c_str(); - char* const dest = new char[pathname_.length() + 1]; - char* dest_ptr = dest; - memset(dest_ptr, 0, pathname_.length() + 1); - - while (*src != '\0') { - *dest_ptr = *src; - if (!IsPathSeparator(*src)) { - src++; + auto out = pathname_.begin(); + + for (const char character : pathname_) { + if (!IsPathSeparator(character)) { + *(out++) = character; + } else if (out == pathname_.begin() || *std::prev(out) != kPathSeparator) { + *(out++) = kPathSeparator; } else { -#if GTEST_HAS_ALT_PATH_SEP_ - if (*dest_ptr == kAlternatePathSeparator) { - *dest_ptr = kPathSeparator; - } -#endif - while (IsPathSeparator(*src)) - src++; + continue; } - dest_ptr++; } - *dest_ptr = '\0'; - pathname_ = dest; - delete[] dest; + + pathname_.erase(out, pathname_.end()); } } // namespace internal diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-internal-inl.h b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-internal-inl.h index 8ed70daab09..6d8cecbbb38 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-internal-inl.h +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-internal-inl.h @@ -31,8 +31,8 @@ // This file contains purely Google Test's internal implementation. Please // DO NOT #INCLUDE IT IN A USER PROGRAM. -#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_ -#define GTEST_SRC_GTEST_INTERNAL_INL_H_ +#ifndef GOOGLETEST_SRC_GTEST_INTERNAL_INL_H_ +#define GOOGLETEST_SRC_GTEST_INTERNAL_INL_H_ #ifndef _WIN32_WCE # include <errno.h> @@ -42,6 +42,7 @@ #include <string.h> // For memmove. #include <algorithm> +#include <cstdint> #include <memory> #include <string> #include <vector> @@ -83,9 +84,11 @@ const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests"; const char kBreakOnFailureFlag[] = "break_on_failure"; const char kCatchExceptionsFlag[] = "catch_exceptions"; const char kColorFlag[] = "color"; +const char kFailFast[] = "fail_fast"; const char kFilterFlag[] = "filter"; const char kListTestsFlag[] = "list_tests"; const char kOutputFlag[] = "output"; +const char kBriefFlag[] = "brief"; const char kPrintTimeFlag[] = "print_time"; const char kPrintUTF8Flag[] = "print_utf8"; const char kRandomSeedFlag[] = "random_seed"; @@ -123,11 +126,11 @@ GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms); // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. GTEST_API_ bool ParseInt32Flag( - const char* str, const char* flag, Int32* value); + const char* str, const char* flag, int32_t* value); // Returns a random seed in range [1, kMaxRandomSeed] based on the // given --gtest_random_seed flag value. -inline int GetRandomSeedFromFlag(Int32 random_seed_flag) { +inline int GetRandomSeedFromFlag(int32_t random_seed_flag) { const unsigned int raw_seed = (random_seed_flag == 0) ? static_cast<unsigned int>(GetTimeInMillis()) : static_cast<unsigned int>(random_seed_flag); @@ -163,10 +166,12 @@ class GTestFlagSaver { color_ = GTEST_FLAG(color); death_test_style_ = GTEST_FLAG(death_test_style); death_test_use_fork_ = GTEST_FLAG(death_test_use_fork); + fail_fast_ = GTEST_FLAG(fail_fast); filter_ = GTEST_FLAG(filter); internal_run_death_test_ = GTEST_FLAG(internal_run_death_test); list_tests_ = GTEST_FLAG(list_tests); output_ = GTEST_FLAG(output); + brief_ = GTEST_FLAG(brief); print_time_ = GTEST_FLAG(print_time); print_utf8_ = GTEST_FLAG(print_utf8); random_seed_ = GTEST_FLAG(random_seed); @@ -186,9 +191,11 @@ class GTestFlagSaver { GTEST_FLAG(death_test_style) = death_test_style_; GTEST_FLAG(death_test_use_fork) = death_test_use_fork_; GTEST_FLAG(filter) = filter_; + GTEST_FLAG(fail_fast) = fail_fast_; GTEST_FLAG(internal_run_death_test) = internal_run_death_test_; GTEST_FLAG(list_tests) = list_tests_; GTEST_FLAG(output) = output_; + GTEST_FLAG(brief) = brief_; GTEST_FLAG(print_time) = print_time_; GTEST_FLAG(print_utf8) = print_utf8_; GTEST_FLAG(random_seed) = random_seed_; @@ -207,16 +214,18 @@ class GTestFlagSaver { std::string color_; std::string death_test_style_; bool death_test_use_fork_; + bool fail_fast_; std::string filter_; std::string internal_run_death_test_; bool list_tests_; std::string output_; + bool brief_; bool print_time_; bool print_utf8_; - internal::Int32 random_seed_; - internal::Int32 repeat_; + int32_t random_seed_; + int32_t repeat_; bool shuffle_; - internal::Int32 stack_trace_depth_; + int32_t stack_trace_depth_; std::string stream_result_to_; bool throw_on_failure_; } GTEST_ATTRIBUTE_UNUSED_; @@ -227,7 +236,7 @@ class GTestFlagSaver { // If the code_point is not a valid Unicode code point // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted // to "(Invalid Unicode 0xXXXXXXXX)". -GTEST_API_ std::string CodePointToUtf8(UInt32 code_point); +GTEST_API_ std::string CodePointToUtf8(uint32_t code_point); // Converts a wide string to a narrow string in UTF-8 encoding. // The wide string is assumed to have the following encoding: @@ -260,10 +269,10 @@ GTEST_API_ bool ShouldShard(const char* total_shards_str, const char* shard_index_str, bool in_subprocess_for_death_test); -// Parses the environment variable var as an Int32. If it is unset, -// returns default_val. If it is not an Int32, prints an error and +// Parses the environment variable var as a 32-bit integer. If it is unset, +// returns default_val. If it is not a 32-bit integer, prints an error and // and aborts. -GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val); +GTEST_API_ int32_t Int32FromEnvOrDie(const char* env_var, int32_t default_val); // Given the total number of shards, the shard index, and the test id, // returns true if and only if the test should be run on this shard. The test id @@ -323,7 +332,7 @@ void ShuffleRange(internal::Random* random, int begin, int end, const int last_in_range = begin + range_width - 1; const int selected = begin + - static_cast<int>(random->Generate(static_cast<UInt32>(range_width))); + static_cast<int>(random->Generate(static_cast<uint32_t>(range_width))); std::swap((*v)[static_cast<size_t>(selected)], (*v)[static_cast<size_t>(last_in_range)]); } @@ -385,13 +394,6 @@ class GTEST_API_ UnitTestOptions { // Functions for processing the gtest_filter flag. - // Returns true if and only if the wildcard pattern matches the string. - // The first ':' or '\0' character in pattern marks the end of it. - // - // This recursive algorithm isn't very efficient, but is clear and - // works well enough for matching test names, which are short. - static bool PatternMatchesString(const char *pattern, const char *str); - // Returns true if and only if the user-specified filter matches the test // suite name and the test name. static bool FilterMatchesTest(const std::string& test_suite_name, @@ -646,10 +648,10 @@ class GTEST_API_ UnitTestImpl { // Arguments: // // test_suite_name: name of the test suite - // type_param: the name of the test's type parameter, or NULL if - // this is not a typed or a type-parameterized test. - // set_up_tc: pointer to the function that sets up the test suite - // tear_down_tc: pointer to the function that tears down the test suite + // type_param: the name of the test's type parameter, or NULL if + // this is not a typed or a type-parameterized test. + // set_up_tc: pointer to the function that sets up the test suite + // tear_down_tc: pointer to the function that tears down the test suite TestSuite* GetTestSuite(const char* test_suite_name, const char* type_param, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc); @@ -673,6 +675,7 @@ class GTEST_API_ UnitTestImpl { void AddTestInfo(internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc, TestInfo* test_info) { +#if GTEST_HAS_DEATH_TEST // In order to support thread-safe death tests, we need to // remember the original working directory when the test program // was first invoked. We cannot do this in RUN_ALL_TESTS(), as @@ -685,6 +688,7 @@ class GTEST_API_ UnitTestImpl { GTEST_CHECK_(!original_working_dir_.IsEmpty()) << "Failed to get the current working directory."; } +#endif // GTEST_HAS_DEATH_TEST GetTestSuite(test_info->test_suite_name(), test_info->type_param(), set_up_tc, tear_down_tc) @@ -697,6 +701,17 @@ class GTEST_API_ UnitTestImpl { return parameterized_test_registry_; } + std::set<std::string>* ignored_parameterized_test_suites() { + return &ignored_parameterized_test_suites_; + } + + // Returns TypeParameterizedTestSuiteRegistry object used to keep track of + // type-parameterized tests and instantiations of them. + internal::TypeParameterizedTestSuiteRegistry& + type_parameterized_test_registry() { + return type_parameterized_test_registry_; + } + // Sets the TestSuite object for the test that's currently running. void set_current_test_suite(TestSuite* a_current_test_suite) { current_test_suite_ = a_current_test_suite; @@ -873,6 +888,12 @@ class GTEST_API_ UnitTestImpl { // ParameterizedTestRegistry object used to register value-parameterized // tests. internal::ParameterizedTestSuiteRegistry parameterized_test_registry_; + internal::TypeParameterizedTestSuiteRegistry + type_parameterized_test_registry_; + + // The set holding the name of parameterized + // test suites that may go uninstantiated. + std::set<std::string> ignored_parameterized_test_suites_; // Indicates whether RegisterParameterizedTests() has been called already. bool parameterized_tests_registered_; @@ -999,20 +1020,9 @@ bool ParseNaturalNumber(const ::std::string& str, Integer* number) { char* end; // BiggestConvertible is the largest integer type that system-provided // string-to-number conversion routines can return. + using BiggestConvertible = unsigned long long; // NOLINT -# if GTEST_OS_WINDOWS && !defined(__GNUC__) - - // MSVC and C++ Builder define __int64 instead of the standard long long. - typedef unsigned __int64 BiggestConvertible; - const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10); - -# else - - typedef unsigned long long BiggestConvertible; // NOLINT - const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10); - -# endif // GTEST_OS_WINDOWS && !defined(__GNUC__) - + const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10); // NOLINT const bool parse_success = *end == '\0' && errno == 0; GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed)); @@ -1154,13 +1164,13 @@ class StreamingListener : public EmptyTestEventListener { } // Note that "event=TestCaseStart" is a wire format and has to remain - // "case" for compatibilty + // "case" for compatibility void OnTestCaseStart(const TestCase& test_case) override { SendLn(std::string("event=TestCaseStart&name=") + test_case.name()); } // Note that "event=TestCaseEnd" is a wire format and has to remain - // "case" for compatibilty + // "case" for compatibility void OnTestCaseEnd(const TestCase& test_case) override { SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed()) + "&elapsed_time=" + StreamableToString(test_case.elapsed_time()) + @@ -1208,4 +1218,4 @@ class StreamingListener : public EmptyTestEventListener { GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 -#endif // GTEST_SRC_GTEST_INTERNAL_INL_H_ +#endif // GOOGLETEST_SRC_GTEST_INTERNAL_INL_H_ diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-matchers.cc b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-matchers.cc index 7d2fb6851ec..65104ebab1b 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-matchers.cc +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-matchers.cc @@ -58,40 +58,40 @@ Matcher<std::string>::Matcher(const std::string& s) { *this = Eq(s); } // s. Matcher<std::string>::Matcher(const char* s) { *this = Eq(std::string(s)); } -#if GTEST_HAS_ABSL -// Constructs a matcher that matches a const absl::string_view& whose value is +#if GTEST_INTERNAL_HAS_STRING_VIEW +// Constructs a matcher that matches a const StringView& whose value is // equal to s. -Matcher<const absl::string_view&>::Matcher(const std::string& s) { +Matcher<const internal::StringView&>::Matcher(const std::string& s) { *this = Eq(s); } -// Constructs a matcher that matches a const absl::string_view& whose value is +// Constructs a matcher that matches a const StringView& whose value is // equal to s. -Matcher<const absl::string_view&>::Matcher(const char* s) { +Matcher<const internal::StringView&>::Matcher(const char* s) { *this = Eq(std::string(s)); } -// Constructs a matcher that matches a const absl::string_view& whose value is +// Constructs a matcher that matches a const StringView& whose value is // equal to s. -Matcher<const absl::string_view&>::Matcher(absl::string_view s) { +Matcher<const internal::StringView&>::Matcher(internal::StringView s) { *this = Eq(std::string(s)); } -// Constructs a matcher that matches a absl::string_view whose value is equal to +// Constructs a matcher that matches a StringView whose value is equal to // s. -Matcher<absl::string_view>::Matcher(const std::string& s) { *this = Eq(s); } +Matcher<internal::StringView>::Matcher(const std::string& s) { *this = Eq(s); } -// Constructs a matcher that matches a absl::string_view whose value is equal to +// Constructs a matcher that matches a StringView whose value is equal to // s. -Matcher<absl::string_view>::Matcher(const char* s) { +Matcher<internal::StringView>::Matcher(const char* s) { *this = Eq(std::string(s)); } -// Constructs a matcher that matches a absl::string_view whose value is equal to +// Constructs a matcher that matches a StringView whose value is equal to // s. -Matcher<absl::string_view>::Matcher(absl::string_view s) { +Matcher<internal::StringView>::Matcher(internal::StringView s) { *this = Eq(std::string(s)); } -#endif // GTEST_HAS_ABSL +#endif // GTEST_INTERNAL_HAS_STRING_VIEW } // namespace testing diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-port.cc b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-port.cc index fc5ba6becc5..53a4d37f97d 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-port.cc +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-port.cc @@ -34,6 +34,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <cstdint> #include <fstream> #include <memory> @@ -197,7 +198,8 @@ size_t GetThreadCount() { if (sysctl(mib, miblen, NULL, &size, NULL, 0)) { return 0; } - mib[5] = size / mib[4]; + + mib[5] = static_cast<int>(size / static_cast<size_t>(mib[4])); // populate array of structs struct kinfo_proc info[mib[5]]; @@ -206,8 +208,8 @@ size_t GetThreadCount() { } // exclude empty members - int nthreads = 0; - for (int i = 0; i < size / mib[4]; i++) { + size_t nthreads = 0; + for (size_t i = 0; i < size / static_cast<size_t>(mib[4]); i++) { if (info[i].p_tid != -1) nthreads++; } @@ -536,6 +538,9 @@ class ThreadLocalRegistryImpl { // Returns a value that can be used to identify the thread from other threads. static ThreadLocalValueHolderBase* GetValueOnCurrentThread( const ThreadLocalBase* thread_local_instance) { +#ifdef _MSC_VER + MemoryIsNotDeallocated memory_is_not_deallocated; +#endif // _MSC_VER DWORD current_thread = ::GetCurrentThreadId(); MutexLock lock(&mutex_); ThreadIdToThreadLocals* const thread_to_thread_locals = @@ -683,8 +688,8 @@ class ThreadLocalRegistryImpl { static Mutex thread_map_mutex_; }; -Mutex ThreadLocalRegistryImpl::mutex_(Mutex::kStaticMutex); -Mutex ThreadLocalRegistryImpl::thread_map_mutex_(Mutex::kStaticMutex); +Mutex ThreadLocalRegistryImpl::mutex_(Mutex::kStaticMutex); // NOLINT +Mutex ThreadLocalRegistryImpl::thread_map_mutex_(Mutex::kStaticMutex); // NOLINT ThreadLocalValueHolderBase* ThreadLocalRegistry::GetValueOnCurrentThread( const ThreadLocalBase* thread_local_instance) { @@ -1090,9 +1095,9 @@ class CapturedStream { filename_ = temp_file_path; # else // There's no guarantee that a test has write access to the current - // directory, so we create the temporary file in the /tmp directory - // instead. We use /tmp on most systems, and /sdcard on Android. - // That's because Android doesn't have /tmp. + // directory, so we create the temporary file in a temporary directory. + std::string name_template; + # if GTEST_OS_LINUX_ANDROID // Note: Android applications are expected to call the framework's // Context.getExternalStorageDirectory() method through JNI to get @@ -1105,17 +1110,46 @@ class CapturedStream { // The location /data/local/tmp is directly accessible from native code. // '/sdcard' and other variants cannot be relied on, as they are not // guaranteed to be mounted, or may have a delay in mounting. - char name_template[] = "/data/local/tmp/gtest_captured_stream.XXXXXX"; + name_template = "/data/local/tmp/"; +# elif GTEST_OS_IOS + char user_temp_dir[PATH_MAX + 1]; + + // Documented alternative to NSTemporaryDirectory() (for obtaining creating + // a temporary directory) at + // https://developer.apple.com/library/archive/documentation/Security/Conceptual/SecureCodingGuide/Articles/RaceConditions.html#//apple_ref/doc/uid/TP40002585-SW10 + // + // _CS_DARWIN_USER_TEMP_DIR (as well as _CS_DARWIN_USER_CACHE_DIR) is not + // documented in the confstr() man page at + // https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/confstr.3.html#//apple_ref/doc/man/3/confstr + // but are still available, according to the WebKit patches at + // https://trac.webkit.org/changeset/262004/webkit + // https://trac.webkit.org/changeset/263705/webkit + // + // The confstr() implementation falls back to getenv("TMPDIR"). See + // https://opensource.apple.com/source/Libc/Libc-1439.100.3/gen/confstr.c.auto.html + ::confstr(_CS_DARWIN_USER_TEMP_DIR, user_temp_dir, sizeof(user_temp_dir)); + + name_template = user_temp_dir; + if (name_template.back() != GTEST_PATH_SEP_[0]) + name_template.push_back(GTEST_PATH_SEP_[0]); # else - char name_template[] = "/tmp/captured_stream.XXXXXX"; -# endif // GTEST_OS_LINUX_ANDROID - const int captured_fd = mkstemp(name_template); + name_template = "/tmp/"; +# endif + name_template.append("gtest_captured_stream.XXXXXX"); + + // mkstemp() modifies the string bytes in place, and does not go beyond the + // string's length. This results in well-defined behavior in C++17. + // + // The const_cast is needed below C++17. The constraints on std::string + // implementations in C++11 and above make assumption behind the const_cast + // fairly safe. + const int captured_fd = ::mkstemp(const_cast<char*>(name_template.data())); if (captured_fd == -1) { GTEST_LOG_(WARNING) << "Failed to create tmp file " << name_template << " for test; does the test have access to the /tmp directory?"; } - filename_ = name_template; + filename_ = std::move(name_template); # endif // GTEST_OS_WINDOWS fflush(nullptr); dup2(captured_fd, fd_); @@ -1286,7 +1320,7 @@ static std::string FlagToEnvVar(const char* flag) { // Parses 'str' for a 32-bit signed integer. If successful, writes // the result to *value and returns true; otherwise leaves *value // unchanged and returns false. -bool ParseInt32(const Message& src_text, const char* str, Int32* value) { +bool ParseInt32(const Message& src_text, const char* str, int32_t* value) { // Parses the environment variable as a decimal integer. char* end = nullptr; const long long_value = strtol(str, &end, 10); // NOLINT @@ -1303,13 +1337,13 @@ bool ParseInt32(const Message& src_text, const char* str, Int32* value) { return false; } - // Is the parsed value in the range of an Int32? - const Int32 result = static_cast<Int32>(long_value); + // Is the parsed value in the range of an int32_t? + const auto result = static_cast<int32_t>(long_value); if (long_value == LONG_MAX || long_value == LONG_MIN || // The parsed value overflows as a long. (strtol() returns // LONG_MAX or LONG_MIN when the input overflows.) result != long_value - // The parsed value overflows as an Int32. + // The parsed value overflows as an int32_t. ) { Message msg; msg << "WARNING: " << src_text @@ -1342,7 +1376,7 @@ bool BoolFromGTestEnv(const char* flag, bool default_value) { // Reads and returns a 32-bit integer stored in the environment // variable corresponding to the given flag; if it isn't set or // doesn't represent a valid 32-bit integer, returns default_value. -Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) { +int32_t Int32FromGTestEnv(const char* flag, int32_t default_value) { #if defined(GTEST_GET_INT32_FROM_ENV_) return GTEST_GET_INT32_FROM_ENV_(flag, default_value); #else @@ -1353,7 +1387,7 @@ Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) { return default_value; } - Int32 result = default_value; + int32_t result = default_value; if (!ParseInt32(Message() << "Environment variable " << env_var, string_value, &result)) { printf("The default value %s is used.\n", diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-printers.cc b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-printers.cc index 3337be312ea..1b68fcb5005 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-printers.cc +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-printers.cc @@ -42,11 +42,16 @@ // defines Foo. #include "gtest/gtest-printers.h" + #include <stdio.h> + #include <cctype> +#include <cstdint> #include <cwchar> #include <ostream> // NOLINT #include <string> +#include <type_traits> + #include "gtest/internal/gtest-port.h" #include "src/gtest-internal-inl.h" @@ -102,9 +107,19 @@ void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count, *os << ">"; } +// Helpers for widening a character to char32_t. Since the standard does not +// specify if char / wchar_t is signed or unsigned, it is important to first +// convert it to the unsigned type of the same width before widening it to +// char32_t. +template <typename CharType> +char32_t ToChar32(CharType in) { + return static_cast<char32_t>( + static_cast<typename std::make_unsigned<CharType>::type>(in)); +} + } // namespace -namespace internal2 { +namespace internal { // Delegates to PrintBytesInObjectToImpl() to print the bytes in the // given object. The delegation simplifies the implementation, which @@ -116,10 +131,6 @@ void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count, PrintBytesInObjectToImpl(obj_bytes, count, os); } -} // namespace internal2 - -namespace internal { - // Depending on the value of a char (or wchar_t), we print it in one // of three formats: // - as is if it's a printable ASCII (e.g. 'a', '2', ' '), @@ -134,18 +145,15 @@ enum CharFormat { // Returns true if c is a printable ASCII character. We test the // value of c directly instead of calling isprint(), which is buggy on // Windows Mobile. -inline bool IsPrintableAscii(wchar_t c) { - return 0x20 <= c && c <= 0x7E; -} +inline bool IsPrintableAscii(char32_t c) { return 0x20 <= c && c <= 0x7E; } -// Prints a wide or narrow char c as a character literal without the -// quotes, escaping it when necessary; returns how c was formatted. -// The template argument UnsignedChar is the unsigned version of Char, -// which is the type of c. -template <typename UnsignedChar, typename Char> +// Prints c (of type char, char8_t, char16_t, char32_t, or wchar_t) as a +// character literal without the quotes, escaping it when necessary; returns how +// c was formatted. +template <typename Char> static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) { - wchar_t w_c = static_cast<wchar_t>(c); - switch (w_c) { + const char32_t u_c = ToChar32(c); + switch (u_c) { case L'\0': *os << "\\0"; break; @@ -177,13 +185,12 @@ static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) { *os << "\\v"; break; default: - if (IsPrintableAscii(w_c)) { + if (IsPrintableAscii(u_c)) { *os << static_cast<char>(c); return kAsIs; } else { ostream::fmtflags flags = os->flags(); - *os << "\\x" << std::hex << std::uppercase - << static_cast<int>(static_cast<UnsignedChar>(c)); + *os << "\\x" << std::hex << std::uppercase << static_cast<int>(u_c); os->flags(flags); return kHexEscape; } @@ -191,9 +198,9 @@ static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) { return kSpecialEscape; } -// Prints a wchar_t c as if it's part of a string literal, escaping it when +// Prints a char32_t c as if it's part of a string literal, escaping it when // necessary; returns how c was formatted. -static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) { +static CharFormat PrintAsStringLiteralTo(char32_t c, ostream* os) { switch (c) { case L'\'': *os << "'"; @@ -202,26 +209,68 @@ static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) { *os << "\\\""; return kSpecialEscape; default: - return PrintAsCharLiteralTo<wchar_t>(c, os); + return PrintAsCharLiteralTo(c, os); } } +static const char* GetCharWidthPrefix(char) { + return ""; +} + +static const char* GetCharWidthPrefix(signed char) { + return ""; +} + +static const char* GetCharWidthPrefix(unsigned char) { + return ""; +} + +#ifdef __cpp_char8_t +static const char* GetCharWidthPrefix(char8_t) { + return "u8"; +} +#endif + +static const char* GetCharWidthPrefix(char16_t) { + return "u"; +} + +static const char* GetCharWidthPrefix(char32_t) { + return "U"; +} + +static const char* GetCharWidthPrefix(wchar_t) { + return "L"; +} + // Prints a char c as if it's part of a string literal, escaping it when // necessary; returns how c was formatted. static CharFormat PrintAsStringLiteralTo(char c, ostream* os) { - return PrintAsStringLiteralTo( - static_cast<wchar_t>(static_cast<unsigned char>(c)), os); + return PrintAsStringLiteralTo(ToChar32(c), os); +} + +#ifdef __cpp_char8_t +static CharFormat PrintAsStringLiteralTo(char8_t c, ostream* os) { + return PrintAsStringLiteralTo(ToChar32(c), os); +} +#endif + +static CharFormat PrintAsStringLiteralTo(char16_t c, ostream* os) { + return PrintAsStringLiteralTo(ToChar32(c), os); } -// Prints a wide or narrow character c and its code. '\0' is printed -// as "'\\0'", other unprintable characters are also properly escaped -// using the standard C++ escape sequence. The template argument -// UnsignedChar is the unsigned version of Char, which is the type of c. -template <typename UnsignedChar, typename Char> +static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) { + return PrintAsStringLiteralTo(ToChar32(c), os); +} + +// Prints a character c (of type char, char8_t, char16_t, char32_t, or wchar_t) +// and its code. '\0' is printed as "'\\0'", other unprintable characters are +// also properly escaped using the standard C++ escape sequence. +template <typename Char> void PrintCharAndCodeTo(Char c, ostream* os) { // First, print c as a literal in the most readable form we can find. - *os << ((sizeof(c) > 1) ? "L'" : "'"); - const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os); + *os << GetCharWidthPrefix(c) << "'"; + const CharFormat format = PrintAsCharLiteralTo(c, os); *os << "'"; // To aid user debugging, we also print c's code in decimal, unless @@ -242,21 +291,21 @@ void PrintCharAndCodeTo(Char c, ostream* os) { *os << ")"; } -void PrintTo(unsigned char c, ::std::ostream* os) { - PrintCharAndCodeTo<unsigned char>(c, os); -} -void PrintTo(signed char c, ::std::ostream* os) { - PrintCharAndCodeTo<unsigned char>(c, os); -} +void PrintTo(unsigned char c, ::std::ostream* os) { PrintCharAndCodeTo(c, os); } +void PrintTo(signed char c, ::std::ostream* os) { PrintCharAndCodeTo(c, os); } // Prints a wchar_t as a symbol if it is printable or as its internal // code otherwise and also as its code. L'\0' is printed as "L'\\0'". -void PrintTo(wchar_t wc, ostream* os) { - PrintCharAndCodeTo<wchar_t>(wc, os); +void PrintTo(wchar_t wc, ostream* os) { PrintCharAndCodeTo(wc, os); } + +// TODO(dcheng): Consider making this delegate to PrintCharAndCodeTo() as well. +void PrintTo(char32_t c, ::std::ostream* os) { + *os << std::hex << "U+" << std::uppercase << std::setfill('0') << std::setw(4) + << static_cast<uint32_t>(c); } // Prints the given array of characters to the ostream. CharType must be either -// char or wchar_t. +// char, char8_t, char16_t, char32_t, or wchar_t. // The array starts at begin, the length is len, it may include '\0' characters // and may not be NUL-terminated. template <typename CharType> @@ -266,8 +315,8 @@ GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ static CharFormat PrintCharsAsStringTo( const CharType* begin, size_t len, ostream* os) { - const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\""; - *os << kQuoteBegin; + const char* const quote_prefix = GetCharWidthPrefix(*begin); + *os << quote_prefix << "\""; bool is_previous_hex = false; CharFormat print_format = kAsIs; for (size_t index = 0; index < len; ++index) { @@ -276,7 +325,7 @@ static CharFormat PrintCharsAsStringTo( // Previous character is of '\x..' form and this character can be // interpreted as another hexadecimal digit in its number. Break string to // disambiguate. - *os << "\" " << kQuoteBegin; + *os << "\" " << quote_prefix << "\""; } is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape; // Remember if any characters required hex escaping. @@ -322,22 +371,57 @@ void UniversalPrintArray(const char* begin, size_t len, ostream* os) { UniversalPrintCharArray(begin, len, os); } +#ifdef __cpp_char8_t +// Prints a (const) char8_t array of 'len' elements, starting at address +// 'begin'. +void UniversalPrintArray(const char8_t* begin, size_t len, ostream* os) { + UniversalPrintCharArray(begin, len, os); +} +#endif + +// Prints a (const) char16_t array of 'len' elements, starting at address +// 'begin'. +void UniversalPrintArray(const char16_t* begin, size_t len, ostream* os) { + UniversalPrintCharArray(begin, len, os); +} + +// Prints a (const) char32_t array of 'len' elements, starting at address +// 'begin'. +void UniversalPrintArray(const char32_t* begin, size_t len, ostream* os) { + UniversalPrintCharArray(begin, len, os); +} + // Prints a (const) wchar_t array of 'len' elements, starting at address // 'begin'. void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) { UniversalPrintCharArray(begin, len, os); } -// Prints the given C string to the ostream. -void PrintTo(const char* s, ostream* os) { +namespace { + +// Prints a null-terminated C-style string to the ostream. +template <typename Char> +void PrintCStringTo(const Char* s, ostream* os) { if (s == nullptr) { *os << "NULL"; } else { *os << ImplicitCast_<const void*>(s) << " pointing to "; - PrintCharsAsStringTo(s, strlen(s), os); + PrintCharsAsStringTo(s, std::char_traits<Char>::length(s), os); } } +} // anonymous namespace + +void PrintTo(const char* s, ostream* os) { PrintCStringTo(s, os); } + +#ifdef __cpp_char8_t +void PrintTo(const char8_t* s, ostream* os) { PrintCStringTo(s, os); } +#endif + +void PrintTo(const char16_t* s, ostream* os) { PrintCStringTo(s, os); } + +void PrintTo(const char32_t* s, ostream* os) { PrintCStringTo(s, os); } + // MSVC compiler can be configured to define whar_t as a typedef // of unsigned short. Defining an overload for const wchar_t* in that case // would cause pointers to unsigned shorts be printed as wide strings, @@ -346,14 +430,7 @@ void PrintTo(const char* s, ostream* os) { // wchar_t is implemented as a native type. #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) // Prints the given wide C string to the ostream. -void PrintTo(const wchar_t* s, ostream* os) { - if (s == nullptr) { - *os << "NULL"; - } else { - *os << ImplicitCast_<const void*>(s) << " pointing to "; - PrintCharsAsStringTo(s, wcslen(s), os); - } -} +void PrintTo(const wchar_t* s, ostream* os) { PrintCStringTo(s, os); } #endif // wchar_t is native namespace { @@ -431,6 +508,20 @@ void PrintStringTo(const ::std::string& s, ostream* os) { } } +#ifdef __cpp_char8_t +void PrintU8StringTo(const ::std::u8string& s, ostream* os) { + PrintCharsAsStringTo(s.data(), s.size(), os); +} +#endif + +void PrintU16StringTo(const ::std::u16string& s, ostream* os) { + PrintCharsAsStringTo(s.data(), s.size(), os); +} + +void PrintU32StringTo(const ::std::u32string& s, ostream* os) { + PrintCharsAsStringTo(s.data(), s.size(), os); +} + #if GTEST_HAS_STD_WSTRING void PrintWideStringTo(const ::std::wstring& s, ostream* os) { PrintCharsAsStringTo(s.data(), s.size(), os); diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-test-part.cc b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-test-part.cc index 178317a6bcd..a938683cede 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-test-part.cc +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-test-part.cc @@ -31,6 +31,8 @@ // The Google C++ Testing and Mocking Framework (Google Test) #include "gtest/gtest-test-part.h" + +#include "gtest/internal/gtest-port.h" #include "src/gtest-internal-inl.h" namespace testing { @@ -46,7 +48,9 @@ std::string TestPartResult::ExtractSummary(const char* message) { // Prints a TestPartResult object. std::ostream& operator<<(std::ostream& os, const TestPartResult& result) { - return os << result.file_name() << ":" << result.line_number() << ": " + return os << internal::FormatFileLocation(result.file_name(), + result.line_number()) + << " " << (result.type() == TestPartResult::kSuccess ? "Success" : result.type() == TestPartResult::kSkip diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-typed-test.cc b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-typed-test.cc index 8677caf732b..c02c3df6599 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-typed-test.cc +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-typed-test.cc @@ -35,8 +35,6 @@ namespace testing { namespace internal { -#if GTEST_HAS_TYPED_TEST_P - // Skips to the first non-space char in str. Returns an empty string if str // contains only whitespace characters. static const char* SkipSpaces(const char* str) { @@ -58,7 +56,10 @@ static std::vector<std::string> SplitIntoTestNames(const char* src) { // registered_tests_; returns registered_tests if successful, or // aborts the program otherwise. const char* TypedTestSuitePState::VerifyRegisteredTestNames( - const char* file, int line, const char* registered_tests) { + const char* test_suite_name, const char* file, int line, + const char* registered_tests) { + RegisterTypeParameterizedTestSuite(test_suite_name, CodeLocation(file, line)); + typedef RegisteredTestsMap::const_iterator RegisteredTestIter; registered_ = true; @@ -75,17 +76,7 @@ const char* TypedTestSuitePState::VerifyRegisteredTestNames( continue; } - bool found = false; - for (RegisteredTestIter it = registered_tests_.begin(); - it != registered_tests_.end(); - ++it) { - if (name == it->first) { - found = true; - break; - } - } - - if (found) { + if (registered_tests_.count(name) != 0) { tests.insert(name); } else { errors << "No test named " << name @@ -112,7 +103,5 @@ const char* TypedTestSuitePState::VerifyRegisteredTestNames( return registered_tests; } -#endif // GTEST_HAS_TYPED_TEST_P - } // namespace internal } // namespace testing diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest.cc b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest.cc index a5b4e5ac78c..c85ff9687fa 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest.cc +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest.cc @@ -35,7 +35,6 @@ #include "gtest/gtest-spi.h" #include <ctype.h> -#include <math.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> @@ -44,6 +43,9 @@ #include <wctype.h> #include <algorithm> +#include <chrono> // NOLINT +#include <cmath> +#include <cstdint> #include <iomanip> #include <limits> #include <list> @@ -54,8 +56,6 @@ #if GTEST_OS_LINUX -# define GTEST_HAS_GETTIMEOFDAY_ 1 - # include <fcntl.h> // NOLINT # include <limits.h> // NOLINT # include <sched.h> // NOLINT @@ -67,7 +67,6 @@ # include <string> #elif GTEST_OS_ZOS -# define GTEST_HAS_GETTIMEOFDAY_ 1 # include <sys/time.h> // NOLINT // On z/OS we additionally need strings.h for strcasecmp. @@ -83,24 +82,21 @@ # include <windows.h> // NOLINT # undef min +#ifdef _MSC_VER # include <crtdbg.h> // NOLINT -# include <debugapi.h> // NOLINT +#endif + # include <io.h> // NOLINT # include <sys/timeb.h> // NOLINT # include <sys/types.h> // NOLINT # include <sys/stat.h> // NOLINT # if GTEST_OS_WINDOWS_MINGW -// MinGW has gettimeofday() but not _ftime64(). -# define GTEST_HAS_GETTIMEOFDAY_ 1 # include <sys/time.h> // NOLINT # endif // GTEST_OS_WINDOWS_MINGW #else -// Assume other platforms have gettimeofday(). -# define GTEST_HAS_GETTIMEOFDAY_ 1 - // cpplint thinks that the header is already included, so we want to // silence it. # include <sys/time.h> // NOLINT @@ -209,6 +205,21 @@ static const char* GetDefaultFilter() { return kUniversalFilter; } +// Bazel passes in the argument to '--test_runner_fail_fast' via the +// TESTBRIDGE_TEST_RUNNER_FAIL_FAST environment variable. +static bool GetDefaultFailFast() { + const char* const testbridge_test_runner_fail_fast = + internal::posix::GetEnv("TESTBRIDGE_TEST_RUNNER_FAIL_FAST"); + if (testbridge_test_runner_fail_fast != nullptr) { + return strcmp(testbridge_test_runner_fail_fast, "1") == 0; + } + return false; +} + +GTEST_DEFINE_bool_( + fail_fast, internal::BoolFromGTestEnv("fail_fast", GetDefaultFailFast()), + "True if and only if a test failure should stop further test execution."); + GTEST_DEFINE_bool_( also_run_disabled_tests, internal::BoolFromGTestEnv("also_run_disabled_tests", false), @@ -269,6 +280,10 @@ GTEST_DEFINE_string_( "executable's name and, if necessary, made unique by adding " "digits."); +GTEST_DEFINE_bool_( + brief, internal::BoolFromGTestEnv("brief", false), + "True if only test failures should be displayed in text output."); + GTEST_DEFINE_bool_(print_time, internal::BoolFromGTestEnv("print_time", true), "True if and only if " GTEST_NAME_ " should display elapsed time in text output."); @@ -330,10 +345,10 @@ namespace internal { // Generates a random number from [0, range), using a Linear // Congruential Generator (LCG). Crashes if 'range' is 0 or greater // than kMaxRange. -UInt32 Random::Generate(UInt32 range) { +uint32_t Random::Generate(uint32_t range) { // These constants are the same as are used in glibc's rand(3). // Use wider types than necessary to prevent unsigned overflow diagnostics. - state_ = static_cast<UInt32>(1103515245ULL*state_ + 12345U) % kMaxRange; + state_ = static_cast<uint32_t>(1103515245ULL*state_ + 12345U) % kMaxRange; GTEST_CHECK_(range > 0) << "Cannot generate a number in the range [0, 0)."; @@ -403,6 +418,162 @@ void AssertHelper::operator=(const Message& message) const { ); // NOLINT } +namespace { + +// When TEST_P is found without a matching INSTANTIATE_TEST_SUITE_P +// to creates test cases for it, a syntetic test case is +// inserted to report ether an error or a log message. +// +// This configuration bit will likely be removed at some point. +constexpr bool kErrorOnUninstantiatedParameterizedTest = true; +constexpr bool kErrorOnUninstantiatedTypeParameterizedTest = true; + +// A test that fails at a given file/line location with a given message. +class FailureTest : public Test { + public: + explicit FailureTest(const CodeLocation& loc, std::string error_message, + bool as_error) + : loc_(loc), + error_message_(std::move(error_message)), + as_error_(as_error) {} + + void TestBody() override { + if (as_error_) { + AssertHelper(TestPartResult::kNonFatalFailure, loc_.file.c_str(), + loc_.line, "") = Message() << error_message_; + } else { + std::cout << error_message_ << std::endl; + } + } + + private: + const CodeLocation loc_; + const std::string error_message_; + const bool as_error_; +}; + + +} // namespace + +std::set<std::string>* GetIgnoredParameterizedTestSuites() { + return UnitTest::GetInstance()->impl()->ignored_parameterized_test_suites(); +} + +// Add a given test_suit to the list of them allow to go un-instantiated. +MarkAsIgnored::MarkAsIgnored(const char* test_suite) { + GetIgnoredParameterizedTestSuites()->insert(test_suite); +} + +// If this parameterized test suite has no instantiations (and that +// has not been marked as okay), emit a test case reporting that. +void InsertSyntheticTestCase(const std::string& name, CodeLocation location, + bool has_test_p) { + const auto& ignored = *GetIgnoredParameterizedTestSuites(); + if (ignored.find(name) != ignored.end()) return; + + const char kMissingInstantiation[] = // + " is defined via TEST_P, but never instantiated. None of the test cases " + "will run. Either no INSTANTIATE_TEST_SUITE_P is provided or the only " + "ones provided expand to nothing." + "\n\n" + "Ideally, TEST_P definitions should only ever be included as part of " + "binaries that intend to use them. (As opposed to, for example, being " + "placed in a library that may be linked in to get other utilities.)"; + + const char kMissingTestCase[] = // + " is instantiated via INSTANTIATE_TEST_SUITE_P, but no tests are " + "defined via TEST_P . No test cases will run." + "\n\n" + "Ideally, INSTANTIATE_TEST_SUITE_P should only ever be invoked from " + "code that always depend on code that provides TEST_P. Failing to do " + "so is often an indication of dead code, e.g. the last TEST_P was " + "removed but the rest got left behind."; + + std::string message = + "Parameterized test suite " + name + + (has_test_p ? kMissingInstantiation : kMissingTestCase) + + "\n\n" + "To suppress this error for this test suite, insert the following line " + "(in a non-header) in the namespace it is defined in:" + "\n\n" + "GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(" + name + ");"; + + std::string full_name = "UninstantiatedParameterizedTestSuite<" + name + ">"; + RegisterTest( // + "GoogleTestVerification", full_name.c_str(), + nullptr, // No type parameter. + nullptr, // No value parameter. + location.file.c_str(), location.line, [message, location] { + return new FailureTest(location, message, + kErrorOnUninstantiatedParameterizedTest); + }); +} + +void RegisterTypeParameterizedTestSuite(const char* test_suite_name, + CodeLocation code_location) { + GetUnitTestImpl()->type_parameterized_test_registry().RegisterTestSuite( + test_suite_name, code_location); +} + +void RegisterTypeParameterizedTestSuiteInstantiation(const char* case_name) { + GetUnitTestImpl() + ->type_parameterized_test_registry() + .RegisterInstantiation(case_name); +} + +void TypeParameterizedTestSuiteRegistry::RegisterTestSuite( + const char* test_suite_name, CodeLocation code_location) { + suites_.emplace(std::string(test_suite_name), + TypeParameterizedTestSuiteInfo(code_location)); +} + +void TypeParameterizedTestSuiteRegistry::RegisterInstantiation( + const char* test_suite_name) { + auto it = suites_.find(std::string(test_suite_name)); + if (it != suites_.end()) { + it->second.instantiated = true; + } else { + GTEST_LOG_(ERROR) << "Unknown type parameterized test suit '" + << test_suite_name << "'"; + } +} + +void TypeParameterizedTestSuiteRegistry::CheckForInstantiations() { + const auto& ignored = *GetIgnoredParameterizedTestSuites(); + for (const auto& testcase : suites_) { + if (testcase.second.instantiated) continue; + if (ignored.find(testcase.first) != ignored.end()) continue; + + std::string message = + "Type parameterized test suite " + testcase.first + + " is defined via REGISTER_TYPED_TEST_SUITE_P, but never instantiated " + "via INSTANTIATE_TYPED_TEST_SUITE_P. None of the test cases will run." + "\n\n" + "Ideally, TYPED_TEST_P definitions should only ever be included as " + "part of binaries that intend to use them. (As opposed to, for " + "example, being placed in a library that may be linked in to get other " + "utilities.)" + "\n\n" + "To suppress this error for this test suite, insert the following line " + "(in a non-header) in the namespace it is defined in:" + "\n\n" + "GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(" + + testcase.first + ");"; + + std::string full_name = + "UninstantiatedTypeParameterizedTestSuite<" + testcase.first + ">"; + RegisterTest( // + "GoogleTestVerification", full_name.c_str(), + nullptr, // No type parameter. + nullptr, // No value parameter. + testcase.second.code_location.file.c_str(), + testcase.second.code_location.line, [message, testcase] { + return new FailureTest(testcase.second.code_location, message, + kErrorOnUninstantiatedTypeParameterizedTest); + }); + } +} + // A copy of all command line arguments. Set by InitGoogleTest(). static ::std::vector<std::string> g_argvs; @@ -475,47 +646,82 @@ std::string UnitTestOptions::GetAbsolutePathToOutputFile() { return result.string(); } -// Returns true if and only if the wildcard pattern matches the string. -// The first ':' or '\0' character in pattern marks the end of it. +// Returns true if and only if the wildcard pattern matches the string. Each +// pattern consists of regular characters, single-character wildcards (?), and +// multi-character wildcards (*). // -// This recursive algorithm isn't very efficient, but is clear and -// works well enough for matching test names, which are short. -bool UnitTestOptions::PatternMatchesString(const char *pattern, - const char *str) { - switch (*pattern) { - case '\0': - case ':': // Either ':' or '\0' marks the end of the pattern. - return *str == '\0'; - case '?': // Matches any single character. - return *str != '\0' && PatternMatchesString(pattern + 1, str + 1); - case '*': // Matches any string (possibly empty) of characters. - return (*str != '\0' && PatternMatchesString(pattern, str + 1)) || - PatternMatchesString(pattern + 1, str); - default: // Non-special character. Matches itself. - return *pattern == *str && - PatternMatchesString(pattern + 1, str + 1); - } -} - -bool UnitTestOptions::MatchesFilter( - const std::string& name, const char* filter) { - const char *cur_pattern = filter; - for (;;) { - if (PatternMatchesString(cur_pattern, name.c_str())) { - return true; +// This function implements a linear-time string globbing algorithm based on +// https://research.swtch.com/glob. +static bool PatternMatchesString(const std::string& name_str, + const char* pattern, const char* pattern_end) { + const char* name = name_str.c_str(); + const char* const name_begin = name; + const char* const name_end = name + name_str.size(); + + const char* pattern_next = pattern; + const char* name_next = name; + + while (pattern < pattern_end || name < name_end) { + if (pattern < pattern_end) { + switch (*pattern) { + default: // Match an ordinary character. + if (name < name_end && *name == *pattern) { + ++pattern; + ++name; + continue; + } + break; + case '?': // Match any single character. + if (name < name_end) { + ++pattern; + ++name; + continue; + } + break; + case '*': + // Match zero or more characters. Start by skipping over the wildcard + // and matching zero characters from name. If that fails, restart and + // match one more character than the last attempt. + pattern_next = pattern; + name_next = name + 1; + ++pattern; + continue; + } } + // Failed to match a character. Restart if possible. + if (name_begin < name_next && name_next <= name_end) { + pattern = pattern_next; + name = name_next; + continue; + } + return false; + } + return true; +} - // Finds the next pattern in the filter. - cur_pattern = strchr(cur_pattern, ':'); +bool UnitTestOptions::MatchesFilter(const std::string& name_str, + const char* filter) { + // The filter is a list of patterns separated by colons (:). + const char* pattern = filter; + while (true) { + // Find the bounds of this pattern. + const char* const next_sep = strchr(pattern, ':'); + const char* const pattern_end = + next_sep != nullptr ? next_sep : pattern + strlen(pattern); - // Returns if no more pattern can be found. - if (cur_pattern == nullptr) { - return false; + // Check if this pattern matches name_str. + if (PatternMatchesString(name_str, pattern, pattern_end)) { + return true; } - // Skips the pattern separater (the ':' character). - cur_pattern++; + // Give up on this pattern. However, if we found a pattern separator (:), + // advance to the next pattern (skipping over the separator) and restart. + if (next_sep == nullptr) { + return false; + } + pattern = next_sep + 1; } + return true; } // Returns true if and only if the user-specified filter matches the test @@ -825,44 +1031,30 @@ std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) { ); // NOLINT } -// Returns the current time in milliseconds. +// A helper class for measuring elapsed times. +class Timer { + public: + Timer() : start_(std::chrono::steady_clock::now()) {} + + // Return time elapsed in milliseconds since the timer was created. + TimeInMillis Elapsed() { + return std::chrono::duration_cast<std::chrono::milliseconds>( + std::chrono::steady_clock::now() - start_) + .count(); + } + + private: + std::chrono::steady_clock::time_point start_; +}; + +// Returns a timestamp as milliseconds since the epoch. Note this time may jump +// around subject to adjustments by the system, to measure elapsed time use +// Timer instead. TimeInMillis GetTimeInMillis() { -#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__) - // Difference between 1970-01-01 and 1601-01-01 in milliseconds. - // http://analogous.blogspot.com/2005/04/epoch.html - const TimeInMillis kJavaEpochToWinFileTimeDelta = - static_cast<TimeInMillis>(116444736UL) * 100000UL; - const DWORD kTenthMicrosInMilliSecond = 10000; - - SYSTEMTIME now_systime; - FILETIME now_filetime; - ULARGE_INTEGER now_int64; - GetSystemTime(&now_systime); - if (SystemTimeToFileTime(&now_systime, &now_filetime)) { - now_int64.LowPart = now_filetime.dwLowDateTime; - now_int64.HighPart = now_filetime.dwHighDateTime; - now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) - - kJavaEpochToWinFileTimeDelta; - return now_int64.QuadPart; - } - return 0; -#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_ - __timeb64 now; - - // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996 - // (deprecated function) there. - GTEST_DISABLE_MSC_DEPRECATED_PUSH_() - _ftime64(&now); - GTEST_DISABLE_MSC_DEPRECATED_POP_() - - return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm; -#elif GTEST_HAS_GETTIMEOFDAY_ - struct timeval now; - gettimeofday(&now, nullptr); - return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000; -#else -# error "Don't know how to get the current time on your system." -#endif + return std::chrono::duration_cast<std::chrono::milliseconds>( + std::chrono::system_clock::now() - + std::chrono::system_clock::from_time_t(0)) + .count(); } // Utilities @@ -1377,6 +1569,31 @@ AssertionResult DoubleNearPredFormat(const char* expr1, const double diff = fabs(val1 - val2); if (diff <= abs_error) return AssertionSuccess(); + // Find the value which is closest to zero. + const double min_abs = std::min(fabs(val1), fabs(val2)); + // Find the distance to the next double from that value. + const double epsilon = + nextafter(min_abs, std::numeric_limits<double>::infinity()) - min_abs; + // Detect the case where abs_error is so small that EXPECT_NEAR is + // effectively the same as EXPECT_EQUAL, and give an informative error + // message so that the situation can be more easily understood without + // requiring exotic floating-point knowledge. + // Don't do an epsilon check if abs_error is zero because that implies + // that an equality check was actually intended. + if (!(std::isnan)(val1) && !(std::isnan)(val2) && abs_error > 0 && + abs_error < epsilon) { + return AssertionFailure() + << "The difference between " << expr1 << " and " << expr2 << " is " + << diff << ", where\n" + << expr1 << " evaluates to " << val1 << ",\n" + << expr2 << " evaluates to " << val2 << ".\nThe abs_error parameter " + << abs_error_expr << " evaluates to " << abs_error + << " which is smaller than the minimum distance between doubles for " + "numbers of this magnitude which is " + << epsilon + << ", thus making this EXPECT_NEAR check equivalent to " + "EXPECT_EQUAL. Consider using EXPECT_DOUBLE_EQ instead."; + } return AssertionFailure() << "The difference between " << expr1 << " and " << expr2 << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n" @@ -1439,57 +1656,6 @@ AssertionResult DoubleLE(const char* expr1, const char* expr2, namespace internal { -// The helper function for {ASSERT|EXPECT}_EQ with int or enum -// arguments. -AssertionResult CmpHelperEQ(const char* lhs_expression, - const char* rhs_expression, - BiggestInt lhs, - BiggestInt rhs) { - if (lhs == rhs) { - return AssertionSuccess(); - } - - return EqFailure(lhs_expression, - rhs_expression, - FormatForComparisonFailureMessage(lhs, rhs), - FormatForComparisonFailureMessage(rhs, lhs), - false); -} - -// A macro for implementing the helper functions needed to implement -// ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here -// just to avoid copy-and-paste of similar code. -#define GTEST_IMPL_CMP_HELPER_(op_name, op)\ -AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ - BiggestInt val1, BiggestInt val2) {\ - if (val1 op val2) {\ - return AssertionSuccess();\ - } else {\ - return AssertionFailure() \ - << "Expected: (" << expr1 << ") " #op " (" << expr2\ - << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\ - << " vs " << FormatForComparisonFailureMessage(val2, val1);\ - }\ -} - -// Implements the helper function for {ASSERT|EXPECT}_NE with int or -// enum arguments. -GTEST_IMPL_CMP_HELPER_(NE, !=) -// Implements the helper function for {ASSERT|EXPECT}_LE with int or -// enum arguments. -GTEST_IMPL_CMP_HELPER_(LE, <=) -// Implements the helper function for {ASSERT|EXPECT}_LT with int or -// enum arguments. -GTEST_IMPL_CMP_HELPER_(LT, < ) -// Implements the helper function for {ASSERT|EXPECT}_GE with int or -// enum arguments. -GTEST_IMPL_CMP_HELPER_(GE, >=) -// Implements the helper function for {ASSERT|EXPECT}_GT with int or -// enum arguments. -GTEST_IMPL_CMP_HELPER_(GT, > ) - -#undef GTEST_IMPL_CMP_HELPER_ - // The helper function for {ASSERT|EXPECT}_STREQ. AssertionResult CmpHelperSTREQ(const char* lhs_expression, const char* rhs_expression, @@ -1735,33 +1901,33 @@ AssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT // 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx // The maximum code-point a one-byte UTF-8 sequence can represent. -const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) << 7) - 1; +constexpr uint32_t kMaxCodePoint1 = (static_cast<uint32_t>(1) << 7) - 1; // The maximum code-point a two-byte UTF-8 sequence can represent. -const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1; +constexpr uint32_t kMaxCodePoint2 = (static_cast<uint32_t>(1) << (5 + 6)) - 1; // The maximum code-point a three-byte UTF-8 sequence can represent. -const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1; +constexpr uint32_t kMaxCodePoint3 = (static_cast<uint32_t>(1) << (4 + 2*6)) - 1; // The maximum code-point a four-byte UTF-8 sequence can represent. -const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1; +constexpr uint32_t kMaxCodePoint4 = (static_cast<uint32_t>(1) << (3 + 3*6)) - 1; // Chops off the n lowest bits from a bit pattern. Returns the n // lowest bits. As a side effect, the original bit pattern will be // shifted to the right by n bits. -inline UInt32 ChopLowBits(UInt32* bits, int n) { - const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1); +inline uint32_t ChopLowBits(uint32_t* bits, int n) { + const uint32_t low_bits = *bits & ((static_cast<uint32_t>(1) << n) - 1); *bits >>= n; return low_bits; } // Converts a Unicode code point to a narrow string in UTF-8 encoding. -// code_point parameter is of type UInt32 because wchar_t may not be +// code_point parameter is of type uint32_t because wchar_t may not be // wide enough to contain a code point. // If the code_point is not a valid Unicode code point // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted // to "(Invalid Unicode 0xXXXXXXXX)". -std::string CodePointToUtf8(UInt32 code_point) { +std::string CodePointToUtf8(uint32_t code_point) { if (code_point > kMaxCodePoint4) { return "(Invalid Unicode 0x" + String::FormatHexUInt32(code_point) + ")"; } @@ -1802,11 +1968,11 @@ inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) { } // Creates a Unicode code point from UTF16 surrogate pair. -inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first, - wchar_t second) { - const auto first_u = static_cast<UInt32>(first); - const auto second_u = static_cast<UInt32>(second); - const UInt32 mask = (1 << 10) - 1; +inline uint32_t CreateCodePointFromUtf16SurrogatePair(wchar_t first, + wchar_t second) { + const auto first_u = static_cast<uint32_t>(first); + const auto second_u = static_cast<uint32_t>(second); + const uint32_t mask = (1 << 10) - 1; return (sizeof(wchar_t) == 2) ? (((first_u & mask) << 10) | (second_u & mask)) + 0x10000 : @@ -1834,7 +2000,7 @@ std::string WideStringToUtf8(const wchar_t* str, int num_chars) { ::std::stringstream stream; for (int i = 0; i < num_chars; ++i) { - UInt32 unicode_code_point; + uint32_t unicode_code_point; if (str[i] == L'\0') { break; @@ -1843,7 +2009,7 @@ std::string WideStringToUtf8(const wchar_t* str, int num_chars) { str[i + 1]); i++; } else { - unicode_code_point = static_cast<UInt32>(str[i]); + unicode_code_point = static_cast<uint32_t>(str[i]); } stream << CodePointToUtf8(unicode_code_point); @@ -1963,13 +2129,18 @@ bool String::EndsWithCaseInsensitive( // Formats an int value as "%02d". std::string String::FormatIntWidth2(int value) { + return FormatIntWidthN(value, 2); +} + +// Formats an int value to given width with leading zeros. +std::string String::FormatIntWidthN(int value, int width) { std::stringstream ss; - ss << std::setfill('0') << std::setw(2) << value; + ss << std::setfill('0') << std::setw(width) << value; return ss.str(); } // Formats an int value as "%X". -std::string String::FormatHexUInt32(UInt32 value) { +std::string String::FormatHexUInt32(uint32_t value) { std::stringstream ss; ss << std::hex << std::uppercase << value; return ss.str(); @@ -1977,7 +2148,7 @@ std::string String::FormatHexUInt32(UInt32 value) { // Formats an int value as "%X". std::string String::FormatHexInt(int value) { - return FormatHexUInt32(static_cast<UInt32>(value)); + return FormatHexUInt32(static_cast<uint32_t>(value)); } // Formats a byte as "%02X". @@ -2016,7 +2187,9 @@ std::string AppendUserMessage(const std::string& gtest_msg, if (user_msg_string.empty()) { return gtest_msg; } - + if (gtest_msg.empty()) { + return user_msg_string; + } return gtest_msg + "\n" + user_msg_string; } @@ -2068,7 +2241,7 @@ void TestResult::RecordProperty(const std::string& xml_element, if (!ValidateTestProperty(xml_element, test_property)) { return; } - internal::MutexLock lock(&test_properites_mutex_); + internal::MutexLock lock(&test_properties_mutex_); const std::vector<TestProperty>::iterator property_with_matching_key = std::find_if(test_properties_.begin(), test_properties_.end(), internal::TestPropertyKeyIs(test_property.key())); @@ -2095,7 +2268,8 @@ static const char* const kReservedTestSuitesAttributes[] = { // The list of reserved attributes used in the <testsuite> element of XML // output. static const char* const kReservedTestSuiteAttributes[] = { - "disabled", "errors", "failures", "name", "tests", "time", "timestamp"}; + "disabled", "errors", "failures", "name", + "tests", "time", "timestamp", "skipped"}; // The list of reserved attributes used in the <testcase> element of XML output. static const char* const kReservedTestCaseAttributes[] = { @@ -2108,7 +2282,7 @@ static const char* const kReservedOutputTestCaseAttributes[] = { "classname", "name", "status", "time", "type_param", "value_param", "file", "line", "result", "timestamp"}; -template <int kSize> +template <size_t kSize> std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) { return std::vector<std::string>(array, array + kSize); } @@ -2552,6 +2726,7 @@ TestInfo::TestInfo(const std::string& a_test_suite_name, should_run_(false), is_disabled_(false), matches_filter_(false), + is_in_another_shard_(false), factory_(factory), result_() {} @@ -2565,7 +2740,7 @@ namespace internal { // // Arguments: // -// test_suite_name: name of the test suite +// test_suite_name: name of the test suite // name: name of the test // type_param: the name of the test's type parameter, or NULL if // this is not a typed or a type-parameterized test. @@ -2646,6 +2821,7 @@ namespace internal { void UnitTestImpl::RegisterParameterizedTests() { if (!parameterized_tests_registered_) { parameterized_test_registry_.RegisterTests(); + type_parameterized_test_registry_.CheckForInstantiations(); parameterized_tests_registered_ = true; } } @@ -2666,7 +2842,8 @@ void TestInfo::Run() { // Notifies the unit test event listeners that a test is about to start. repeater->OnTestStart(*this); - const TimeInMillis start = internal::GetTimeInMillis(); + result_.set_start_timestamp(internal::GetTimeInMillis()); + internal::Timer timer; impl->os_stack_trace_getter()->UponLeavingGTest(); @@ -2691,8 +2868,7 @@ void TestInfo::Run() { test, &Test::DeleteSelf_, "the test fixture's destructor"); } - result_.set_start_timestamp(start); - result_.set_elapsed_time(internal::GetTimeInMillis() - start); + result_.set_elapsed_time(timer.Elapsed()); // Notifies the unit test event listener that a test has just finished. repeater->OnTestEnd(*this); @@ -2702,6 +2878,28 @@ void TestInfo::Run() { impl->set_current_test_info(nullptr); } +// Skip and records a skipped test result for this object. +void TestInfo::Skip() { + if (!should_run_) return; + + internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); + impl->set_current_test_info(this); + + TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); + + // Notifies the unit test event listeners that a test is about to start. + repeater->OnTestStart(*this); + + const TestPartResult test_part_result = + TestPartResult(TestPartResult::kSkip, this->file(), this->line(), ""); + impl->GetTestPartResultReporterForCurrentThread()->ReportTestPartResult( + test_part_result); + + // Notifies the unit test event listener that a test has just finished. + repeater->OnTestEnd(*this); + impl->set_current_test_info(nullptr); +} + // class TestSuite // Gets the number of successful tests in this test suite. @@ -2748,7 +2946,7 @@ int TestSuite::total_test_count() const { // // Arguments: // -// name: name of the test suite +// a_name: name of the test suite // a_type_param: the name of the test suite's type parameter, or NULL if // this is not a typed or a type-parameterized test suite. // set_up_tc: pointer to the function that sets up the test suite @@ -2803,19 +3001,26 @@ void TestSuite::Run() { // Call both legacy and the new API repeater->OnTestSuiteStart(*this); // Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ repeater->OnTestCaseStart(*this); -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &TestSuite::RunSetUpTestSuite, "SetUpTestSuite()"); start_timestamp_ = internal::GetTimeInMillis(); + internal::Timer timer; for (int i = 0; i < total_test_count(); i++) { GetMutableTestInfo(i)->Run(); + if (GTEST_FLAG(fail_fast) && GetMutableTestInfo(i)->result()->Failed()) { + for (int j = i + 1; j < total_test_count(); j++) { + GetMutableTestInfo(j)->Skip(); + } + break; + } } - elapsed_time_ = internal::GetTimeInMillis() - start_timestamp_; + elapsed_time_ = timer.Elapsed(); impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( @@ -2824,9 +3029,39 @@ void TestSuite::Run() { // Call both legacy and the new API repeater->OnTestSuiteEnd(*this); // Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ repeater->OnTestCaseEnd(*this); -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + + impl->set_current_test_suite(nullptr); +} + +// Skips all tests under this TestSuite. +void TestSuite::Skip() { + if (!should_run_) return; + + internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); + impl->set_current_test_suite(this); + + TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); + + // Call both legacy and the new API + repeater->OnTestSuiteStart(*this); +// Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + repeater->OnTestCaseStart(*this); +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + + for (int i = 0; i < total_test_count(); i++) { + GetMutableTestInfo(i)->Skip(); + } + + // Call both legacy and the new API + repeater->OnTestSuiteEnd(*this); + // Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + repeater->OnTestCaseEnd(*this); +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ impl->set_current_test_suite(nullptr); } @@ -2878,7 +3113,7 @@ static std::string FormatTestSuiteCount(int test_suite_count) { static const char * TestPartResultTypeToString(TestPartResult::Type type) { switch (type) { case TestPartResult::kSkip: - return "Skipped"; + return "Skipped\n"; case TestPartResult::kSuccess: return "Success"; @@ -2932,9 +3167,12 @@ static void PrintTestPartResult(const TestPartResult& test_part_result) { // Returns the character attribute for the given color. static WORD GetColorAttribute(GTestColor color) { switch (color) { - case COLOR_RED: return FOREGROUND_RED; - case COLOR_GREEN: return FOREGROUND_GREEN; - case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN; + case GTestColor::kRed: + return FOREGROUND_RED; + case GTestColor::kGreen: + return FOREGROUND_GREEN; + case GTestColor::kYellow: + return FOREGROUND_RED | FOREGROUND_GREEN; default: return 0; } } @@ -2972,13 +3210,16 @@ static WORD GetNewColor(GTestColor color, WORD old_color_attrs) { #else -// Returns the ANSI color code for the given color. COLOR_DEFAULT is +// Returns the ANSI color code for the given color. GTestColor::kDefault is // an invalid input. static const char* GetAnsiColorCode(GTestColor color) { switch (color) { - case COLOR_RED: return "1"; - case COLOR_GREEN: return "2"; - case COLOR_YELLOW: return "3"; + case GTestColor::kRed: + return "1"; + case GTestColor::kGreen: + return "2"; + case GTestColor::kYellow: + return "3"; default: return nullptr; } @@ -3027,7 +3268,9 @@ bool ShouldUseColor(bool stdout_is_tty) { // cannot simply emit special characters and have the terminal change colors. // This routine must actually emit the characters rather than return a string // that would be colored when printed, as can be done on Linux. -void ColoredPrintf(GTestColor color, const char* fmt, ...) { + +GTEST_ATTRIBUTE_PRINTF_(2, 3) +void ColoredPrintf(GTestColor color, const char *fmt, ...) { va_list args; va_start(args, fmt); @@ -3037,7 +3280,7 @@ void ColoredPrintf(GTestColor color, const char* fmt, ...) { #else static const bool in_color_mode = ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0); - const bool use_color = in_color_mode && (color != COLOR_DEFAULT); + const bool use_color = in_color_mode && (color != GTestColor::kDefault); #endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS if (!use_color) { @@ -3134,6 +3377,7 @@ class PrettyUnitTestResultPrinter : public TestEventListener { private: static void PrintFailedTests(const UnitTest& unit_test); + static void PrintFailedTestSuites(const UnitTest& unit_test); static void PrintSkippedTests(const UnitTest& unit_test); }; @@ -3148,25 +3392,24 @@ void PrettyUnitTestResultPrinter::OnTestIterationStart( // Prints the filter if it's not *. This reminds the user that some // tests may be skipped. if (!String::CStringEquals(filter, kUniversalFilter)) { - ColoredPrintf(COLOR_YELLOW, - "Note: %s filter = %s\n", GTEST_NAME_, filter); + ColoredPrintf(GTestColor::kYellow, "Note: %s filter = %s\n", GTEST_NAME_, + filter); } if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) { - const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1); - ColoredPrintf(COLOR_YELLOW, - "Note: This is test shard %d of %s.\n", + const int32_t shard_index = Int32FromEnvOrDie(kTestShardIndex, -1); + ColoredPrintf(GTestColor::kYellow, "Note: This is test shard %d of %s.\n", static_cast<int>(shard_index) + 1, internal::posix::GetEnv(kTestTotalShards)); } if (GTEST_FLAG(shuffle)) { - ColoredPrintf(COLOR_YELLOW, + ColoredPrintf(GTestColor::kYellow, "Note: Randomizing tests' orders with a seed of %d .\n", unit_test.random_seed()); } - ColoredPrintf(COLOR_GREEN, "[==========] "); + ColoredPrintf(GTestColor::kGreen, "[==========] "); printf("Running %s from %s.\n", FormatTestCount(unit_test.test_to_run_count()).c_str(), FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str()); @@ -3175,7 +3418,7 @@ void PrettyUnitTestResultPrinter::OnTestIterationStart( void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart( const UnitTest& /*unit_test*/) { - ColoredPrintf(COLOR_GREEN, "[----------] "); + ColoredPrintf(GTestColor::kGreen, "[----------] "); printf("Global test environment set-up.\n"); fflush(stdout); } @@ -3184,7 +3427,7 @@ void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart( void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) { const std::string counts = FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); - ColoredPrintf(COLOR_GREEN, "[----------] "); + ColoredPrintf(GTestColor::kGreen, "[----------] "); printf("%s from %s", counts.c_str(), test_case.name()); if (test_case.type_param() == nullptr) { printf("\n"); @@ -3198,7 +3441,7 @@ void PrettyUnitTestResultPrinter::OnTestSuiteStart( const TestSuite& test_suite) { const std::string counts = FormatCountableNoun(test_suite.test_to_run_count(), "test", "tests"); - ColoredPrintf(COLOR_GREEN, "[----------] "); + ColoredPrintf(GTestColor::kGreen, "[----------] "); printf("%s from %s", counts.c_str(), test_suite.name()); if (test_suite.type_param() == nullptr) { printf("\n"); @@ -3210,7 +3453,7 @@ void PrettyUnitTestResultPrinter::OnTestSuiteStart( #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) { - ColoredPrintf(COLOR_GREEN, "[ RUN ] "); + ColoredPrintf(GTestColor::kGreen, "[ RUN ] "); PrintTestName(test_info.test_suite_name(), test_info.name()); printf("\n"); fflush(stdout); @@ -3220,9 +3463,7 @@ void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) { void PrettyUnitTestResultPrinter::OnTestPartResult( const TestPartResult& result) { switch (result.type()) { - // If the test part succeeded, or was skipped, - // we don't need to do anything. - case TestPartResult::kSkip: + // If the test part succeeded, we don't need to do anything. case TestPartResult::kSuccess: return; default: @@ -3235,11 +3476,11 @@ void PrettyUnitTestResultPrinter::OnTestPartResult( void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) { if (test_info.result()->Passed()) { - ColoredPrintf(COLOR_GREEN, "[ OK ] "); + ColoredPrintf(GTestColor::kGreen, "[ OK ] "); } else if (test_info.result()->Skipped()) { - ColoredPrintf(COLOR_GREEN, "[ SKIPPED ] "); + ColoredPrintf(GTestColor::kGreen, "[ SKIPPED ] "); } else { - ColoredPrintf(COLOR_RED, "[ FAILED ] "); + ColoredPrintf(GTestColor::kRed, "[ FAILED ] "); } PrintTestName(test_info.test_suite_name(), test_info.name()); if (test_info.result()->Failed()) @@ -3260,7 +3501,7 @@ void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) { const std::string counts = FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); - ColoredPrintf(COLOR_GREEN, "[----------] "); + ColoredPrintf(GTestColor::kGreen, "[----------] "); printf("%s from %s (%s ms total)\n\n", counts.c_str(), test_case.name(), internal::StreamableToString(test_case.elapsed_time()).c_str()); fflush(stdout); @@ -3271,7 +3512,7 @@ void PrettyUnitTestResultPrinter::OnTestSuiteEnd(const TestSuite& test_suite) { const std::string counts = FormatCountableNoun(test_suite.test_to_run_count(), "test", "tests"); - ColoredPrintf(COLOR_GREEN, "[----------] "); + ColoredPrintf(GTestColor::kGreen, "[----------] "); printf("%s from %s (%s ms total)\n\n", counts.c_str(), test_suite.name(), internal::StreamableToString(test_suite.elapsed_time()).c_str()); fflush(stdout); @@ -3280,7 +3521,7 @@ void PrettyUnitTestResultPrinter::OnTestSuiteEnd(const TestSuite& test_suite) { void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart( const UnitTest& /*unit_test*/) { - ColoredPrintf(COLOR_GREEN, "[----------] "); + ColoredPrintf(GTestColor::kGreen, "[----------] "); printf("Global test environment tear-down\n"); fflush(stdout); } @@ -3288,9 +3529,8 @@ void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart( // Internal helper for printing the list of failed tests. void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) { const int failed_test_count = unit_test.failed_test_count(); - if (failed_test_count == 0) { - return; - } + ColoredPrintf(GTestColor::kRed, "[ FAILED ] "); + printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str()); for (int i = 0; i < unit_test.total_test_suite_count(); ++i) { const TestSuite& test_suite = *unit_test.GetTestSuite(i); @@ -3302,12 +3542,36 @@ void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) { if (!test_info.should_run() || !test_info.result()->Failed()) { continue; } - ColoredPrintf(COLOR_RED, "[ FAILED ] "); + ColoredPrintf(GTestColor::kRed, "[ FAILED ] "); printf("%s.%s", test_suite.name(), test_info.name()); PrintFullTestCommentIfPresent(test_info); printf("\n"); } } + printf("\n%2d FAILED %s\n", failed_test_count, + failed_test_count == 1 ? "TEST" : "TESTS"); +} + +// Internal helper for printing the list of test suite failures not covered by +// PrintFailedTests. +void PrettyUnitTestResultPrinter::PrintFailedTestSuites( + const UnitTest& unit_test) { + int suite_failure_count = 0; + for (int i = 0; i < unit_test.total_test_suite_count(); ++i) { + const TestSuite& test_suite = *unit_test.GetTestSuite(i); + if (!test_suite.should_run()) { + continue; + } + if (test_suite.ad_hoc_test_result().Failed()) { + ColoredPrintf(GTestColor::kRed, "[ FAILED ] "); + printf("%s: SetUpTestSuite or TearDownTestSuite\n", test_suite.name()); + ++suite_failure_count; + } + } + if (suite_failure_count > 0) { + printf("\n%2d FAILED TEST %s\n", suite_failure_count, + suite_failure_count == 1 ? "SUITE" : "SUITES"); + } } // Internal helper for printing the list of skipped tests. @@ -3327,7 +3591,7 @@ void PrettyUnitTestResultPrinter::PrintSkippedTests(const UnitTest& unit_test) { if (!test_info.should_run() || !test_info.result()->Skipped()) { continue; } - ColoredPrintf(COLOR_GREEN, "[ SKIPPED ] "); + ColoredPrintf(GTestColor::kGreen, "[ SKIPPED ] "); printf("%s.%s", test_suite.name(), test_info.name()); printf("\n"); } @@ -3336,7 +3600,7 @@ void PrettyUnitTestResultPrinter::PrintSkippedTests(const UnitTest& unit_test) { void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, int /*iteration*/) { - ColoredPrintf(COLOR_GREEN, "[==========] "); + ColoredPrintf(GTestColor::kGreen, "[==========] "); printf("%s from %s ran.", FormatTestCount(unit_test.test_to_run_count()).c_str(), FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str()); @@ -3345,35 +3609,28 @@ void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, internal::StreamableToString(unit_test.elapsed_time()).c_str()); } printf("\n"); - ColoredPrintf(COLOR_GREEN, "[ PASSED ] "); + ColoredPrintf(GTestColor::kGreen, "[ PASSED ] "); printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str()); const int skipped_test_count = unit_test.skipped_test_count(); if (skipped_test_count > 0) { - ColoredPrintf(COLOR_GREEN, "[ SKIPPED ] "); + ColoredPrintf(GTestColor::kGreen, "[ SKIPPED ] "); printf("%s, listed below:\n", FormatTestCount(skipped_test_count).c_str()); PrintSkippedTests(unit_test); } - int num_failures = unit_test.failed_test_count(); if (!unit_test.Passed()) { - const int failed_test_count = unit_test.failed_test_count(); - ColoredPrintf(COLOR_RED, "[ FAILED ] "); - printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str()); PrintFailedTests(unit_test); - printf("\n%2d FAILED %s\n", num_failures, - num_failures == 1 ? "TEST" : "TESTS"); + PrintFailedTestSuites(unit_test); } int num_disabled = unit_test.reportable_disabled_test_count(); if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) { - if (!num_failures) { + if (unit_test.Passed()) { printf("\n"); // Add a spacer if no FAILURE banner is displayed. } - ColoredPrintf(COLOR_YELLOW, - " YOU HAVE %d DISABLED %s\n\n", - num_disabled, - num_disabled == 1 ? "TEST" : "TESTS"); + ColoredPrintf(GTestColor::kYellow, " YOU HAVE %d DISABLED %s\n\n", + num_disabled, num_disabled == 1 ? "TEST" : "TESTS"); } // Ensure that Google Test output is printed before, e.g., heapchecker output. fflush(stdout); @@ -3381,6 +3638,110 @@ void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, // End PrettyUnitTestResultPrinter +// This class implements the TestEventListener interface. +// +// Class BriefUnitTestResultPrinter is copyable. +class BriefUnitTestResultPrinter : public TestEventListener { + public: + BriefUnitTestResultPrinter() {} + static void PrintTestName(const char* test_suite, const char* test) { + printf("%s.%s", test_suite, test); + } + + // The following methods override what's in the TestEventListener class. + void OnTestProgramStart(const UnitTest& /*unit_test*/) override {} + void OnTestIterationStart(const UnitTest& /*unit_test*/, + int /*iteration*/) override {} + void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {} + void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {} +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + void OnTestCaseStart(const TestCase& /*test_case*/) override {} +#else + void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {} +#endif // OnTestCaseStart + + void OnTestStart(const TestInfo& /*test_info*/) override {} + + void OnTestPartResult(const TestPartResult& result) override; + void OnTestEnd(const TestInfo& test_info) override; +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + void OnTestCaseEnd(const TestCase& /*test_case*/) override {} +#else + void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {} +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + + void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {} + void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {} + void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override; + void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {} +}; + +// Called after an assertion failure. +void BriefUnitTestResultPrinter::OnTestPartResult( + const TestPartResult& result) { + switch (result.type()) { + // If the test part succeeded, we don't need to do anything. + case TestPartResult::kSuccess: + return; + default: + // Print failure message from the assertion + // (e.g. expected this and got that). + PrintTestPartResult(result); + fflush(stdout); + } +} + +void BriefUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) { + if (test_info.result()->Failed()) { + ColoredPrintf(GTestColor::kRed, "[ FAILED ] "); + PrintTestName(test_info.test_suite_name(), test_info.name()); + PrintFullTestCommentIfPresent(test_info); + + if (GTEST_FLAG(print_time)) { + printf(" (%s ms)\n", + internal::StreamableToString(test_info.result()->elapsed_time()) + .c_str()); + } else { + printf("\n"); + } + fflush(stdout); + } +} + +void BriefUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, + int /*iteration*/) { + ColoredPrintf(GTestColor::kGreen, "[==========] "); + printf("%s from %s ran.", + FormatTestCount(unit_test.test_to_run_count()).c_str(), + FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str()); + if (GTEST_FLAG(print_time)) { + printf(" (%s ms total)", + internal::StreamableToString(unit_test.elapsed_time()).c_str()); + } + printf("\n"); + ColoredPrintf(GTestColor::kGreen, "[ PASSED ] "); + printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str()); + + const int skipped_test_count = unit_test.skipped_test_count(); + if (skipped_test_count > 0) { + ColoredPrintf(GTestColor::kGreen, "[ SKIPPED ] "); + printf("%s.\n", FormatTestCount(skipped_test_count).c_str()); + } + + int num_disabled = unit_test.reportable_disabled_test_count(); + if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) { + if (unit_test.Passed()) { + printf("\n"); // Add a spacer if no FAILURE banner is displayed. + } + ColoredPrintf(GTestColor::kYellow, " YOU HAVE %d DISABLED %s\n\n", + num_disabled, num_disabled == 1 ? "TEST" : "TESTS"); + } + // Ensure that Google Test output is printed before, e.g., heapchecker output. + fflush(stdout); +} + +// End BriefUnitTestResultPrinter + // class TestEventRepeater // // This class forwards events to other event listeners. @@ -3564,6 +3925,16 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener { // Streams an XML CDATA section, escaping invalid CDATA sequences as needed. static void OutputXmlCDataSection(::std::ostream* stream, const char* data); + // Streams a test suite XML stanza containing the given test result. + // + // Requires: result.Failed() + static void OutputXmlTestSuiteForTestResult(::std::ostream* stream, + const TestResult& result); + + // Streams an XML representation of a TestResult object. + static void OutputXmlTestResult(::std::ostream* stream, + const TestResult& result); + // Streams an XML representation of a TestInfo object. static void OutputXmlTestInfo(::std::ostream* stream, const char* test_suite_name, @@ -3722,6 +4093,10 @@ static bool PortableLocaltime(time_t seconds, struct tm* out) { if (tm_ptr == nullptr) return false; *out = *tm_ptr; return true; +#elif defined(__STDC_LIB_EXT1__) + // Uses localtime_s when available as localtime_r is only available from + // C23 standard. + return localtime_s(&seconds, out) != nullptr; #else return localtime_r(&seconds, out) != nullptr; #endif @@ -3733,13 +4108,14 @@ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) { struct tm time_struct; if (!PortableLocaltime(static_cast<time_t>(ms / 1000), &time_struct)) return ""; - // YYYY-MM-DDThh:mm:ss + // YYYY-MM-DDThh:mm:ss.sss return StreamableToString(time_struct.tm_year + 1900) + "-" + String::FormatIntWidth2(time_struct.tm_mon + 1) + "-" + String::FormatIntWidth2(time_struct.tm_mday) + "T" + String::FormatIntWidth2(time_struct.tm_hour) + ":" + String::FormatIntWidth2(time_struct.tm_min) + ":" + - String::FormatIntWidth2(time_struct.tm_sec); + String::FormatIntWidth2(time_struct.tm_sec) + "." + + String::FormatIntWidthN(static_cast<int>(ms % 1000), 3); } // Streams an XML CDATA section, escaping invalid CDATA sequences as needed. @@ -3778,6 +4154,43 @@ void XmlUnitTestResultPrinter::OutputXmlAttribute( *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\""; } +// Streams a test suite XML stanza containing the given test result. +void XmlUnitTestResultPrinter::OutputXmlTestSuiteForTestResult( + ::std::ostream* stream, const TestResult& result) { + // Output the boilerplate for a minimal test suite with one test. + *stream << " <testsuite"; + OutputXmlAttribute(stream, "testsuite", "name", "NonTestSuiteFailure"); + OutputXmlAttribute(stream, "testsuite", "tests", "1"); + OutputXmlAttribute(stream, "testsuite", "failures", "1"); + OutputXmlAttribute(stream, "testsuite", "disabled", "0"); + OutputXmlAttribute(stream, "testsuite", "skipped", "0"); + OutputXmlAttribute(stream, "testsuite", "errors", "0"); + OutputXmlAttribute(stream, "testsuite", "time", + FormatTimeInMillisAsSeconds(result.elapsed_time())); + OutputXmlAttribute( + stream, "testsuite", "timestamp", + FormatEpochTimeInMillisAsIso8601(result.start_timestamp())); + *stream << ">"; + + // Output the boilerplate for a minimal test case with a single test. + *stream << " <testcase"; + OutputXmlAttribute(stream, "testcase", "name", ""); + OutputXmlAttribute(stream, "testcase", "status", "run"); + OutputXmlAttribute(stream, "testcase", "result", "completed"); + OutputXmlAttribute(stream, "testcase", "classname", ""); + OutputXmlAttribute(stream, "testcase", "time", + FormatTimeInMillisAsSeconds(result.elapsed_time())); + OutputXmlAttribute( + stream, "testcase", "timestamp", + FormatEpochTimeInMillisAsIso8601(result.start_timestamp())); + + // Output the actual test result. + OutputXmlTestResult(stream, result); + + // Complete the test suite. + *stream << " </testsuite>\n"; +} + // Prints an XML representation of a TestInfo object. void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream, const char* test_suite_name, @@ -3821,11 +4234,17 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream, FormatEpochTimeInMillisAsIso8601(result.start_timestamp())); OutputXmlAttribute(stream, kTestsuite, "classname", test_suite_name); + OutputXmlTestResult(stream, result); +} + +void XmlUnitTestResultPrinter::OutputXmlTestResult(::std::ostream* stream, + const TestResult& result) { int failures = 0; + int skips = 0; for (int i = 0; i < result.total_part_count(); ++i) { const TestPartResult& part = result.GetTestPartResult(i); if (part.failed()) { - if (++failures == 1) { + if (++failures == 1 && skips == 0) { *stream << ">\n"; } const std::string location = @@ -3833,18 +4252,31 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream, part.line_number()); const std::string summary = location + "\n" + part.summary(); *stream << " <failure message=\"" - << EscapeXmlAttribute(summary.c_str()) + << EscapeXmlAttribute(summary) << "\" type=\"\">"; const std::string detail = location + "\n" + part.message(); OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str()); *stream << "</failure>\n"; + } else if (part.skipped()) { + if (++skips == 1 && failures == 0) { + *stream << ">\n"; + } + const std::string location = + internal::FormatCompilerIndependentFileLocation(part.file_name(), + part.line_number()); + const std::string summary = location + "\n" + part.summary(); + *stream << " <skipped message=\"" + << EscapeXmlAttribute(summary.c_str()) << "\">"; + const std::string detail = location + "\n" + part.message(); + OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str()); + *stream << "</skipped>\n"; } } - if (failures == 0 && result.test_property_count() == 0) { + if (failures == 0 && skips == 0 && result.test_property_count() == 0) { *stream << " />\n"; } else { - if (failures == 0) { + if (failures == 0 && skips == 0) { *stream << ">\n"; } OutputXmlTestProperties(stream, result); @@ -3866,7 +4298,11 @@ void XmlUnitTestResultPrinter::PrintXmlTestSuite(std::ostream* stream, OutputXmlAttribute( stream, kTestsuite, "disabled", StreamableToString(test_suite.reportable_disabled_test_count())); + OutputXmlAttribute(stream, kTestsuite, "skipped", + StreamableToString(test_suite.skipped_test_count())); + OutputXmlAttribute(stream, kTestsuite, "errors", "0"); + OutputXmlAttribute(stream, kTestsuite, "time", FormatTimeInMillisAsSeconds(test_suite.elapsed_time())); OutputXmlAttribute( @@ -3917,6 +4353,13 @@ void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream, if (unit_test.GetTestSuite(i)->reportable_test_count() > 0) PrintXmlTestSuite(stream, *unit_test.GetTestSuite(i)); } + + // If there was a test failure outside of one of the test suites (like in a + // test environment) include that in the output. + if (unit_test.ad_hoc_test_result().Failed()) { + OutputXmlTestSuiteForTestResult(stream, unit_test.ad_hoc_test_result()); + } + *stream << "</" << kTestsuites << ">\n"; } @@ -4007,6 +4450,16 @@ class JsonUnitTestResultPrinter : public EmptyTestEventListener { const std::string& indent, bool comma = true); + // Streams a test suite JSON stanza containing the given test result. + // + // Requires: result.Failed() + static void OutputJsonTestSuiteForTestResult(::std::ostream* stream, + const TestResult& result); + + // Streams a JSON representation of a TestResult object. + static void OutputJsonTestResult(::std::ostream* stream, + const TestResult& result); + // Streams a JSON representation of a TestInfo object. static void OutputJsonTestInfo(::std::ostream* stream, const char* test_suite_name, @@ -4157,6 +4610,48 @@ void JsonUnitTestResultPrinter::OutputJsonKey( *stream << ",\n"; } +// Streams a test suite JSON stanza containing the given test result. +void JsonUnitTestResultPrinter::OutputJsonTestSuiteForTestResult( + ::std::ostream* stream, const TestResult& result) { + // Output the boilerplate for a new test suite. + *stream << Indent(4) << "{\n"; + OutputJsonKey(stream, "testsuite", "name", "NonTestSuiteFailure", Indent(6)); + OutputJsonKey(stream, "testsuite", "tests", 1, Indent(6)); + if (!GTEST_FLAG(list_tests)) { + OutputJsonKey(stream, "testsuite", "failures", 1, Indent(6)); + OutputJsonKey(stream, "testsuite", "disabled", 0, Indent(6)); + OutputJsonKey(stream, "testsuite", "skipped", 0, Indent(6)); + OutputJsonKey(stream, "testsuite", "errors", 0, Indent(6)); + OutputJsonKey(stream, "testsuite", "time", + FormatTimeInMillisAsDuration(result.elapsed_time()), + Indent(6)); + OutputJsonKey(stream, "testsuite", "timestamp", + FormatEpochTimeInMillisAsRFC3339(result.start_timestamp()), + Indent(6)); + } + *stream << Indent(6) << "\"testsuite\": [\n"; + + // Output the boilerplate for a new test case. + *stream << Indent(8) << "{\n"; + OutputJsonKey(stream, "testcase", "name", "", Indent(10)); + OutputJsonKey(stream, "testcase", "status", "RUN", Indent(10)); + OutputJsonKey(stream, "testcase", "result", "COMPLETED", Indent(10)); + OutputJsonKey(stream, "testcase", "timestamp", + FormatEpochTimeInMillisAsRFC3339(result.start_timestamp()), + Indent(10)); + OutputJsonKey(stream, "testcase", "time", + FormatTimeInMillisAsDuration(result.elapsed_time()), + Indent(10)); + OutputJsonKey(stream, "testcase", "classname", "", Indent(10), false); + *stream << TestPropertiesAsJson(result, Indent(10)); + + // Output the actual test result. + OutputJsonTestResult(stream, result); + + // Finish the test suite. + *stream << "\n" << Indent(6) << "]\n" << Indent(4) << "}"; +} + // Prints a JSON representation of a TestInfo object. void JsonUnitTestResultPrinter::OutputJsonTestInfo(::std::ostream* stream, const char* test_suite_name, @@ -4199,6 +4694,13 @@ void JsonUnitTestResultPrinter::OutputJsonTestInfo(::std::ostream* stream, false); *stream << TestPropertiesAsJson(result, kIndent); + OutputJsonTestResult(stream, result); +} + +void JsonUnitTestResultPrinter::OutputJsonTestResult(::std::ostream* stream, + const TestResult& result) { + const std::string kIndent = Indent(10); + int failures = 0; for (int i = 0; i < result.total_part_count(); ++i) { const TestPartResult& part = result.GetTestPartResult(i); @@ -4309,6 +4811,12 @@ void JsonUnitTestResultPrinter::PrintJsonUnitTest(std::ostream* stream, } } + // If there was a test failure outside of one of the test suites (like in a + // test environment) include that in the output. + if (unit_test.ad_hoc_test_result().Failed()) { + OutputJsonTestSuiteForTestResult(stream, unit_test.ad_hoc_test_result()); + } + *stream << "\n" << kIndent << "]\n" << "}\n"; } @@ -4508,6 +5016,7 @@ class ScopedPrematureExitFile { } ~ScopedPrematureExitFile() { +#if !defined GTEST_OS_ESP8266 if (!premature_exit_filepath_.empty()) { int retval = remove(premature_exit_filepath_.c_str()); if (retval) { @@ -4516,6 +5025,7 @@ class ScopedPrematureExitFile { << retval; } } +#endif } private: @@ -4908,7 +5418,6 @@ int UnitTest::Run() { _set_abort_behavior( 0x0, // Clear the following flags: _WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump. -# endif // In debug mode, the Windows CRT can crash with an assertion over invalid // input (e.g. passing an invalid file descriptor). The default handling @@ -4919,6 +5428,7 @@ int UnitTest::Run() { _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); (void)_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); } +# endif } #endif // GTEST_OS_WINDOWS @@ -5129,6 +5639,10 @@ void UnitTestImpl::PostFlagParsingInit() { // to shut down the default XML output before invoking RUN_ALL_TESTS. ConfigureXmlOutput(); + if (GTEST_FLAG(brief)) { + listeners()->SetDefaultResultPrinter(new BriefUnitTestResultPrinter); + } + #if GTEST_CAN_STREAM_RESULTS_ // Configures listeners for streaming test results to the specified server. ConfigureStreamingOutput(); @@ -5174,10 +5688,10 @@ class TestSuiteNameIs { // Arguments: // // test_suite_name: name of the test suite -// type_param: the name of the test suite's type parameter, or NULL if -// this is not a typed or a type-parameterized test suite. -// set_up_tc: pointer to the function that sets up the test suite -// tear_down_tc: pointer to the function that tears down the test suite +// type_param: the name of the test suite's type parameter, or NULL if +// this is not a typed or a type-parameterized test suite. +// set_up_tc: pointer to the function that sets up the test suite +// tear_down_tc: pointer to the function that tears down the test suite TestSuite* UnitTestImpl::GetTestSuite( const char* test_suite_name, const char* type_param, internal::SetUpTestSuiteFunc set_up_tc, @@ -5295,11 +5809,11 @@ bool UnitTestImpl::RunAllTests() { // assertions executed before RUN_ALL_TESTS(). ClearNonAdHocTestResult(); - const TimeInMillis start = GetTimeInMillis(); + Timer timer; // Shuffles test suites and tests if requested. if (has_tests_to_run && GTEST_FLAG(shuffle)) { - random()->Reseed(static_cast<UInt32>(random_seed_)); + random()->Reseed(static_cast<uint32_t>(random_seed_)); // This should be done before calling OnTestIterationStart(), // such that a test event listener can see the actual test order // in the event. @@ -5336,6 +5850,21 @@ bool UnitTestImpl::RunAllTests() { for (int test_index = 0; test_index < total_test_suite_count(); test_index++) { GetMutableSuiteCase(test_index)->Run(); + if (GTEST_FLAG(fail_fast) && + GetMutableSuiteCase(test_index)->Failed()) { + for (int j = test_index + 1; j < total_test_suite_count(); j++) { + GetMutableSuiteCase(j)->Skip(); + } + break; + } + } + } else if (Test::HasFatalFailure()) { + // If there was a fatal failure during the global setup then we know we + // aren't going to run any tests. Explicitly mark all of the tests as + // skipped to make this obvious in the output. + for (int test_index = 0; test_index < total_test_suite_count(); + test_index++) { + GetMutableSuiteCase(test_index)->Skip(); } } @@ -5346,7 +5875,7 @@ bool UnitTestImpl::RunAllTests() { repeater->OnEnvironmentsTearDownEnd(*parent_); } - elapsed_time_ = GetTimeInMillis() - start; + elapsed_time_ = timer.Elapsed(); // Tells the unit test event listener that the tests have just finished. repeater->OnTestIterationEnd(*parent_, i); @@ -5374,14 +5903,14 @@ bool UnitTestImpl::RunAllTests() { if (!gtest_is_initialized_before_run_all_tests) { ColoredPrintf( - COLOR_RED, + GTestColor::kRed, "\nIMPORTANT NOTICE - DO NOT IGNORE:\n" "This test program did NOT call " GTEST_INIT_GOOGLE_TEST_NAME_ "() before calling RUN_ALL_TESTS(). This is INVALID. Soon " GTEST_NAME_ " will start to enforce the valid usage. " "Please fix it ASAP, or IT WILL START TO FAIL.\n"); // NOLINT #if GTEST_FOR_GOOGLE_ - ColoredPrintf(COLOR_RED, + ColoredPrintf(GTestColor::kRed, "For more details, see http://wiki/Main/ValidGUnitMain.\n"); #endif // GTEST_FOR_GOOGLE_ } @@ -5398,7 +5927,7 @@ void WriteToShardStatusFileIfNeeded() { if (test_shard_file != nullptr) { FILE* const file = posix::FOpen(test_shard_file, "w"); if (file == nullptr) { - ColoredPrintf(COLOR_RED, + ColoredPrintf(GTestColor::kRed, "Could not write to the test shard status file \"%s\" " "specified by the %s environment variable.\n", test_shard_file, kTestShardStatusFile); @@ -5422,8 +5951,8 @@ bool ShouldShard(const char* total_shards_env, return false; } - const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1); - const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1); + const int32_t total_shards = Int32FromEnvOrDie(total_shards_env, -1); + const int32_t shard_index = Int32FromEnvOrDie(shard_index_env, -1); if (total_shards == -1 && shard_index == -1) { return false; @@ -5432,7 +5961,7 @@ bool ShouldShard(const char* total_shards_env, << "Invalid environment variables: you have " << kTestShardIndex << " = " << shard_index << ", but have left " << kTestTotalShards << " unset.\n"; - ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str()); + ColoredPrintf(GTestColor::kRed, "%s", msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } else if (total_shards != -1 && shard_index == -1) { @@ -5440,7 +5969,7 @@ bool ShouldShard(const char* total_shards_env, << "Invalid environment variables: you have " << kTestTotalShards << " = " << total_shards << ", but have left " << kTestShardIndex << " unset.\n"; - ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str()); + ColoredPrintf(GTestColor::kRed, "%s", msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } else if (shard_index < 0 || shard_index >= total_shards) { @@ -5449,7 +5978,7 @@ bool ShouldShard(const char* total_shards_env, << kTestShardIndex << " < " << kTestTotalShards << ", but you have " << kTestShardIndex << "=" << shard_index << ", " << kTestTotalShards << "=" << total_shards << ".\n"; - ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str()); + ColoredPrintf(GTestColor::kRed, "%s", msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } @@ -5460,13 +5989,13 @@ bool ShouldShard(const char* total_shards_env, // Parses the environment variable var as an Int32. If it is unset, // returns default_val. If it is not an Int32, prints an error // and aborts. -Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) { +int32_t Int32FromEnvOrDie(const char* var, int32_t default_val) { const char* str_val = posix::GetEnv(var); if (str_val == nullptr) { return default_val; } - Int32 result; + int32_t result; if (!ParseInt32(Message() << "The value of environment variable " << var, str_val, &result)) { exit(EXIT_FAILURE); @@ -5490,9 +6019,9 @@ bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) { // https://github.com/google/googletest/blob/master/googletest/docs/advanced.md // . Returns the number of tests that should run. int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) { - const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ? + const int32_t total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ? Int32FromEnvOrDie(kTestTotalShards, -1) : -1; - const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ? + const int32_t shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ? Int32FromEnvOrDie(kTestShardIndex, -1) : -1; // num_runnable_tests are the number of tests that will @@ -5781,12 +6310,11 @@ static bool ParseBoolFlag(const char* str, const char* flag, bool* value) { return true; } -// Parses a string for an Int32 flag, in the form of -// "--flag=value". +// Parses a string for an int32_t flag, in the form of "--flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. -bool ParseInt32Flag(const char* str, const char* flag, Int32* value) { +bool ParseInt32Flag(const char* str, const char* flag, int32_t* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, false); @@ -5798,8 +6326,7 @@ bool ParseInt32Flag(const char* str, const char* flag, Int32* value) { value_str, value); } -// Parses a string for a string flag, in the form of -// "--flag=value". +// Parses a string for a string flag, in the form of "--flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. @@ -5841,7 +6368,7 @@ static bool HasGoogleTestFlagPrefix(const char* str) { // @D changes to the default terminal text color. // static void PrintColorEncoded(const char* str) { - GTestColor color = COLOR_DEFAULT; // The current color. + GTestColor color = GTestColor::kDefault; // The current color. // Conceptually, we split the string into segments divided by escape // sequences. Then we print one segment at a time. At the end of @@ -5861,13 +6388,13 @@ static void PrintColorEncoded(const char* str) { if (ch == '@') { ColoredPrintf(color, "@"); } else if (ch == 'D') { - color = COLOR_DEFAULT; + color = GTestColor::kDefault; } else if (ch == 'R') { - color = COLOR_RED; + color = GTestColor::kRed; } else if (ch == 'G') { - color = COLOR_GREEN; + color = GTestColor::kGreen; } else if (ch == 'Y') { - color = COLOR_YELLOW; + color = GTestColor::kYellow; } else { --str; } @@ -5875,98 +6402,126 @@ static void PrintColorEncoded(const char* str) { } static const char kColorEncodedHelpMessage[] = -"This program contains tests written using " GTEST_NAME_ ". You can use the\n" -"following command line flags to control its behavior:\n" -"\n" -"Test Selection:\n" -" @G--" GTEST_FLAG_PREFIX_ "list_tests@D\n" -" List the names of all tests instead of running them. The name of\n" -" TEST(Foo, Bar) is \"Foo.Bar\".\n" -" @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS" + "This program contains tests written using " GTEST_NAME_ + ". You can use the\n" + "following command line flags to control its behavior:\n" + "\n" + "Test Selection:\n" + " @G--" GTEST_FLAG_PREFIX_ + "list_tests@D\n" + " List the names of all tests instead of running them. The name of\n" + " TEST(Foo, Bar) is \"Foo.Bar\".\n" + " @G--" GTEST_FLAG_PREFIX_ + "filter=@YPOSITIVE_PATTERNS" "[@G-@YNEGATIVE_PATTERNS]@D\n" -" Run only the tests whose name matches one of the positive patterns but\n" -" none of the negative patterns. '?' matches any single character; '*'\n" -" matches any substring; ':' separates two patterns.\n" -" @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n" -" Run all disabled tests too.\n" -"\n" -"Test Execution:\n" -" @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n" -" Run the tests repeatedly; use a negative count to repeat forever.\n" -" @G--" GTEST_FLAG_PREFIX_ "shuffle@D\n" -" Randomize tests' orders on every iteration.\n" -" @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n" -" Random number seed to use for shuffling test orders (between 1 and\n" -" 99999, or 0 to use a seed based on the current time).\n" -"\n" -"Test Output:\n" -" @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n" -" Enable/disable colored output. The default is @Gauto@D.\n" -" -@G-" GTEST_FLAG_PREFIX_ "print_time=0@D\n" -" Don't print the elapsed time of each test.\n" -" @G--" GTEST_FLAG_PREFIX_ "output=@Y(@Gjson@Y|@Gxml@Y)[@G:@YDIRECTORY_PATH@G" - GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n" -" Generate a JSON or XML report in the given directory or with the given\n" -" file name. @YFILE_PATH@D defaults to @Gtest_detail.xml@D.\n" + " Run only the tests whose name matches one of the positive patterns " + "but\n" + " none of the negative patterns. '?' matches any single character; " + "'*'\n" + " matches any substring; ':' separates two patterns.\n" + " @G--" GTEST_FLAG_PREFIX_ + "also_run_disabled_tests@D\n" + " Run all disabled tests too.\n" + "\n" + "Test Execution:\n" + " @G--" GTEST_FLAG_PREFIX_ + "repeat=@Y[COUNT]@D\n" + " Run the tests repeatedly; use a negative count to repeat forever.\n" + " @G--" GTEST_FLAG_PREFIX_ + "shuffle@D\n" + " Randomize tests' orders on every iteration.\n" + " @G--" GTEST_FLAG_PREFIX_ + "random_seed=@Y[NUMBER]@D\n" + " Random number seed to use for shuffling test orders (between 1 and\n" + " 99999, or 0 to use a seed based on the current time).\n" + "\n" + "Test Output:\n" + " @G--" GTEST_FLAG_PREFIX_ + "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n" + " Enable/disable colored output. The default is @Gauto@D.\n" + " @G--" GTEST_FLAG_PREFIX_ + "brief=1@D\n" + " Only print test failures.\n" + " @G--" GTEST_FLAG_PREFIX_ + "print_time=0@D\n" + " Don't print the elapsed time of each test.\n" + " @G--" GTEST_FLAG_PREFIX_ + "output=@Y(@Gjson@Y|@Gxml@Y)[@G:@YDIRECTORY_PATH@G" GTEST_PATH_SEP_ + "@Y|@G:@YFILE_PATH]@D\n" + " Generate a JSON or XML report in the given directory or with the " + "given\n" + " file name. @YFILE_PATH@D defaults to @Gtest_detail.xml@D.\n" # if GTEST_CAN_STREAM_RESULTS_ -" @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST@G:@YPORT@D\n" -" Stream test results to the given server.\n" + " @G--" GTEST_FLAG_PREFIX_ + "stream_result_to=@YHOST@G:@YPORT@D\n" + " Stream test results to the given server.\n" # endif // GTEST_CAN_STREAM_RESULTS_ -"\n" -"Assertion Behavior:\n" + "\n" + "Assertion Behavior:\n" # if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS -" @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n" -" Set the default death test style.\n" + " @G--" GTEST_FLAG_PREFIX_ + "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n" + " Set the default death test style.\n" # endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS -" @G--" GTEST_FLAG_PREFIX_ "break_on_failure@D\n" -" Turn assertion failures into debugger break-points.\n" -" @G--" GTEST_FLAG_PREFIX_ "throw_on_failure@D\n" -" Turn assertion failures into C++ exceptions for use by an external\n" -" test framework.\n" -" @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0@D\n" -" Do not report exceptions as test failures. Instead, allow them\n" -" to crash the program or throw a pop-up (on Windows).\n" -"\n" -"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests@D, you can alternatively set " + " @G--" GTEST_FLAG_PREFIX_ + "break_on_failure@D\n" + " Turn assertion failures into debugger break-points.\n" + " @G--" GTEST_FLAG_PREFIX_ + "throw_on_failure@D\n" + " Turn assertion failures into C++ exceptions for use by an external\n" + " test framework.\n" + " @G--" GTEST_FLAG_PREFIX_ + "catch_exceptions=0@D\n" + " Do not report exceptions as test failures. Instead, allow them\n" + " to crash the program or throw a pop-up (on Windows).\n" + "\n" + "Except for @G--" GTEST_FLAG_PREFIX_ + "list_tests@D, you can alternatively set " "the corresponding\n" -"environment variable of a flag (all letters in upper-case). For example, to\n" -"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_ + "environment variable of a flag (all letters in upper-case). For example, " + "to\n" + "disable colored text output, you can either specify " + "@G--" GTEST_FLAG_PREFIX_ "color=no@D or set\n" -"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR@D environment variable to @Gno@D.\n" -"\n" -"For more information, please read the " GTEST_NAME_ " documentation at\n" -"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n" -"(not one in your own code or tests), please report it to\n" -"@G<" GTEST_DEV_EMAIL_ ">@D.\n"; + "the @G" GTEST_FLAG_PREFIX_UPPER_ + "COLOR@D environment variable to @Gno@D.\n" + "\n" + "For more information, please read the " GTEST_NAME_ + " documentation at\n" + "@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ + "\n" + "(not one in your own code or tests), please report it to\n" + "@G<" GTEST_DEV_EMAIL_ ">@D.\n"; static bool ParseGoogleTestFlag(const char* const arg) { return ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag, >EST_FLAG(also_run_disabled_tests)) || - ParseBoolFlag(arg, kBreakOnFailureFlag, - >EST_FLAG(break_on_failure)) || - ParseBoolFlag(arg, kCatchExceptionsFlag, - >EST_FLAG(catch_exceptions)) || - ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) || - ParseStringFlag(arg, kDeathTestStyleFlag, - >EST_FLAG(death_test_style)) || - ParseBoolFlag(arg, kDeathTestUseFork, - >EST_FLAG(death_test_use_fork)) || - ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) || - ParseStringFlag(arg, kInternalRunDeathTestFlag, - >EST_FLAG(internal_run_death_test)) || - ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) || - ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) || - ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) || - ParseBoolFlag(arg, kPrintUTF8Flag, >EST_FLAG(print_utf8)) || - ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) || - ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) || - ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) || - ParseInt32Flag(arg, kStackTraceDepthFlag, - >EST_FLAG(stack_trace_depth)) || - ParseStringFlag(arg, kStreamResultToFlag, - >EST_FLAG(stream_result_to)) || - ParseBoolFlag(arg, kThrowOnFailureFlag, - >EST_FLAG(throw_on_failure)); + ParseBoolFlag(arg, kBreakOnFailureFlag, + >EST_FLAG(break_on_failure)) || + ParseBoolFlag(arg, kCatchExceptionsFlag, + >EST_FLAG(catch_exceptions)) || + ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) || + ParseStringFlag(arg, kDeathTestStyleFlag, + >EST_FLAG(death_test_style)) || + ParseBoolFlag(arg, kDeathTestUseFork, + >EST_FLAG(death_test_use_fork)) || + ParseBoolFlag(arg, kFailFast, >EST_FLAG(fail_fast)) || + ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) || + ParseStringFlag(arg, kInternalRunDeathTestFlag, + >EST_FLAG(internal_run_death_test)) || + ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) || + ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) || + ParseBoolFlag(arg, kBriefFlag, >EST_FLAG(brief)) || + ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) || + ParseBoolFlag(arg, kPrintUTF8Flag, >EST_FLAG(print_utf8)) || + ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) || + ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) || + ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) || + ParseInt32Flag(arg, kStackTraceDepthFlag, + >EST_FLAG(stack_trace_depth)) || + ParseStringFlag(arg, kStreamResultToFlag, + >EST_FLAG(stream_result_to)) || + ParseBoolFlag(arg, kThrowOnFailureFlag, >EST_FLAG(throw_on_failure)); } #if GTEST_USE_OWN_FLAGFILE_FLAG_ @@ -6136,20 +6691,31 @@ void InitGoogleTest() { std::string TempDir() { #if defined(GTEST_CUSTOM_TEMPDIR_FUNCTION_) return GTEST_CUSTOM_TEMPDIR_FUNCTION_(); -#endif - -#if GTEST_OS_WINDOWS_MOBILE +#elif GTEST_OS_WINDOWS_MOBILE return "\\temp\\"; #elif GTEST_OS_WINDOWS const char* temp_dir = internal::posix::GetEnv("TEMP"); - if (temp_dir == nullptr || temp_dir[0] == '\0') + if (temp_dir == nullptr || temp_dir[0] == '\0') { return "\\temp\\"; - else if (temp_dir[strlen(temp_dir) - 1] == '\\') + } else if (temp_dir[strlen(temp_dir) - 1] == '\\') { return temp_dir; - else + } else { return std::string(temp_dir) + "\\"; + } #elif GTEST_OS_LINUX_ANDROID - return "/sdcard/"; + const char* temp_dir = internal::posix::GetEnv("TEST_TMPDIR"); + if (temp_dir == nullptr || temp_dir[0] == '\0') { + return "/data/local/tmp/"; + } else { + return temp_dir; + } +#elif GTEST_OS_LINUX + const char* temp_dir = internal::posix::GetEnv("TEST_TMPDIR"); + if (temp_dir == nullptr || temp_dir[0] == '\0') { + return "/tmp/"; + } else { + return temp_dir; + } #else return "/tmp/"; #endif // GTEST_OS_WINDOWS_MOBILE diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest_main.cc b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest_main.cc index f6e1dd96fb3..46b27c3d7d5 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest_main.cc +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest_main.cc @@ -30,13 +30,20 @@ #include <cstdio> #include "gtest/gtest.h" -#ifdef ARDUINO +#if GTEST_OS_ESP8266 || GTEST_OS_ESP32 +#if GTEST_OS_ESP8266 +extern "C" { +#endif void setup() { testing::InitGoogleTest(); } void loop() { RUN_ALL_TESTS(); } +#if GTEST_OS_ESP8266 +} +#endif + #else GTEST_API_ int main(int argc, char **argv) { diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/normalize.xsl b/Build/source/texk/dvisvgm/dvisvgm-src/tests/normalize.xsl index d2315118359..ca9d2c639d3 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/normalize.xsl +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/normalize.xsl @@ -2,7 +2,7 @@ <!-- ********************************************************************* ** Stylesheet to rearrange font-/path-elements in an SVG file. ** ** It's part of the dvisvgm package. ** -** Copyright (C) 2009-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2009-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/testmain.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/testmain.cpp index 323b6c39159..9003c19eaa0 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/testmain.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/testmain.cpp @@ -2,7 +2,7 @@ ** testmain.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/testutil.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/testutil.hpp index b28542587ce..c0deef1ad79 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/testutil.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/testutil.hpp @@ -1,7 +1,7 @@ #pragma once #define WARNING(...) \ - ColoredPrintf(testing::internal::COLOR_YELLOW, "[ WARNING ] "), \ - ColoredPrintf(testing::internal::COLOR_YELLOW, __VA_ARGS__), \ + ColoredPrintf(testing::internal::GTestColor::kYellow, "[ WARNING ] "), \ + ColoredPrintf(testing::internal::GTestColor::kYellow, __VA_ARGS__), \ printf("\n") diff --git a/Build/source/texk/dvisvgm/version.ac b/Build/source/texk/dvisvgm/version.ac index 4b3e400f99b..a5889c65ba6 100644 --- a/Build/source/texk/dvisvgm/version.ac +++ b/Build/source/texk/dvisvgm/version.ac @@ -1,5 +1,5 @@ dnl $Id$ -dnl Copyright 2015-2020 Karl Berry <tex-live@tug.org> +dnl Copyright 2015-2022 Karl Berry <tex-live@tug.org> dnl Copyright 2011-2015 Peter Breitenlohner <tex-live@tug.org> dnl dnl This file is free software; the copyright holder @@ -9,4 +9,4 @@ dnl dnl -------------------------------------------------------- dnl dnl m4-include this file to define the current dvisvgm version -m4_define([dvisvgm_version], [2.11.1]) +m4_define([dvisvgm_version], [2.13]) |