texlive[61679] Build/source/texk: dvisvgm 2.13

commits+karl at tug.org commits+karl at tug.org
Fri Jan 21 18:25:16 CET 2022


Revision: 61679
          http://tug.org/svn/texlive?view=revision&revision=61679
Author:   karl
Date:     2022-01-21 18:25:16 +0100 (Fri, 21 Jan 2022)
Log Message:
-----------
dvisvgm 2.13

Modified Paths:
--------------
    trunk/Build/source/texk/README
    trunk/Build/source/texk/dvisvgm/TLpatches/TL-Changes
    trunk/Build/source/texk/dvisvgm/TLpatches/patch-04-configure
    trunk/Build/source/texk/dvisvgm/TLpatches/patch-08-makefiles
    trunk/Build/source/texk/dvisvgm/configure
    trunk/Build/source/texk/dvisvgm/configure.ac
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.am
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.in
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/NEWS
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/README
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/configure.ac
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.am
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.in
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-man.xsl
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-pdf.xsl
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.1
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.txt.in
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-db-refentry.xsl
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-pdf.xsl
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-tex.py
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/Makefile.am
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/brotli/enc/encode.c
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/ff-woff/fontforge/tmpfile2.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxh3.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxhash.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/AGLTable.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CLOption.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Character.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CommandLine.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIActions.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSToSVG.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FixWord.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontStyle.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Glyph.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GlyphTracerMessages.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GraphicsPath.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MD5HashFunction.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.am
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.in
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MessageException.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/NumericRanges.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFToSVG.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSFilter.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Pair.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialActions.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/System.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/System.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VFActions.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorIterator.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorStream.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XXHashFunction.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ZLibOutputStream.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/dvisvgm.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.c
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/macros.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/DependencyGraph.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/OptimizerModule.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/options.dtd
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/options.xml
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/psdefs.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/version.hpp.in
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/windows.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/BezierTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/BitmapTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/BoundingBoxTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapManagerTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapReaderTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CalculatorTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorSpecialTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CommandLineTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DVIReaderTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DependencyGraphTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DirectoryTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DvisvgmSpecialTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/EllipticalArcTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/EmSpecialTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileFinderTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FilePathTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileSystemTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontCacheTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontManagerTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontMapTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFGlyphTracerTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFReaderTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GhostscriptTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GraphicsPathTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/HashFunctionTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/JFMReaderTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/LengthTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.am
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.in
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/MapLineTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/MatrixTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/MessageExceptionTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PDFParserTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PSInterpreterTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageRagesTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageSizeTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PairTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PapersizeSpecialTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/RangeMapTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SVGOutputTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ShadingPatchTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SpecialManagerTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SplittedCharInputBufferTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamInputBufferTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamReaderTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamWriterTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StringMatcherTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SubfontTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TFMReaderTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TensorProductPatchTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ToUnicodeMapTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TpicSpecialTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TriangularPatchTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/UnicodeTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/UtilityTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorIteratorTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorStreamTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLNodeTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLStringTest.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/check-conv
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.am
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.in
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/genhashcheck.py
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-death-test.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-matchers.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-message.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-param-test.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-printers.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-spi.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-test-part.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-typed-test.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_pred_impl.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_prod.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-port.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-printers.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-death-test-internal.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-filepath.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-internal.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-param-util.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port-arch.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-string.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-type-util.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-death-test.cc
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-filepath.cc
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-internal-inl.h
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-matchers.cc
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-port.cc
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-printers.cc
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-test-part.cc
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest-typed-test.cc
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest.cc
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/src/gtest_main.cc
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/normalize.xsl
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/testmain.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/testutil.hpp
    trunk/Build/source/texk/dvisvgm/version.ac

Added Paths:
-----------
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/ChangeLog
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/config.h.in
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.cpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.hpp
    trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/lmmono12-regular.otf

Modified: trunk/Build/source/texk/README
===================================================================
--- trunk/Build/source/texk/README	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/README	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 @@
 
 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

Modified: trunk/Build/source/texk/dvisvgm/TLpatches/TL-Changes
===================================================================
--- trunk/Build/source/texk/dvisvgm/TLpatches/TL-Changes	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/TLpatches/TL-Changes	2022-01-21 17:25:16 UTC (rev 61679)
@@ -5,6 +5,7 @@
 	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 @@
 
 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

Modified: trunk/Build/source/texk/dvisvgm/TLpatches/patch-04-configure
===================================================================
--- trunk/Build/source/texk/dvisvgm/TLpatches/patch-04-configure	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/TLpatches/patch-04-configure	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>
+-# Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>
 -#
 -# Process this file with autoconf to produce a configure script.
 -
 -AC_PREREQ(2.59)
--AC_INIT([dvisvgm],[2.11.1],[martin.gieseking at uos.de])
-+dnl $Id$
+-AC_INIT([dvisvgm],[2.13],[martin.gieseking at 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 at tug.org>
++dnl   Copyright 2015-2022 Karl Berry <tex-live at tug.org>
 +dnl   Copyright 2009-2014 Peter Breitenlohner <tex-live at 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 at 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,23 +284,16 @@
 -		[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])
 -AC_LANG_PUSH([C++])
@@ -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@:>@])],

Modified: trunk/Build/source/texk/dvisvgm/TLpatches/patch-08-makefiles
===================================================================
--- trunk/Build/source/texk/dvisvgm/TLpatches/patch-08-makefiles	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/TLpatches/patch-08-makefiles	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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
+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 @@
  
-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
- 
 -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 @@
 -	$(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 @@
 +
 +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 @@
 -	$(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 @@
 +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 @@
 +# 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,10 +129,11 @@
 + at FREETYPE2_RULE@
 +# Rebuild libz:
 + at 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
  
@@ -148,4 +140,4 @@
 -liboptimizer_la_SOURCES = \
 +liboptimizer_a_SOURCES = \
  	AttributeExtractor.hpp      AttributeExtractor.cpp \
- 	DependencyGraph.hpp \
+Only in dvisvgm-2.13: test-driver

Modified: trunk/Build/source/texk/dvisvgm/configure
===================================================================
--- trunk/Build/source/texk/dvisvgm/configure	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/configure	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at tug.org>.
 #
@@ -629,8 +629,8 @@
 # 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 at tug.org'
 PACKAGE_URL=''
 
@@ -1437,7 +1437,7 @@
   # 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 @@
 
 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 @@
 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 @@
 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_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 @@
 
 # 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 @@
 Report bugs to <bug-libtool at 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 @@
 # 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 @@
 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\\"
 

Modified: trunk/Build/source/texk/dvisvgm/configure.ac
===================================================================
--- trunk/Build/source/texk/dvisvgm/configure.ac	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/configure.ac	2022-01-21 17:25:16 UTC (rev 61679)
@@ -2,7 +2,7 @@
 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 at tug.org>
+dnl   Copyright 2015-2022 Karl Berry <tex-live at tug.org>
 dnl   Copyright 2009-2014 Peter Breitenlohner <tex-live at tug.org>
 dnl
 dnl   This file is free software; the copyright holder
@@ -10,12 +10,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 at 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

Added: trunk/Build/source/texk/dvisvgm/dvisvgm-src/ChangeLog
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/ChangeLog	                        (rev 0)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/ChangeLog	2022-01-21 17:25:16 UTC (rev 61679)
@@ -0,0 +1,10893 @@
+2022-01-19  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * NEWS: 
+  updated NEWS 
+
+2022-01-11  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * doc/Makefile.am: 
+  don't build manpage in parallel
+closes #171 
+
+2021-12-05  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * libs/brotli/enc/encode.c: 
+  fixed parameter type warning in Brotli library 
+
+2021-12-04  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * .appveyor.yml: 
+  updated Windows platform toolset to version 143 
+
+2021-12-03  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/InputReader.cpp: 
+  replaced deprecated std::ptr_fun 
+
+2021-11-30  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * .travis.yml: 
+  removed Travis configuration 
+
+2021-10-30  Naveen M K  <naveen521kk at gmail.com>
+
+  * src/FileSystem.cpp: 
+  mingw: fix for gcc 11 
+
+2021-09-26  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * tests/UtilityTest.cpp: 
+  prevent creating temporaries in test loop 
+
+2021-09-07  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/optimizer/GroupCollapser.cpp, src/optimizer/GroupCollapser.hpp: 
+  GroupCollapser: simplify transform attributes after combining them 
+
+2021-08-16  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/PsSpecialHandler.cpp: 
+  skip fill actions if colorspace with unsupported pattern type is active 
+
+2021-08-13  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp: 
+  ensure adding color attribute to tiling patterns
+(closes #158) 
+
+2021-07-19  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * .appveyor.yml: 
+  updated FreeType to version 2.11 
+
+2021-07-04  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/FilePath.cpp: 
+  prevent out-of-bounds access 
+
+  * src/InputBuffer.hpp: 
+  delete unused assignment operator 
+
+2021-06-15  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * .gitattributes: 
+  Update .gitattributes
+
+marked all files in libs and its subfolders as 
+  vendored code 
+
+2021-06-13  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * m4/ax_cxx_compile_stdcxx.m4: 
+  ax_cxx_compile_stdcxx.m4 to version 12 
+
+2021-05-30  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * doc/dvisvgm.1, doc/dvisvgm.txt.in: 
+  reworded few parts of the manual page 
+
+2021-04-01  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/PsSpecialHandler.cpp: 
+  restore proper context node at end of pattern definition 
+
+2021-03-22  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * .gitignore: 
+  added .pyc to ignored file suffixes 
+
+2021-02-09  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * doc/dvisvgm.txt.in: 
+  fixed typo in manual 
+
+2021-01-26  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * doc/tweak-dblatex-tex.py: 
+  updated tweak-dblatex-tex to Python 3 
+
+2021-01-21  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at uos.de>
+
+  * src/FontEngine.cpp: 
+  renamed some local variables 
+
+2020-12-21  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * .appveyor.yml: 
+  updated FreeType to version 2.10.4 
+
+2020-10-10  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * .appveyor.yml: 
+  updated FreeType to version 2.10.3 
+
+2020-09-22  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/XMLNode.cpp: 
+  renamed local variable 
+
+2020-08-27  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * doc/dvisvgm.1, doc/dvisvgm.txt.in: 
+  manpage: few additions to --bbox and --font-format 
+
+2020-08-22  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * .mailmap: 
+  removed redundant file 
+
+2020-08-21  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/DvisvgmSpecialHandler.cpp, tests/DvisvgmSpecialTest.cpp: 
+  fixed computation of string boundaries after expanding {?(...)}
+(closes 
+  #136) 
+
+2020-05-09  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * .appveyor.yml: 
+  updated FreeType to version 2.10.2 
+
+2020-05-03  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/dvisvgm.cpp: 
+  fixed indentation 
+
+2020-04-24  John Bowman  <bowman at ualberta.ca>
+
+  * src/dvisvgm.cpp: 
+  Fix indentation. 
+
+2020-04-23  John Bowman  <bowman at ualberta.ca>
+
+  * src/dvisvgm.cpp: 
+  Return error codes to shell. 
+
+2020-04-13  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/psdefs.cpp: 
+  fixed PS operator 'eoclip' 
+
+2020-03-30  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/optimizer/TransformSimplifier.cpp: 
+  optimizer: fixed omission of second scale() parameter 
+
+2020-03-21  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/Calculator.cpp, tests/CalculatorTest.cpp: 
+  calculator: allow to omit '*' before '(' 
+
+2020-03-19  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at uos.de>
+
+  * NEWS: 
+  updated NEWS and vc/README 
+
+2020-03-12  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * doc/dvisvgm.1: 
+  added generated man page to repo 
+
+2020-03-11  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/psdefs.cpp: 
+  fixed xshow, yshow, and xyshow for multi-byte characters 
+
+2020-03-10  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * doc/dvisvgm.txt.in, src/PSInterpreter.cpp: 
+  added bitmap format 'none' to disable image processing 
+
+2020-03-07  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/psdefs.cpp: 
+  don't access DataSource for shading types < 4 
+
+2020-02-20  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/psdefs.cpp: 
+  image operator: reset output device correctly 
+
+2020-02-17  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/psdefs.cpp: 
+  added evaluation of PS Level 1 image operators 
+
+2020-02-14  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * doc/dvisvgm.txt.in: 
+  manpage: added info on default values listed by --help 
+
+2020-01-17  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/GraphicsPath.hpp: 
+  arcto: use template type for rx and ry instead of double 
+
+2020-01-14  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/PageSize.cpp: 
+  replaced floor(x+0.5) with round(x) 
+
+2020-01-06  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/Ghostscript.cpp: 
+  added check for libgs.dylib.N (Mac only) 
+
+2020-01-02  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * doc/dvisvgm.txt.in: 
+  few additions to the manual page 
+
+2019-12-07  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * NEWS: 
+  updated NEWS 
+
+2019-12-06  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at uos.de>
+
+  * src/psdefs.cpp: 
+  fixed handling of 'nulldevice' in PS operator 'restore'
+closes #122 
+
+2019-11-23  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/GraphicsPath.hpp: 
+  added missing namespace prefix to pow() 
+
+2019-11-14  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * NEWS, README.md: 
+  updated NEWS and README 
+
+2019-11-12  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/psdefs.cpp: 
+  added newline at end of file 
+
+2019-11-08  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/EllipticalArc.cpp: 
+  minor changes in EllipticalArc.cpp 
+
+2019-09-19  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/PathClipper.cpp: 
+  prevent warnings about uninitialized variables 
+
+2019-09-17  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at uos.de>
+
+  * src/XXHashFunction.hpp, tests/HashFunctionTest.cpp: 
+  simplified implementation of XXHashFunction::digestValue() and tests 
+
+2019-08-26  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/GraphicsPath.hpp: 
+  avoid redundant sequences of closepath (z/Z) commands 
+
+2019-08-19  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/GraphicsPath.hpp, tests/GraphicsPathTest.cpp: 
+  added short versions of 'quadto' and 'cubicto' to GraphicsPath 
+
+2019-08-18  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/TpicSpecialHandler.cpp, tests/TpicSpecialTest.cpp: 
+  use class EllipticalArc to process arcs in tpic handler 
+
+2019-08-15  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/Color.cpp, src/Pair.hpp: 
+  use std::hypot() to compute length of vector 
+
+2019-08-01  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/FontCache.cpp: 
+  use direct string concatenation instead of temporary string stream 
+
+2019-07-28  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * doc/Makefile.am: 
+  moved generation of dvisvgm.sty to separate rule 
+
+2019-07-26  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/TrueTypeFont.cpp: 
+  call ofstream constructor with std::string instead of C string 
+
+2019-07-23  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/MetafontWrapper.cpp: 
+  replaced atoi() with stoi() 
+
+2019-07-16  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at uos.de>
+
+  * .github/FUNDING.yml: 
+  added funding.yml 
+
+2019-07-06  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/DVIToSVG.cpp: 
+  properly assign collected chars to unique fonts (fixes #110) 
+
+2019-06-18  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * doc/dvisvgm.txt.in: 
+  manpage: updated \special example 
+
+2019-06-17  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/BasicDVIReader.cpp: 
+  replaced string streams with plain strings 
+
+2019-06-11  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * tests/genhashcheck.py: 
+  use range-based loop to iterate over C array 
+
+2019-06-07  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at uos.de>
+
+  * .appveyor.yml, .gitignore, src/MiKTeXCom.hpp: 
+  added files required to access the MiKTeX session object 
+
+2019-05-06  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/psdefs.cpp: 
+  pop unused operand in PS operator 'setmatrix'  (closes #106) 
+
+2019-04-18  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * README, README.md: 
+  updated URL of FontForge website 
+
+2019-04-15  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * README.md: 
+  removed Coverity badge as the service seems to be dead 
+
+2019-04-14  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/Makefile.am: 
+  add file windows.hpp to source tarball 
+
+2019-04-13  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at uos.de>
+
+  * doc/dvisvgm.txt.in: 
+  reworded some paragraphs on the manpage 
+
+2019-04-05  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/GraphicsPath.hpp: 
+  skip redundant line drawing commands in path elements 
+
+2019-03-27  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/Makefile.am: 
+  reformatted file list in Makefile 
+
+2019-03-16  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/psdefs.cpp: 
+  added processing of PS operators xshow, yshow, and xyshow 
+
+2019-03-15  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: 
+  updated xxhash to version 0.7.0 
+
+2019-03-14  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/DvisvgmSpecialHandler.cpp, src/FontWriter.cpp: 
+  replaced lookup loops with std::find_if 
+
+2019-02-25  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * m4/Makefile.am: 
+  add ax_check_compile_flag.m4 to distributed source archives 
+
+2019-02-24  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/FontEngine.cpp, src/Ghostscript.cpp: 
+  replaced C casts with const_cast 
+
+2019-02-07  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * README.md: 
+  added some links to README 
+
+2019-01-31  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/PsSpecialHandler.cpp: 
+  put struct PatchVertex in corresponding method 
+
+2019-01-24  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * Makefile.am, configure.ac, m4/Makefile.am: 
+  add m4 files to source tarball 
+
+2019-01-22  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * NEWS, README, README.md: 
+  updated NEWS and README 
+
+  * .travis.yml: 
+  Travis: switched to xenial environment 
+
+2019-01-19  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * libs/potrace/CMakeLists.txt, libs/variant/CMakeLists.txt: 
+  removed redundant files 
+
+2018-11-27  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/CommandLine.hpp, src/options.xml: 
+  updated description in --help output 
+
+2018-11-06  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * m4/ax_cxx_compile_stdcxx.m4: 
+  updated ax_cxx_compile_stdcxx.m4 to version 10 
+
+2018-10-30  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * NEWS: 
+  updated NEWS 
+
+2018-10-10  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * configure.ac: 
+  added configuration option --disable-manpage (closes #93) 
+
+2018-10-02  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/XXHashFunction.hpp: 
+  fixed constexpr issue occured with gcc 4.8 
+
+2018-09-09  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * doc/Makefile.am: 
+  add dvisvgm.sty to distributed files 
+
+2018-09-07  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/DVIReader.cpp, src/DVIToSVG.cpp: 
+  reset hash function before computing a page hash 
+
+2018-09-03  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * libs/clipper/clipper.cpp: 
+  clipper: initialize TEdge by constructor instead of memset() 
+
+2018-09-01  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * configure.ac: 
+  removed redundant check for potrace from configure 
+
+2018-08-31  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/DVIReader.cpp: 
+  DVI postamble: relaxed plausibility check of the total page count 
+
+2018-08-08  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * configure.ac: 
+  correctly evaluate config option --disable-bundled-libs (closes #91) 
+
+2018-08-07  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * NEWS: 
+  fixed date in NEWS 
+
+2018-07-18  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/HyperlinkManager.cpp: 
+  reduced extent of hyperlinked areas to get a tight bbox 
+
+2018-07-15  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * NEWS: 
+  updated NEWS 
+
+  * .gitattributes: 
+  added linguist settings to 
+  .gitattributes
+
+https://github.com/github/linguist 
+
+2018-07-06  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * doc/dvisvgm.txt.in: 
+  manpage: updated external links 
+
+2018-06-23  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/SourceInput.cpp, src/SourceInput.hpp: 
+  moved handling of temporary files to separate class 
+
+2018-05-30  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/DVIToSVGActions.cpp, src/ImageToSVG.cpp: 
+  fixed evaluation of progress delay 
+
+2018-05-09  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * doc/dvisvgm.txt.in: 
+  minor fixes in manpage 
+
+2018-05-04  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * NEWS, README, README.md: 
+  updated NEWS and README 
+
+2018-05-02  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/Calculator.cpp: 
+  catch exception by reference rather than by value 
+
+2018-04-30  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/BoundingBox.cpp: 
+  swap wrongly assigned variables (doesn't affect behavior) 
+
+2018-04-26  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at uos.de>
+
+  * m4/ax_cxx_compile_stdcxx.m4: 
+  updated ax_cxx_compile_stdcxx.m4 to version 8 
+
+2018-04-13  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at uos.de>
+
+  * src/dvisvgm.cpp: 
+  simplified main() function 
+
+2018-03-27  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * tests/data/Makefile.am: 
+  add required test file cmr10.pfb to source tarballs (closes #87) 
+
+2018-03-07  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/RangeMap.cpp, src/RangeMap.hpp: 
+  added iterator and some getters to RangeMap 
+
+2018-01-12  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * doc/dvisvgm.txt.in: 
+  manpage: reworded info about option --bbox=preview (closes #83) 
+
+2018-01-09  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: 
+  updated xxHash to version 0.6.4 
+
+2017-12-21  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/psdefs.cpp: 
+  psdefs: replaced '6 array' with 'matrix' 
+
+2017-12-17  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * Makefile.am: 
+  removed redundant lcov statement from Makefile 
+
+2017-11-20  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at uos.de>
+
+  * README, README.md, doc/dvisvgm.txt.in: 
+  minor additions/fixes of manpage and README 
+
+2017-11-02  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/InputReader.cpp, src/InputReader.hpp, src/PSInterpreter.cpp: 
+  simplified code to lookup PS operators 
+
+2017-10-30  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * libs/ff-woff/fontforge/macbinary.c: 
+  updated link to CTAN:/tools/macutils/crc 
+
+2017-10-20  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * libs/woff2/include/woff2/version.h: 
+  replaced CRLF line endings 
+
+2017-10-17  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/PDFParser.cpp, src/PDFParser.hpp: 
+  replaced shared_ptr with unique_ptr in PDFParser 
+
+2017-10-13  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * tests/FileSystemTest.cpp: 
+  close streams before removing corresponding files 
+
+2017-09-09  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/dvisvgm.cpp: 
+  fixed number of dashes printed by option -V1 
+
+2017-09-08  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * m4/ax_code_coverage.m4: 
+  updated ax_code_coverage.m4 to version 25 
+
+2017-08-06  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * .appveyor.yml: 
+  AppVeyor: updated potrace to version 1.15 
+
+2017-08-01  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * .appveyor.yml: 
+  AppVeyor: changed build image to VS 2017; updated FreeType to 2.8 
+
+2017-06-20  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/PsSpecialHandler.cpp: 
+  psfile: fixed sign of y coordinates 
+
+2017-06-12  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/PsSpecialHandler.hpp: 
+  use bp units for line width and miter limit 
+
+2017-06-09  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/EPSToSVG.cpp: 
+  remove redundant clipPath elements also when converting EPS files 
+
+2017-05-30  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/Process.cpp: 
+  close pipe if fork() fails 
+
+2017-05-08  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/Process.cpp: 
+  quit Process::run() if child process terminated unexpectedly (fixes #68) 
+
+2017-04-27  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * tests/Makefile.am, tests/create-makefile: 
+  added the FontWriter dependencies to the tests 
+
+2017-04-24  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/Ghostscript.cpp: 
+  simplify code for looking up libgs (closes #66) 
+
+2017-04-14  Martin Gieseking  <martin.gieseking at 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 at users.noreply.github.com>
+
+  * src/Ghostscript.cpp: 
+  Auto-detect ghostscript dynamic library on macOS 
+
+2017-03-22  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * m4/ax_code_coverage.m4, m4/ax_cxx_compile_stdcxx.m4: 
+  updated m4 scripts 
+
+2017-03-03  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * .appveyor.yml, .travis.yml, appveyor.yml: 
+  exclude branch 'tmp' from CI builds 
+
+2017-02-11  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * tests/FontCacheTest.cpp: 
+  fixed FontCacheTest ('make distcheck' failed) 
+
+2017-02-03  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * README, README.md: 
+  README: updated links, added release badge 
+
+2017-01-30  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/Matrix.cpp, tests/MatrixTest.cpp: 
+  minor changes of matrix class; improved MatrixTest 
+
+2017-01-25  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * README.md, appveyor.yml: 
+  added basic appveyor.yml 
+
+2017-01-20  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/PsSpecialHandler.cpp, src/dvisvgm.cpp: 
+  added missing newlines in messages; fixed typo 
+
+2017-01-05  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/AGLTable.hpp: 
+  updated AGL table and removed colliding codepoints (closes #64) 
+
+2017-01-03  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at uos.de>
+
+  * doc/db2html.xsl, doc/dvisvgm.xpr: 
+  manpage: preserve whitespace in list of supported specials 
+
+2016-11-16  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * configure.ac: 
+  ensure compiling C files with --std=c99 
+
+2016-11-14  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * NEWS: 
+  updated NEWS 
+
+2016-11-12  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/FontWriter.cpp: 
+  few cosmetic changes; added comments 
+
+2016-09-27  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/Font.cpp: 
+  fixed sign of character depth computed for native fonts 
+
+2016-09-03  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/DVIToSVGActions.hpp, src/FontManager.hpp, src/MetafontWrapper.hpp: 
+  adapted struct/class forward declarations 
+
+2016-08-28  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at uos.de>
+
+  * src/XMLNode.hpp: 
+  added move constructors to XMLNode classes 
+
+2016-08-23  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * xxHash/xxhash.c, xxHash/xxhash.h: 
+  updated xxHash to version 0.6.2 
+
+2016-08-17  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/Ghostscript.hpp: 
+  removed copy constructor of class Ghostscript 
+
+  * src/PathClipper.cpp: 
+  added missing initializers 
+
+2016-08-13  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/FileFinder.cpp, src/Message.cpp: 
+  initialize maps with initializer-lists 
+
+2016-07-05  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/Length.cpp, src/TpicSpecialHandler.cpp: 
+  replaced 'id macros' with constexpr functions 
+
+2016-07-04  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/TFM.cpp, tests/JFMReaderTest.cpp, tests/TFMReaderTest.cpp: 
+  minor improvements to TFM/JFM tests 
+
+2016-06-16  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/DVIToSVG.cpp: 
+  fixed transformation of background color rectange 
+
+2016-05-31  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/DVIToSVG.cpp, src/EPSToSVG.cpp: 
+  reworded messages printed after finishing a conversion 
+
+2016-05-30  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/Process.cpp: 
+  fixed collecting stdout/stderr output when executing a process 
+
+2016-04-20  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/GraphicsPath.h: 
+  renamed GraphicsPath::sconito/scubicto 
+
+2016-03-14  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * NEWS: 
+  updated NEWS 
+
+2016-02-26  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at uos.de>
+
+  * src/PsSpecialHandler.cpp: 
+  don't remove clipping paths that consist of single moveto commands only 
+
+2016-02-01  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/GFReader.cpp, src/GFReader.h: 
+  added checks for misplaced GF commands 
+
+  * NEWS: 
+  updated NEWS 
+
+2016-01-04  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * .travis.yml, configure.ac, src/Doxyfile: 
+  set version to 1.14 
+
+  * NEWS: 
+  updated NEWS 
+
+2015-12-27  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/PsSpecialHandler.cpp: 
+  added evaluation of PSTricks specials 'pst:' and 'PST:' 
+
+2015-12-26  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * .travis.yml, configure.ac, src/Doxyfile: 
+  set version to 1.12 
+
+  * NEWS: 
+  updated NEWS 
+
+2015-11-16  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * README, README.md: 
+  updated links to Google Test framework 
+
+2015-11-09  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/Process.cpp, src/Process.h: 
+  fixed invalid access to freed string memory 
+
+2015-10-06  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * doc/dvisvgm.txt.in: 
+  minor improvements of the manual page 
+
+2015-09-21  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * NEWS, README, README.md: 
+  updated NEWS and README files 
+
+2015-09-18  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * .travis.yml, configure.ac, src/Doxyfile: 
+  set version to 1.11 
+
+2015-09-14  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at uos.de>
+
+  * README, README.md: 
+  minor updates to README and README.md 
+
+2015-07-29  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * README, README.md, doc/dvisvgm.txt.in: 
+  updated info about new project website 
+
+2015-07-14  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * .travis.yml, configure.ac, src/Doxyfile: 
+  set version to 1.10 
+
+  * NEWS: 
+  updated NEWS 
+
+2015-07-12  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * README, README.md: 
+  updated README 
+
+2015-07-03  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at uos.de>
+
+  * tests/SVGOutputTest.cpp: 
+  remove output files created by SVGOutputTest::getPageStream() 
+
+2015-04-02  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * README.md: 
+  minor additions to README.md 
+
+2015-03-26  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * tests/StreamWriterTest.cpp: 
+  fixed StreamWriterTest 
+
+  * tests/SVGOutputTest.cpp: 
+  improved SVGOutputTest 
+
+2015-03-19  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * tests/Makefile.am, tests/ShadingPatch.cpp: 
+  added ShadingPatchTest 
+
+2015-03-18  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at uos.de>
+
+  * tests/XMLStringTest.cpp: 
+  fixed test class name of XMLString 
+
+2015-03-09  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * NEWS, README.md: 
+  updated NEWS and README.md 
+
+2015-02-27  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/Calculator.cpp: 
+  replaced while(1) with for(;;) for consistency 
+
+2015-02-26  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * configure.ac, src/Doxyfile: 
+  set version to 1.9.1 
+
+2015-02-25  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/Ghostscript.cpp: 
+  disable lookup of GS library in Windows registry for old gcc versions 
+
+2015-02-20  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/TpicSpecialHandler.cpp: 
+  use constant M_PI rather than computing PI locally 
+
+2015-02-17  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * README, README.md: 
+  updated README and README.md 
+
+2015-01-26  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/ShadingPatch.h: 
+  removed redundant methods from class ShadingPatch 
+
+2015-01-21  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/TensorProductPatch.cpp, src/TriangularPatch.cpp: 
+  renamed static helper function clip() to snap() 
+
+2015-01-15  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/Color.cpp: 
+  resolved ambiguous call of pow (patch by Peter Breitenlohner) 
+
+2015-01-12  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/VectorIterator.h: 
+  removed redundant method VectorIterator::distanceToLast() 
+
+2014-12-30  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/DVIReader.cpp: 
+  check validity of DVI file before trying to collect the BOPs 
+
+2014-12-18  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at uos.de>
+
+  * README.md: 
+  added list of features and a download button to README.md 
+
+2014-11-09  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * clipper/clipper.cpp, clipper/clipper.hpp: 
+  updated clipper library to version 6.2.1 
+
+2014-11-08  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/Matrix.cpp: 
+  use constant M_PI rather than defining PI locally 
+
+2014-10-23  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * NEWS: 
+  updated NEWS 
+
+2014-07-28  Martin Gieseking  <mgieseki at 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 at 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 at 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 at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/Ghostscript.cpp: 
+  get proper name of Ghostscript library when building for Cygwin 
+
+2014-06-23  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * README.md: 
+  added markdown version of README 
+
+2014-06-20  Martin Gieseking  <martin.gieseking at 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 at 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 at users.sourceforge.net>
+
+  * src/XMLNode.cpp, src/XMLNode.h: 
+  added clear() to XMLNode classes; added XMLTextNode::getText() 
+
+2014-06-11  Martin Gieseking  <martin.gieseking at 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 at users.sourceforge.net>
+
+  * src/SpecialActions.h, tests/ColorSpecialTest.cpp: 
+  renamed class SpecialEmptyActions to EmptySpecialActions 
+
+2014-06-09  Martin Gieseking  <mgieseki at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/SVGTree.cpp: 
+  don't add unnecessary element 'missing-glyph' to SVG files 
+
+2014-04-24  Martin Gieseking  <mgieseki at 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 at users.sourceforge.net>
+
+  * src/System.h: 
+  removed redundant semicolon 
+
+2014-04-22  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * configure.ac, src/Doxyfile: 
+  set version to 1.6 
+
+  * NEWS: 
+  updated NEWS 
+
+2014-04-21  Martin Gieseking  <mgieseki at 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 at 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 at 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 at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/Ghostscript.cpp: 
+  check if library given by --libgs is actually a GS library 
+
+2014-01-10  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * NEWS: 
+  updated NEWS 
+
+2014-01-03  Martin Gieseking  <mgieseki at 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 at 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 at users.sourceforge.net>
+
+  * src/MiKTeXCom.cpp: 
+  prevent releasing MiKTeX object if its initialization failed 
+
+2013-12-29  Martin Gieseking  <mgieseki at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * NEWS: 
+  updated NEWS 
+
+2013-10-28  Martin Gieseking  <mgieseki at 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 at users.sourceforge.net>
+
+  * src/DVIToSVG.cpp: 
+  suppress output of logical page number if it equals physical page number 
+
+2013-10-16  Martin Gieseking  <mgieseki at 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 at 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 at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/SVGTree.cpp: 
+  appended px unit to font-size attributes in style section 
+
+2013-08-22  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * src/XMLString.cpp: 
+  replace very small floating point numbers by 0 
+
+2013-08-20  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * src/FileFinder.cpp: 
+  suppress error messages from makeFOO tools 
+
+2013-08-13  Martin Gieseking  <mgieseki at 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 at 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 at users.sourceforge.net>
+
+  * src/Matrix.cpp, src/Matrix.h: 
+  renamed Matrix skewing methods 
+
+2013-08-04  Martin Gieseking  <mgieseki at 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 at users.sourceforge.net>
+
+  * src/CMapManager.cpp, src/CMapManager.h, src/FontManager.cpp: 
+  avoid const_cast in CMapManager 
+
+2013-08-02  Martin Gieseking  <mgieseki at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/psdefs.cpp: 
+  replaced PS operator prval with =only in psdefs 
+
+2013-07-17  Martin Gieseking  <mgieseki at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/FileFinder.cpp: 
+  removed redundant 'using namespace std' 
+
+2013-06-03  Martin Gieseking  <mgieseki at 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 at 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 at users.sourceforge.net>
+
+  * src/dvisvgm.cpp: 
+  added a missing (underlining) hyphen to the output of -V1 
+
+2013-05-17  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.h: 
+  added missing NoPsSpecialhandler files 
+
+2013-05-13  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/DVIToSVG.cpp: 
+  don't link NoPsSpecialHandler if HAVE_LIBGS 
+
+2013-04-25  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * src/FontEncoding.cpp: 
+  fixed bracketing bug that prevented lookup of fontmap files 
+
+2013-04-24  Martin Gieseking  <mgieseki at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/FileFinder.cpp, src/dvisvgm.cpp: 
+  catch MessageException if MiKTeX version can't be obtained 
+
+2013-04-09  Martin Gieseking  <mgieseki at 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 at 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 at users.sourceforge.net>
+
+  * src/XMLNode.cpp, src/XMLNode.h: 
+  unhide derived method XMLDeclarationNode::append 
+
+2013-03-10  Martin Gieseking  <mgieseki at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/CommandLine.cpp: 
+  fixed alignment of --help text 
+
+2013-01-22  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/Ghostscript.cpp: 
+  added explicit cast to avoid signed/unsigned comparison warning 
+
+2012-12-02  Martin Gieseking  <mgieseki at 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 at users.sourceforge.net>
+
+  * src/Message.cpp: 
+  don't wrap message lines explicitly on Windows
+* * * 
+
+2012-11-23  Martin Gieseking  <mgieseki at 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 at users.sourceforge.net>
+
+  * src/Message.cpp: 
+  handle wrapping of messages containing newlines correctly 
+
+2012-11-21  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * src/DLLoader.cpp, src/DLLoader.h, src/Ghostscript.cpp: 
+  renamed DLLoader::loadFunction() to DLLoader::loadSymbol() 
+
+2012-11-19  Martin Gieseking  <mgieseki at 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 at users.sourceforge.net>
+
+  * src/Directory.h: 
+  undefine macro max() to avoid compilation problems on Windows 
+
+2012-11-15  Martin Gieseking  <mgieseki at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/psdefs.psc: 
+  ignore dvips bop operators that might be present in PS specials 
+
+2012-09-17  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * src/StreamReader.cpp: 
+  fixed reading invalid number of string characters 
+
+2012-04-17  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * doc/Makefile.am: 
+  keep manpage when calling 'make clean' 
+
+2012-04-04  Martin Gieseking  <mgieseki at 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 at users.sourceforge.net>
+
+  * src/Matrix.cpp, src/Matrix.h, tests/MatrixTest.cpp: 
+  added Matrix::invert() and det() 
+
+2012-03-29  Martin Gieseking  <mgieseki at 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 at uos.de>
+
+  * src/psdefs.psc: 
+  evaluate PS operators rectclip, rectfill, and rectstroke 
+
+2012-03-09  Martin Gieseking  <mgieseki at 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 at uos.de>
+
+  * configure.ac, src/Doxyfile: 
+  set version to 1.0.11 
+
+2012-03-07  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * src/DVIToSVGActions.cpp: 
+  correct location of a rule's bounding box (lp bug #948713) 
+
+2012-02-24  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * doc/dvisvgm.txt.in: 
+  fixed a couple of mistakes and formatting flaws in the manpage 
+
+2012-02-17  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * README: 
+  updated information about bug reporting 
+
+2012-01-26  Martin Gieseking  <mgieseki at 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 at 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 at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/GraphicPath.h: 
+  added some more comments to the methods of GraphicPath 
+
+2011-11-18  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * configure.ac: 
+  move linker flag -lfreetype from LDFLAGS to LIBS to avoid linking 
+  problems 
+
+2011-10-28  Martin Gieseking  <mgieseki at 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 at uos.de>
+
+  * configure.ac, src/Doxyfile: 
+  set version to 1.0.9 
+
+  * NEWS: 
+  updated NEWS 
+
+2011-10-09  Martin Gieseking  <mgieseki at 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 at 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 at users.sourceforge.net>
+
+  * doc/Makefile.am: 
+  add metadata/pdfmarks to pdf version of manpage 
+
+2011-09-06  Martin Gieseking  <mgieseki at 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 at 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 at users.sourceforge.net>
+
+  * configure.ac: 
+  added AC_LANG_SOURCE to avoid autoconf warnings 
+
+2011-05-31  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/DLLoader.h: 
+  added #undef NOMINMAX before (re)defining it 
+
+2011-05-12  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/SpecialManager.cpp: 
+  register special prefix ps:: properly 
+
+2011-04-18  Martin Gieseking  <mgieseki at 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 at 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 at users.sourceforge.net>
+
+  * src/XMLNode.cpp, src/XMLNode.h: 
+  prepended member variables of the XMLNode classes with underscore 
+
+2011-03-15  Martin Gieseking  <mgieseki at 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 at 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 at users.sourceforge.net>
+
+  * NEWS, configure.ac, src/Doxyfile: 
+  set version to 1.0.5, updated NEWS 
+
+2011-02-28  Martin Gieseking  <mgieseki at 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 at 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 at users.sourceforge.net>
+
+  * src/InputBuffer.h: 
+  reference to scanned string in StringInputBuffer is constant now 
+
+2011-02-10  Martin Gieseking  <mgieseki at 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 at users.sourceforge.net>
+
+  * src/CmdLineParserBase.cpp: 
+  print character instead of ascii value in message of command-line parser 
+
+2011-01-30  Martin Gieseking  <mgieseki at 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 at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/FontEngine.cpp: 
+  fixed FreeType version check (patch by Paul Vojta) 
+
+2010-08-11  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * tests/Makefile.am, tests/PairTest.cpp: 
+  added PairTest 
+
+2010-08-06  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * configure.ac, src/Doxyfile: 
+  set version to 1.0.3 
+
+2010-08-05  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * NEWS, doc/dvisvgm.txt.in: 
+  updated manpage and NEWS 
+
+2010-08-04  Martin Gieseking  <mgieseki at 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 at users.sourceforge.net>
+
+  * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp: 
+  added check of DVI format version 
+
+2010-07-26  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: 
+  restore transformation matrix after execution of psfile 
+
+2010-07-13  Martin Gieseking  <mgieseki at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * configure.ac: 
+  fixed whitespace issue in CPPFLAGS and LDFLAGS 
+
+2010-05-04  Martin Gieseking  <mgieseki at 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 at users.sourceforge.net>
+
+  * NEWS, configure.ac, src/Doxyfile: 
+  set version to 0.9.1 
+
+2010-04-22  Martin Gieseking  <mgieseki at 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 at users.sourceforge.net>
+
+  * src/FontEncoding.cpp: 
+  fixed memory bug in FontEncoding::encoding() 
+
+2010-04-11  Martin Gieseking  <mgieseki at 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 at 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 at 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 at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * NEWS, configure.ac, src/Doxyfile: 
+  version updated to 0.8.8 
+
+2010-02-01  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * tests/check-conv: 
+  skip conversion checks by default 
+
+2010-01-31  Martin Gieseking  <mgieseki at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/CommandLine.cpp, src/options.dtd, src/options.xml: 
+  added DTD for options.xml 
+
+2010-01-17  Martin Gieseking  <mgieseki at 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 at users.sourceforge.net>
+
+  * src/InputReader.cpp: 
+  fixed bug in InputReader::parseUInt() 
+
+2009-12-15  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * configure.ac, src/dvisvgm.cpp: 
+  appied get_time patch sent by Peter Breitenlohner 
+
+2009-12-02  Martin Gieseking  <mgieseki at 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 at 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 at 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 at 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 at 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 at 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 at users.sourceforge.net>
+
+  * src/DVIToSVGActions.cpp, src/Font.cpp, src/Font.h: 
+  fixed positioning of italic characters 
+
+2009-10-25  Martin Gieseking  <mgieseki at users.sourceforge.net>
+
+  * src/DvisvgmSpecialHandler.cpp: 
+  added macro {?nl} to dvisvgm:raw evaluator 
+
+2009-10-18  Martin Gieseking  <mgieseki at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/PsSpecialHandler.cpp: 
+  scale clipping paths by 72.27/72 
+
+2009-10-09  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * NEWS, README: 
+  updated NEWS and README 
+
+2009-09-04  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/PsSpecialHandler.cpp, src/psdefs.psc: 
+  fixed flattened clipping path bug (issue #11) 
+
+2009-08-31  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/Makefile.am: 
+  added error checks; disallow numeric optional arguments w/o default 
+  value 
+
+2009-08-28  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * LICENSE, Makefile.am, src/Ghostscript.cpp: 
+  modified package to be compatible with prerequisites of Fedora 
+
+2009-07-30  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/psdefs.psc: 
+  added vim tag to psdefs.psc 
+
+2009-07-28  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/PSInterpreter.cpp: 
+  some clean-ups 
+
+2009-07-22  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/FontGlyph.cpp: 
+  fixed bug in computation of shorthand path command 
+
+2009-04-06  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/MetafontWrapper.cpp, src/MetafontWrapper.h: 
+  ported fix in MetafontWrapper back to default branch 
+
+2009-03-25  Martin Gieseking  <martin.gieseking at 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 at 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 at uos.de>
+
+  * src/FontCache.cpp: 
+  cache files are being compressed now to reduce the file size 
+
+2009-03-19  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/DVIReader.cpp: 
+  made DVICommand local to executeCommand, removed unnecessary if 
+  statement 
+
+2009-02-14  Martin Gieseking  <martin.gieseking at 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 at 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 at xps  <martin at xps>
+
+  * src/inttypes.h: 
+  added rudimentary files for writing of SWF files; not ready yet 
+
+2009-02-10  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/TransformationMatrix.cpp: 
+  made y-coordinate of cmdline-option -t optional 
+
+2009-02-06  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/FileFinder.cpp: 
+  adapted Windows version to new release 
+
+2009-01-28  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at uos.de>
+
+  * doc/Makefile.am, doc/dvisvgm.1.in: 
+  manpage updates 
+
+2009-01-22  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/TransformationMatrix.cpp: 
+  fixed bug in argument assignment of transformation command M 
+
+2009-01-15  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/TransformationMatrix.cpp: 
+  removed a dangerous loop remained from previous code 
+
+2009-01-14  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/CharmapTranslator.cpp: 
+  fixed crash on loading corrupt pfb-files 
+
+2008-06-18  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/Makefile.am: 
+  adapted to latest gengetopt version 
+
+2008-04-07  Martin Gieseking  <martin.gieseking at uos.de>
+
+  * src/Makefile.am: 
+  added missing include path 
+
+  * src/DVIReader.cpp: 
+  minor change 
+
+2007-03-26  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at uos.de>
+
+  * src/Font.cpp, src/Font.h: 
+  added Font classes (not yet error-free) 
+
+2007-03-06  Martin Gieseking  <martin.gieseking at 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 at uos.de>
+
+  * src/DVIReader.cpp, src/FontManager.cpp, src/VFReader.cpp: 
+  added some more skeleton code 
+
+2007-03-02  Martin Gieseking  <martin.gieseking at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 
+

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.am
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.am	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.am	2022-01-21 17:25:16 UTC (rev 61679)
@@ -1,5 +1,5 @@
 ## This file is part of dvisvgm
-## Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking at uos.de>
+## Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>
 ##
 ## Process this file with automake.
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.in
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.in	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/Makefile.in	2022-01-21 17:25:16 UTC (rev 61679)
@@ -163,8 +163,8 @@
     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`; \

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/NEWS
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/NEWS	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/NEWS	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/README
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/README	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/README	2022-01-21 17:25:16 UTC (rev 61679)
@@ -130,7 +130,7 @@
 
 COPYRIGHT
 
- Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking at uos.de>
+ Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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

Added: trunk/Build/source/texk/dvisvgm/dvisvgm-src/config.h.in
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/config.h.in	                        (rev 0)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/config.h.in	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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


Property changes on: trunk/Build/source/texk/dvisvgm/dvisvgm-src/config.h.in
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+LF
\ No newline at end of property
Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/configure.ac
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/configure.ac	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/configure.ac	2022-01-21 17:25:16 UTC (rev 61679)
@@ -1,11 +1,11 @@
 # This file is part of dvisvgm
-# Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking at uos.de>
+# Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>
 #
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ(2.59)
-AC_INIT([dvisvgm],[2.11.1],[martin.gieseking at uos.de])
-DATE="January 2021"
+AC_INIT([dvisvgm],[2.13],[martin.gieseking at uos.de])
+DATE="January 2022"
 AC_CONFIG_SRCDIR(src)
 AC_CONFIG_HEADERS([config.h])
 AC_CONFIG_MACRO_DIR([m4])

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.am
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.am	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.am	2022-01-21 17:25:16 UTC (rev 61679)
@@ -1,5 +1,5 @@
 ## This file is part of dvisvgm
-## Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking at uos.de>
+## Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>
 ##
 ## Process this file with automake.
 
@@ -73,6 +73,7 @@
 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 ]; \

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.in
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.in	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/Makefile.in	2022-01-21 17:25:16 UTC (rev 61679)
@@ -306,6 +306,7 @@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -625,6 +626,7 @@
 @BUILD_MANPAGE_TRUE at dvisvgm.sty: dvisvgm-man.xml $(GEN_DBLATEX_STY)
 @BUILD_MANPAGE_TRUE@	xsltproc -o dvisvgm.sty $(GEN_DBLATEX_STY) $<
 
+ at BUILD_MANPAGE_TRUE@.NOTPARALLEL:
 @BUILD_MANPAGE_TRUE at 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 ]; \

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-man.xsl
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-man.xsl	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-man.xsl	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de> -->
+<!-- Copyright (C) 2015-2022 Martin Gieseking <martin.gieseking at 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">

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-pdf.xsl
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-pdf.xsl	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/conf-dblatex-pdf.xsl	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de> -->
+<!-- Copyright (C) 2015-2022 Martin Gieseking <martin.gieseking at 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>

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.1
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.1	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.1	2022-01-21 17:25:16 UTC (rev 61679)
@@ -2,12 +2,12 @@
 .\"     Title: dvisvgm
 .\"    Author: Martin Gieseking <martin.gieseking at 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 @@
 .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 @@
 .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 @@
 .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 @@
 .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 @@
 \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 @@
 .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 @@
 \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 @@
 .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 @@
 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 @@
 Written by Martin Gieseking <\m[blue]\fBmartin\&.gieseking at 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\&.

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.txt.in
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.txt.in	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/dvisvgm.txt.in	2022-01-21 17:25:16 UTC (rev 61679)
@@ -1,6 +1,6 @@
 //////////////////////////////////////////////////////////////////////////
 // This file is part of dvisvgm -- a fast DVI to SVG converter          //
-// Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking at uos.de>   //
+// Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 :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 @@
 
 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 @@
 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 @@
 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 @@
 
 *-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,15 +454,22 @@
   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
 integer divisions with common precedence. The variables *p* and *P* contain the current page number
@@ -471,7 +478,8 @@
 +
 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 @@
 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 @@
 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 @@
 [[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 &#x2013; but not necessarily &#x2013;
+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 @@
 *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 @@
 
 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.
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-db-refentry.xsl
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-db-refentry.xsl	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-db-refentry.xsl	2022-01-21 17:25:16 UTC (rev 61679)
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <!-- This file is part of dvisvgm -->
-<!-- Copyright (C) 2015-2021 Martin Gieseking <martin.gieseking at uos.de> -->
+<!-- Copyright (C) 2015-2022 Martin Gieseking <martin.gieseking at uos.de> -->
 <xsl:stylesheet version="1.0"
 	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 	xmlns:date="http://exslt.org/dates-and-times"

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-pdf.xsl
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-pdf.xsl	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-pdf.xsl	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de> -->
+<!-- Copyright (C) 2015-2022 Martin Gieseking <martin.gieseking at 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"/>
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-tex.py
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-tex.py	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/doc/tweak-dblatex-tex.py	2022-01-21 17:25:16 UTC (rev 61679)
@@ -10,9 +10,9 @@
             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

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/Makefile.am
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/Makefile.am	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/Makefile.am	2022-01-21 17:25:16 UTC (rev 61679)
@@ -1,5 +1,5 @@
 ## This file is part of dvisvgm
-## Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking at uos.de>
+## Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>
 ##
 ## Process this file with automake.
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/brotli/enc/encode.c
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/brotli/enc/encode.c	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/brotli/enc/encode.c	2022-01-21 17:25:16 UTC (rev 61679)
@@ -1470,8 +1470,8 @@
 
 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;

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/ff-woff/fontforge/tmpfile2.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/ff-woff/fontforge/tmpfile2.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/ff-woff/fontforge/tmpfile2.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de> */
+* (C) 2017-2022 Martin Gieseking <martin.gieseking at uos.de> */
 
 #include <cstdio>
 #include <cstdlib>

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxh3.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxh3.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxh3.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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,

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxhash.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxhash.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/libs/xxHash/xxhash.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 @@
 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 @@
 
    /*
     * 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 @@
 #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 @@
 #  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 @@
  * 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,6 +286,7 @@
 #  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)
@@ -225,17 +293,21 @@
 #  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 @@
 ***************************************/
 #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 @@
 /*-**********************************************************************
 *  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 @@
 #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
+ * @}
  *
- * 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.
+ * @defgroup xxh32_family XXH32 family
+ * @ingroup public
+ * Contains functions used in the classic 32-bit xxHash algorithm.
+ *
+ * @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
+ * @{
  */
+
+/*!
+ * @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   *******/
-
-/*
- * 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 @@
  * 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;   /* incomplete type */
+/*!
+ * @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;
+
+/*!
+ * @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 @@
  * 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 @@
 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 @@
  *
  *    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.
+ * 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.
  *
- * The algorithm is portable: Like XXH32 and XXH64, it generates the same hash
- * on all platforms.
+ * 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.
  *
- * It benefits greatly from SIMD and 64-bit arithmetic, but does not require it.
+ * Optimized implementations are provided for AVX512, AVX2, SSE2, NEON, POWER8,
+ * ZVector and scalar targets. This can be controlled via the XXH_VECTOR macro.
  *
- * 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 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.
  *
- * Optimized implementations are provided for AVX512, AVX2, SSE2, NEON, POWER8,
- * ZVector and scalar targets. This can be controlled with the XXH_VECTOR macro.
+ * XXH3 offers 2 variants, _64bits and _128bits.
  *
- * XXH3 offers 2 variants, _64bits and _128bits.
- * When only 64 bits are needed, prefer calling the _64bits variant, as it
+ * 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_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 @@
  * 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 @@
 *  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 @@
 
 #endif  /* XXH_NO_LONG_LONG */
 
+/*!
+ * @}
+ */
 #endif /* XXHASH_H_5627135585666179 */
 
 
@@ -612,36 +960,57 @@
  * 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,6 +1021,7 @@
 
 /* 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
@@ -658,29 +1028,81 @@
 #   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 @@
 #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 @@
  * 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 @@
 /* *************************************
 *  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,59 +1284,66 @@
  *
  * 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).
  *
- * 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.
+ * 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.
+ *
+ * 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.
  * Align check is automatically disabled on x86, x64 & arm64,
@@ -844,17 +1351,11 @@
  *
  * 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 @@
  * 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 @@
 #  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,7 +1493,7 @@
 #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
@@ -934,12 +1500,12 @@
 #  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 @@
 /* *************************************
 *  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 @@
 #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 @@
 
 /* ***   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,12 +1683,12 @@
 
 /*
  * 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;
 }
 
@@ -1044,16 +1695,23 @@
 #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 @@
      || (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 @@
 #  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 @@
 #  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,8 +1811,16 @@
 /* ***************************
 *  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,6 +1872,7 @@
 /* *************************************
 *  Misc
 ***************************************/
+/*! @ingroup public */
 XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; }
 
 
@@ -1188,11 +1879,18 @@
 /* *******************************************************************
 *  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 @@
 #  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 @@
      *   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 @@
 
 #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 @@
     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,24 +2022,24 @@
     } 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;
@@ -1324,17 +2046,17 @@
                          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 @@
 #  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 @@
     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 @@
     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,11 +2135,14 @@
 
 
 /*******   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);
@@ -1423,34 +2149,35 @@
     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 @@
         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 @@
 
         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 @@
 }
 
 
-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 @@
 
 /*******   Canonical representation   *******/
 
-/*
+/*!
+ * @ingroup xxh32_family
  * The default return values from XXH functions are unsigned 32 and 64 bit
  * integers.
  *
@@ -1544,9 +2265,9 @@
 {
     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 @@
 /* *******************************************************************
 *  64-bit hash functions
 *********************************************************************/
-
+/*!
+ * @}
+ * @ingroup impl
+ * @{
+ */
 /*******   Memory access   *******/
 
 typedef XXH64_hash_t xxh_u64;
@@ -1567,35 +2292,6 @@
 #  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 @@
 #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 @@
 
 /*
  * 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 @@
 #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,13 +2408,19 @@
 
 
 /*******   xxh64   *******/
+/*!
+ * @}
+ * @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 */
 
-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 */
-
 #ifdef XXH_OLD_NAMES
 #  define PRIME64_1 XXH_PRIME64_1
 #  define PRIME64_2 XXH_PRIME64_2
@@ -1756,126 +2461,27 @@
 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;
     }
-    /* impossible to reach */
-    XXH_ASSERT(0);
-    return 0;  /* unreachable, but some compilers complain without it */
+    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;
+    }
+    return  XXH64_avalanche(h64);
 }
 
 #ifdef XXH_OLD_NAMES
@@ -1891,18 +2497,12 @@
 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 (input==NULL) XXH_ASSERT(len == 0);
 
-#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 (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 @@
             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 @@
 }
 
 
+/*! @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 @@
     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,10 +2553,12 @@
 
 /*******   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);
@@ -1964,33 +2565,34 @@
     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 @@
 
         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 @@
 }
 
 
-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 @@
 
 /******* 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,13 +2798,63 @@
 /* ==========================================
  * 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__)
 #    define XXH_VECTOR XXH_AVX512
@@ -2212,10 +2862,13 @@
 #    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 @@
  * 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 @@
  */
 # 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 @@
 # 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 @@
 #  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 @@
 #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 @@
 #  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 @@
 #  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 @@
 #    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 @@
     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 @@
 #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 @@
     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 @@
 {
     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 @@
 {
     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 @@
      * 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 @@
 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 @@
  * 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 @@
                      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 @@
 {
     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 @@
     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 @@
 
 #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 @@
                     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 @@
 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,10 +3893,10 @@
     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__)
         /*
@@ -3215,13 +3903,11 @@
          * 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 @@
 
 #endif
 
+/* x86dispatch always generates SSE2 */
 #if (XXH_VECTOR == XXH_SSE2) || defined(XXH_X86DISPATCH)
 
 #ifndef XXH_TARGET_SSE2
@@ -3248,7 +3935,7 @@
 {
     /* 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 @@
 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,16 +3999,16 @@
     {   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:
@@ -3328,11 +4015,13 @@
          *   - 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 @@
 {
     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 @@
             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 @@
                     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 @@
         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 @@
                      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 @@
 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 @@
      *   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 @@
          *   without hack: 2063.7 MB/s
          *   with hack:    2560.7 MB/s
          */
-        __asm__("" : "+r" (result64));
+        XXH_COMPILER_GUARD(result64);
 #endif
     }
 
@@ -3768,9 +4462,11 @@
 }
 
 /*
- * 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 @@
 }
 
 /*
- * 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,11 +4558,13 @@
 
 /* ===   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)
 {
@@ -3874,6 +4571,7 @@
     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)
 {
@@ -3880,7 +4578,15 @@
     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 @@
         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,6 +4663,7 @@
     return state;
 }
 
+/*! @ingroup xxh3_family */
 XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr)
 {
     XXH_alignedFree(statePtr);
@@ -3962,16 +4670,17 @@
     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,6 +4697,7 @@
     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;
@@ -3994,34 +4704,50 @@
     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;
+}
+
 /* Note : when XXH3_consumeStripes() is invoked,
  * there must be a guarantee that at least one more byte must be consumed from input
  * so that the function can blindly consume all stripes using the "normal" secret segment */
@@ -4049,34 +4775,48 @@
     }
 }
 
+#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 */
-
         #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 @@
             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 @@
         }
         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 @@
      * 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,8 +4933,8 @@
         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);
@@ -4163,6 +4941,7 @@
     }
 }
 
+/*! @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,7 +4953,7 @@
                               (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);
@@ -4181,51 +4960,7 @@
 }
 
 
-#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 @@
 }
 
 /*
- * 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 @@
 
 /* ===   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 @@
                                  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_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,7 +5357,17 @@
                                  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)
 {
     return XXH3_128bits_withSeed(input, len, seed);
@@ -4628,47 +5377,40 @@
 /* ===   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)
 {
     return XXH3_update(state, (const xxh_u8*)input, len,
@@ -4675,6 +5417,7 @@
                        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 @@
 #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 @@
  * 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 @@
 
 
 /*======   Canonical representation   ======*/
+/*! @ingroup xxh3_family */
 XXH_PUBLIC_API void
 XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash)
 {
@@ -4735,10 +5481,11 @@
         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 @@
     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 @@
 
 #endif  /* XXH_NO_LONG_LONG */
 
+#endif  /* XXH_NO_XXH3 */
 
+/*!
+ * @}
+ */
 #endif  /* XXH_IMPLEMENTATION */
 
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/AGLTable.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/AGLTable.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/AGLTable.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BasicDVIReader.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bezier.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		if (!_pageColors.empty() && _pageColors.back().first == pageno)
 			_pageColors.back().second = color;
 		else
-			_pageColors.emplace_back(PageColor(pageno, color));
+			_pageColors.emplace_back(pageno, color);
 	}
 }
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BgColorSpecialHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Bitmap.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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<string> lengthStrings = util::split(boxstr, " ");
 	for (const string &lenstr : lengthStrings) {
 		if (!lenstr.empty())
-			lengths.emplace_back(Length(lenstr));
+			lengths.emplace_back(lenstr);
 	}
 	return lengths;
 }

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CLCommandLine.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CLOption.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CLOption.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CLOption.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMap.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 
 
 	// 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) {

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapManager.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CMapReader.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Calculator.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CharMapID.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Character.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Character.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Character.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Color.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ColorSpecialHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CommandLine.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CommandLine.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/CommandLine.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>
+// Copyright (C) 2016-2022 Martin Gieseking <martin.gieseking at uos.de>
 
 #ifndef COMMANDLINE_HPP
 #define COMMANDLINE_HPP
@@ -20,7 +20,7 @@
 		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 at uos.de>"
+			"Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>"
 		) {}
 
 		CommandLine (int argc, char **argv) : CommandLine() {

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIActions.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIActions.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIActions.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
  *  @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 @@
 		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 @@
 		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));
 }
 
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIReader.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 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 @@
 	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::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::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 @@
 		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

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVG.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 
 	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 @@
 		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 @@
 	_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));
 	}
 }

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DVIToSVGActions.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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();}

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Directory.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		_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 @@
 /** 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 @@
 		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 @@
 	// 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 @@
 	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)

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/DvisvgmSpecialHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 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>;
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSFile.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSToSVG.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSToSVG.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EPSToSVG.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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 @@
 			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;
 				}
 			}

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EllipticalArc.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 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 @@
 	}
 	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 @@
 		// 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);
 	}
 }
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EmSpecialHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/EncFile.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 
 
 #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;
+	return tolower(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;
-}
-
 #endif
 
 
@@ -99,7 +89,7 @@
  *  @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 @@
 	_fname.clear();
 	single_slashes(path);
 	single_slashes(current_dir);
-#ifdef _WIN32
+#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);
-	_drive = strip_drive_letter(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::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,6 +208,10 @@
  *  @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())
@@ -229,10 +218,6 @@
 		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 @@
  *  @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 @@
 	}
 	if (path.empty())
 		path = ".";
+#ifdef _WIN32
+	if (relpath._drive && _drive && _drive != reldrive)
+		path.insert(0, string(1, _drive) + ":");
+#endif
 	return single_slashes(path);
 }
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FilePath.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FixWord.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FixWord.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FixWord.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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,7 +621,7 @@
 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;
 }
 
 
@@ -628,7 +628,7 @@
 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 @@
 	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);}

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	double wl, wr, h, d;
 };
 
+class FontVisitor;
 
 /** Abstract base for all font classes. */
 class Font {
@@ -69,17 +70,19 @@
 		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 @@
 		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 @@
 		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 @@
 		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 @@
 	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 @@
 		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 @@
 };
 
 
+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) {}
 };

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 				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));
 			}
 		}
 	}

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontCache.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEncoding.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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::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 @@
 	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();

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontEngine.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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;

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		}
 		_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 @@
 	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 @@
 		}
 		_name2id[fontname] = newid;
 	}
-	_fonts.emplace_back(std::move(newfont));
+	_fonts.push_back(std::move(newfont));
 	_num2id[fontnum] = newid;
 	return newid;
 }
@@ -330,7 +328,7 @@
 			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

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontManager.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMap.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontMetrics.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	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);
 };
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontStyle.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontStyle.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontStyle.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 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;
 }
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/FontWriter.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 /** 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 @@
 }
 
 
-void GFGlyphTracer::reset (string &fname, double upp) {
+void GFGlyphTracer::reset (const string &fname, double upp) {
 	if (_callback)
 		_callback->setFont(fname);
 	if (_ifs.is_open())

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFGlyphTracer.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 
 	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;

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	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);

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFReader.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GFTracer.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 /** 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 @@
 
 
 /** 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);

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Ghostscript.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		~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);

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Glyph.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Glyph.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Glyph.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GlyphTracerMessages.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GlyphTracerMessages.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GlyphTracerMessages.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GraphicsPath.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GraphicsPath.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/GraphicsPath.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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,12 +663,7 @@
 		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). */
@@ -674,12 +670,7 @@
 		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.

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HashFunction.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HtmlSpecialHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 			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,7 +148,7 @@
 	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();
@@ -155,7 +155,7 @@
 			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 @@
 				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 @@
 		// 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));
 		}
 	}

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/HyperlinkManager.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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);

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ImageToSVG.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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);}

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputBuffer.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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,7 @@
 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;
@@ -46,6 +47,7 @@
 		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 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 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 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;

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	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);
 }
 
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/JFM.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	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);}
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Length.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MD5HashFunction.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MD5HashFunction.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MD5HashFunction.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.am
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.am	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.am	2022-01-21 17:25:16 UTC (rev 61679)
@@ -1,5 +1,5 @@
 ## This file is part of dvisvgm
-## Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking at uos.de>
+## Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>
 ##
 ## Process this file with automake.
 
@@ -110,6 +110,7 @@
 	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 @@
 	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 \

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.in
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.in	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Makefile.in	2022-01-21 17:25:16 UTC (rev 61679)
@@ -178,29 +178,30 @@
 	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 @@
 	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 @@
 	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 @@
 	./$(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 @@
 	./$(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 @@
 	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 @@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Message.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/MetafontWrapper.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/NoPsSpecialHandler.Po at am__quote@ # am--include-marker
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Opacity.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/PDFParser.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/PSInterpreter.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/PSPattern.Po at am__quote@ # am--include-marker
@@ -854,6 +858,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/SVGCharHandlerFactory.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/SVGCharPathHandler.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/SVGCharTspanTextHandler.Po at am__quote@ # am--include-marker
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/SVGElement.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/SVGOutput.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/SVGSingleCharTextHandler.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/SVGTree.Po at am__quote@ # am--include-marker
@@ -1195,6 +1200,7 @@
 	-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 @@
 	-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 @@
 	-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 @@
 	-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

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MapLine.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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) {

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Matrix.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	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);

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 					_col++;
 			}
 			_nl = false;
-			if (!_nl || c != '\n')
+			if (c != '\n')
 				os << c;
 	}
 }

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Message.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MessageException.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MessageException.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MessageException.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/MiKTeXCom.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/NoPsSpecialHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/NumericRanges.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/NumericRanges.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/NumericRanges.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Added: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.cpp	                        (rev 0)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.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


Property changes on: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.hpp	                        (rev 0)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Opacity.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.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

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFParser.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFToSVG.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFToSVG.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFToSVG.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSFilter.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSFilter.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSFilter.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 			// 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 @@
 	// 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 @@
 		{"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 @@
 		{"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 @@
 				_rawData.clear();
 				in.skipSpace();
 				while (!in.eof()) {
-					_rawData.emplace_back(in.getString());
+					_rawData.push_back(in.getString());
 					in.skipSpace();
 				}
 			}
@@ -320,7 +322,7 @@
 				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();
 					}
 				}
@@ -327,7 +329,7 @@
 				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 @@
 		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();

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSInterpreter.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	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 @@
 	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 @@
 		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);

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
  *  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;
 }
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPattern.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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,7 +56,9 @@
 	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);
 		std::unique_ptr<XMLElement> createPatternNode () const override;
@@ -82,7 +86,7 @@
 	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:

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PSPreviewFilter.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageRanges.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PageSize.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Pair.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Pair.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Pair.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		if (!_pageSizes.empty() && _pageSizes.back().first == pageno)
 			_pageSizes.back().second = whpair;
 		else
-			_pageSizes.emplace_back(PageSize(pageno, whpair));
+			_pageSizes.emplace_back(pageno, whpair);
 	}
 }
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PapersizeSpecialHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PathClipper.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 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)+

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PdfSpecialHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PreScanDVIReader.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Process.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	_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 @@
 	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,7 +365,6 @@
 		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);
@@ -373,9 +371,9 @@
 		_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 @@
 
 
 /** 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 @@
  *  @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 @@
 	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 @@
 		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 at beginspecial @setspecial"            // enter special environment
@@ -556,9 +554,8 @@
 	_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,17 +610,40 @@
 }
 
 
-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);
+}
+
+
 /** Draws the current path recorded by previously executed path commands (moveto, lineto,...).
  *  @param[in] p not used */
 void PsSpecialHandler::stroke (vector<double> &p) {
@@ -639,7 +659,7 @@
 	}
 	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
@@ -646,11 +666,11 @@
 			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 @@
 
 		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 @@
  *  @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 @@
 
 	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 @@
 
 		// 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 @@
 	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 @@
 			_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 @@
 	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 @@
 		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 @@
  *  @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,7 +1083,7 @@
 		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));
@@ -1094,7 +1090,7 @@
 			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 @@
 			// 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;
 };
 
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/PsSpecialHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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 @@
 		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 @@
 		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 @@
 		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

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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,7 +82,7 @@
 
 	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();
@@ -89,7 +89,7 @@
 		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))

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/RangeMap.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 /** 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 @@
 /** 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 @@
 	}
 	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;
 }

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 			}
 		}
 
-		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 XMLElement;
+class SVGElement;
 
 
 /** Base class for all character handlers. These handlers create SVG representations
@@ -60,28 +64,31 @@
 	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
@@ -88,8 +95,8 @@
 		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 @@
 		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;

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharHandlerFactory.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	// 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 @@
 		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,12 +110,12 @@
 
 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));
 }
 
@@ -121,16 +122,15 @@
 
 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));
 	}
 }

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	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
 };
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	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 @@
 	// 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::setInitialContextNode (XMLElement *node) {
+void SVGCharTspanTextHandler::setInitialContextNode (SVGElement *node) {
 	SVGCharHandler::setInitialContextNode(node);
 	_textNode = _tspanNode = nullptr;
 	_xchanged = _ychanged = false;

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharTspanTextHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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,7 +29,7 @@
 		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;
@@ -36,8 +36,8 @@
 
 	private:
 		bool _xchanged, _ychanged;
-		XMLElement *_textNode;
-		XMLElement *_tspanNode;
+		SVGElement *_textNode;
+		SVGElement *_tspanNode;
 };
 
 #endif

Added: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.cpp	                        (rev 0)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.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());
+}


Property changes on: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.hpp	                        (rev 0)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGElement.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.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

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 					}
 					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);

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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 @@
 		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;
 };

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	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));
 }

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGSingleCharTextHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 /** 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 @@
 /** 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::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::transformPage (const Matrix &usermatrix) {
-	if (!usermatrix.isIdentity())
-		_page->addAttribute("transform", usermatrix.toSVG());
+	_page->setTransform(usermatrix);
 }
 
 
@@ -171,8 +169,8 @@
 		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 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 @@
 	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 @@
 			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::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 @@
 
 
 /** 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

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGTree.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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 @@
 
 	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

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ShadingPatch.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SignalHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SourceInput.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialActions.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialActions.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialActions.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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 @@
 		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;}

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamReader.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/StreamWriter.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 			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);

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Subfont.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/System.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/System.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/System.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/System.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/System.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/System.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TTFAutohint.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
  *  @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 @@
  *  @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 @@
  *  @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::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))

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TensorProductPatch.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Terminal.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ToUnicodeMap.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
  *  @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 @@
  *  @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 @@
 		}
 		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 @@
 				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 @@
 	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 @@
 				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 @@
 		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

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TpicSpecialHandler.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 
 
 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::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))

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TriangularPatch.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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 @@
 		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);

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/TrueTypeFont.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/Unicode.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VFActions.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VFActions.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VFActions.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VFReader.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorIterator.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorIterator.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorIterator.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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;}
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorStream.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorStream.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/VectorStream.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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));
 	}
 }
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLDocument.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	if (Attribute *attr = getAttribute(name))
 		attr->value = value;
 	else
-		_attributes.emplace_back(Attribute(name, value));
+		_attributes.emplace_back(name, value);
 }
 
 
@@ -387,12 +387,12 @@
 		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';
 			}
 		}

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLNode.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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);

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XMLString.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XXHashFunction.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XXHashFunction.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/XXHashFunction.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ZLibOutputStream.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ZLibOutputStream.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ZLibOutputStream.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/dvisvgm.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/dvisvgm.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/dvisvgm.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 
 	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 @@
 		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 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 @@
 			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';

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.c
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.c	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.c	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/ffwrapper.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/macros.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/macros.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/macros.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/AttributeExtractor.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/DependencyGraph.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/DependencyGraph.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/DependencyGraph.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 
 /** 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 @@
 	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 @@
 			}
 		}
 	}
+	if (depth == 0 && COMBINE_TRANSFORMS && _transformCombined) {
+		TransformSimplifier().execute(context);
+		_transformCombined = false;
+	}
 }
 
 
@@ -107,13 +114,16 @@
  *  @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");
 		}

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/GroupCollapser.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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
 };

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/OptimizerModule.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/OptimizerModule.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/OptimizerModule.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/RedundantElementRemover.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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,16 +51,22 @@
 		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());
+			}
+		}
 	}
 }
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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 @@
 		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())

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TextSimplifier.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/TransformSimplifier.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/WSNodeRemover.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/options.dtd
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/options.dtd	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/options.dtd	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/options.xml
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/options.xml	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/options.xml	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 at uos.de></copyright>
+		<copyright>Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de></copyright>
 	</program>
 	<options>
 		<section title="Input options">

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/psdefs.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/psdefs.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/psdefs.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 "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 ";
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 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();
 			}
 		}

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/utility.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
     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

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/version.hpp.in
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/version.hpp.in	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/version.hpp.in	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/windows.hpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/windows.hpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/src/windows.hpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/BezierTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/BezierTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/BezierTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/BitmapTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/BitmapTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/BitmapTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/BoundingBoxTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/BoundingBoxTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/BoundingBoxTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapManagerTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapManagerTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapManagerTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapReaderTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapReaderTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapReaderTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CMapTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CalculatorTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CalculatorTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CalculatorTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorSpecialTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorSpecialTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorSpecialTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ColorTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CommandLineTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CommandLineTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/CommandLineTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DVIReaderTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DVIReaderTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DVIReaderTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DependencyGraphTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DependencyGraphTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DependencyGraphTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DirectoryTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DirectoryTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DirectoryTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DvisvgmSpecialTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DvisvgmSpecialTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/DvisvgmSpecialTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/EllipticalArcTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/EllipticalArcTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/EllipticalArcTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/EmSpecialTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/EmSpecialTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/EmSpecialTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	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 @@
 	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,7 +168,7 @@
 	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));
@@ -175,7 +175,7 @@
 	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>");
 }
 
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileFinderTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileFinderTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileFinderTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FilePathTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FilePathTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FilePathTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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,6 +90,13 @@
 }
 
 
+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");
@@ -96,10 +103,14 @@
 	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);
 }

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileSystemTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileSystemTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FileSystemTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontCacheTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontCacheTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontCacheTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontManagerTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontManagerTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontManagerTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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,6 +23,11 @@
 #include "Font.hpp"
 #include "FontManager.hpp"
 
+#ifndef SRCDIR
+#define SRCDIR "."
+#endif
+
+
 class FontManagerTest : public ::testing::Test {
 	public:
 		FontManagerTest () : fm(FontManager::instance()) {
@@ -29,10 +34,12 @@
 			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 @@
 	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 @@
 	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 @@
 	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));
 }
-

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontMapTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontMapTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontMapTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFGlyphTracerTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFGlyphTracerTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFGlyphTracerTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFReaderTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFReaderTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GFReaderTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GhostscriptTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GhostscriptTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GhostscriptTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GraphicsPathTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GraphicsPathTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/GraphicsPathTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/HashFunctionTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/HashFunctionTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/HashFunctionTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/JFMReaderTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/JFMReaderTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/JFMReaderTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/LengthTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/LengthTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/LengthTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.am
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.am	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.am	2022-01-21 17:25:16 UTC (rev 61679)
@@ -1,5 +1,5 @@
 ## This file is part of dvisvgm
-## Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking at uos.de>
+## Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>
 ##
 ## Process this file with automake.
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.in
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.in	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/Makefile.in	2022-01-21 17:25:16 UTC (rev 61679)
@@ -999,6 +999,7 @@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/MapLineTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/MapLineTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/MapLineTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/MatrixTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/MatrixTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/MatrixTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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, 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;

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/MessageExceptionTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/MessageExceptionTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/MessageExceptionTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PDFParserTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PDFParserTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PDFParserTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PSInterpreterTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PSInterpreterTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PSInterpreterTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 		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 @@
 		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 @@
 	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 @@
 	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;");
 }
 
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageRagesTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageRagesTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageRagesTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageSizeTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageSizeTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PageSizeTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PairTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PairTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PairTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PapersizeSpecialTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PapersizeSpecialTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/PapersizeSpecialTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/RangeMapTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/RangeMapTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/RangeMapTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SVGOutputTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SVGOutputTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SVGOutputTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ShadingPatchTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ShadingPatchTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ShadingPatchTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SpecialManagerTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SpecialManagerTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SpecialManagerTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SplittedCharInputBufferTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SplittedCharInputBufferTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SplittedCharInputBufferTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamInputBufferTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamInputBufferTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamInputBufferTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamReaderTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamReaderTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamReaderTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamWriterTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamWriterTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StreamWriterTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StringMatcherTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StringMatcherTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/StringMatcherTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SubfontTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SubfontTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/SubfontTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TFMReaderTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TFMReaderTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TFMReaderTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TensorProductPatchTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TensorProductPatchTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TensorProductPatchTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ToUnicodeMapTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ToUnicodeMapTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/ToUnicodeMapTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TpicSpecialTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TpicSpecialTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TpicSpecialTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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 @@
 	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 @@
 	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 @@
 	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 @@
 	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 @@
 	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 @@
 	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 @@
 	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 @@
 	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 @@
 	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 @@
 	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_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 @@
 	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, 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'/>"
 	);
 }
 

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TriangularPatchTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TriangularPatchTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/TriangularPatchTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/UnicodeTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/UnicodeTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/UnicodeTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/UtilityTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/UtilityTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/UtilityTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.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,7 +91,7 @@
 	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);
 	}
 
@@ -98,7 +98,7 @@
 	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);
 	}
 }

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorIteratorTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorIteratorTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorIteratorTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorStreamTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorStreamTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/VectorStreamTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLNodeTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLNodeTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLNodeTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLStringTest.cpp
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLStringTest.cpp	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/XMLStringTest.cpp	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>   **
+** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking at uos.de>   **
 **                                                                      **
 ** This program is free software; you can redistribute it and/or        **
 ** modify it under the terms of the GNU General Public License as       **

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/check-conv
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/check-conv	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/check-conv	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>
+# Copyright (C) 2009-2022 Martin Gieseking <martin.gieseking at uos.de>
 
 
 files=(sample frktest)

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.am
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.am	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.am	2022-01-21 17:25:16 UTC (rev 61679)
@@ -1,5 +1,5 @@
 ## This file is part of dvisvgm
-## Copyright (C) 2016-2021 Martin Gieseking <martin.gieseking at uos.de>
+## Copyright (C) 2016-2022 Martin Gieseking <martin.gieseking at uos.de>
 ##
 ## Process this file with automake.
 
@@ -13,6 +13,7 @@
 	frktest.dvi \
 	frktest-nf-cmp.svg \
 	frktest-wf-cmp.svg \
+	lmmono12-regular.otf \
 	sample.dvi \
 	sample-nf-cmp.svg \
 	sample.sfd \

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.in
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.in	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/Makefile.in	2022-01-21 17:25:16 UTC (rev 61679)
@@ -271,6 +271,7 @@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -293,6 +294,7 @@
 	frktest.dvi \
 	frktest-nf-cmp.svg \
 	frktest-wf-cmp.svg \
+	lmmono12-regular.otf \
 	sample.dvi \
 	sample-nf-cmp.svg \
 	sample.sfd \

Added: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/lmmono12-regular.otf
===================================================================
(Binary files differ)

Index: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/lmmono12-regular.otf
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/lmmono12-regular.otf	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/lmmono12-regular.otf	2022-01-21 17:25:16 UTC (rev 61679)

Property changes on: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/data/lmmono12-regular.otf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/vnd.ms-opentype
\ No newline at end of property
Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/genhashcheck.py
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/genhashcheck.py	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/genhashcheck.py	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 at uos.de>
+# Copyright (C) 2016-2022 Martin Gieseking <martin.gieseking at uos.de>
 
 import re
 import sys

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-death-test.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-death-test.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-death-test.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 @@
 //
 //   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 @@
 //   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 @@
 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 @@
 
 }  // namespace testing
 
-#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-matchers.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-matchers.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-matchers.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_
+#define GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_
 
-#ifndef GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_
-#define GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_
-
+#include <atomic>
 #include <memory>
 #include <ostream>
 #include <string>
@@ -63,20 +60,16 @@
 namespace testing {
 
 // To implement a matcher Foo for type T, define:
-//   1. a class FooMatcherImpl that implements the
-//      MatcherInterface<T> interface, and
+//   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
-//      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.
+//      FooMatcherMatcher.
 
-// MatchResultListener is an abstract class.  Its << operator can be
-// used by a matcher to explain why a value matches or doesn't match.
-//
 class MatchResultListener {
  public:
   // Creates a listener object with the given underlying ostream.  The
@@ -113,7 +106,7 @@
 
 // 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 @@
 
 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 @@
   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 @@
   }
 
   // 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 @@
   // 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);
+  }
 
-  MatcherBase(const MatcherBase&) = default;
-  MatcherBase& operator=(const MatcherBase&) = default;
-  MatcherBase(MatcherBase&&) = default;
-  MatcherBase& operator=(MatcherBase&&) = default;
+  template <typename M, typename = typename std::remove_reference<
+                            M>::type::is_gtest_matcher>
+  MatcherBase(M&& m) {  // NOLINT
+    Init(std::forward<M>(m));
+  }
 
-  virtual ~MatcherBase() {}
+  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(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;
+  }
+
+  ~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 @@
           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 @@
   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 @@
   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,19 +552,25 @@
   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.
   Matcher(const std::string& s);  // NOLINT
@@ -404,21 +578,26 @@
   // 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.
   Matcher(const std::string& s);  // NOLINT
@@ -426,10 +605,10 @@
   // 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 @@
    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 @@
 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; }
+  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);
-    }
-
-   private:
-    Rhs rhs_;
-  };
   Rhs rhs_;
 };
 
@@ -612,6 +786,10 @@
   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 @@
   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 @@
     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 @@
     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 @@
 
 GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251 5046
 
-#endif  // GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_
+#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-message.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-message.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-message.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 @@
 
 GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251
 
-#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-param-test.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-param-test.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-param-test.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -30,13 +30,10 @@
 // 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 @@
 //     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,7 +411,7 @@
       : public test_suite_name {                                               \
    public:                                                                     \
     GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {}                    \
-    virtual void TestBody();                                                   \
+    void TestBody() override;                                                  \
                                                                                \
    private:                                                                    \
     static int AddToRegistry() {                                               \
@@ -423,12 +418,13 @@
       ::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 @@
           ::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, &gtest_##prefix##test_suite_name##_EvalGenerator_, \
+                  GTEST_STRINGIFY_(prefix),                                   \
+                  &gtest_##prefix##test_suite_name##_EvalGenerator_,          \
                   &gtest_##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 @@
 
 }  // namespace testing
 
-#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-printers.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-printers.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-printers.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 @@
   }
 };
 
-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,113 +244,74 @@
   // 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(internal::BiggestInt value, ::std::ostream* os) {
+    *os << value;
+  }
+};
+
+struct ConvertibleToStringViewPrinter {
+#if GTEST_INTERNAL_HAS_STRING_VIEW
+  static void PrintValue(internal::StringView value, ::std::ostream* os) {
+    internal::UniversalPrint(value, os);
+  }
+#endif
+};
+
+
+// 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) {
-    const internal::BiggestInt kBigInt = value;
-    *os << kBigInt;
+    PrintBytesInObjectTo(
+        static_cast<const unsigned char*>(
+            // Load bearing cast to void* to support iOS
+            reinterpret_cast<const void*>(std::addressof(value))),
+        sizeof(value), os);
   }
 };
 
-#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);
+struct FallbackPrinter {
+  template <typename T>
+  static void PrintValue(const T&, ::std::ostream* os) {
+    *os << "(incomplete type)";
+  }
 };
-#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
-                                         :
-#endif
-                                         kOtherType)>::PrintValue(x, &os);
-  return os;
-}
+// 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 internal2
-}  // namespace testing
+template <typename T, typename Printer, typename... Printers>
+struct FindFirstPrinter<
+    T, decltype(Printer::PrintValue(std::declval<const T&>(), nullptr)),
+    Printer, Printers...> {
+  using type = Printer;
+};
 
-// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
-// magic needed for implementing UniversalPrinter won't work.
-namespace testing_internal {
-
-// Used to print a value that is not an STL-style container when the
-// user doesn't define PrintTo() for it.
+// 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 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
-
-  // 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;
+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);
 }
 
-}  // namespace testing_internal
-
-namespace testing {
-namespace internal {
-
 // FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
 // value of type ToPrint that is an operand of a comparison assertion
 // (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in
@@ -340,6 +360,14 @@
 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_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 @@
 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 @@
 // 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 @@
 // 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(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 @@
   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 @@
 }
 #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 @@
   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 @@
   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> {};
 
-// Printer for absl::optional
+#if GTEST_INTERNAL_HAS_ANY
 
+// Printer for std::any / absl::any
+
+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 @@
   }
 };
 
-// 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 @@
   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 @@
 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,13 +891,56 @@
   }
 };
 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 <>
 class UniversalTersePrinter<const wchar_t*> {
@@ -901,17 +1012,7 @@
 
 }  // 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;
   internal::UniversalTersePrinter<T>::Print(value, &ss);
@@ -925,4 +1026,4 @@
 // 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_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-spi.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-spi.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-spi.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 @@
     }\
   } while (::testing::internal::AlwaysFalse())
 
-#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-test-part.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-test-part.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-test-part.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 @@
 
 GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251
 
-#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-typed-test.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-typed-test.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest-typed-test.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 @@
 
 #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,13 +186,15 @@
 #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_> {                                   \
@@ -201,11 +201,10 @@
    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 @@
               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 @@
   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 @@
      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 @@
 #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__),   \
-                   &GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName), #SuiteName, \
+                   &GTEST_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
 #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_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 @@
 // 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 @@
 // 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 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 @@
   // 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 @@
       = 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 @@
   // 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 @@
 
   // 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 @@
   // 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 @@
   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 @@
   // 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 @@
   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 @@
   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 @@
 // 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 @@
   } 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 @@
   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 @@
 // 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 @@
 // 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 @@
 // 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 @@
 //   }
 //
 // 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 @@
 
 GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251
 
-#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
+#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_H_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_pred_impl.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_pred_impl.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_pred_impl.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 @@
 
 }  // namespace testing
 
-#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+#endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_prod.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_prod.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/gtest_prod.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-port.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-port.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-port.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-printers.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-printers.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest-printers.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/custom/gtest.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-death-test-internal.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-death-test-internal.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-death-test-internal.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 @@
 }  // namespace internal
 }  // namespace testing
 
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+#endif  // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-filepath.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-filepath.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-filepath.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 @@
 
   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 @@
 
 GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251
 
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+#endif  // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-internal.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-internal.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-internal.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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 @@
   //
   // 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 @@
 
   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 @@
         << 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 @@
         << 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 @@
 //
 // 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 @@
 // 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 @@
   // 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 @@
 };
 
 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 @@
 
 // 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 @@
   }
 };
 
+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 @@
                        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 @@
 
 // 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 @@
   }
 };
 
-#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 @@
   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 @@
 // 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,13 +888,35 @@
 #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
 // will be viable (since both C::iterator* and C::const_iterator* are
@@ -1092,8 +1151,6 @@
   const Element* array_;
   size_t size_;
   void (NativeArray::*clone_)(const Element*, size_t);
-
-  GTEST_DISALLOW_ASSIGN_(NativeArray);
 };
 
 // Backport of std::index_sequence.
@@ -1117,33 +1174,45 @@
 // 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<> {};
 
-// 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 <size_t N>
+using MakeIndexSequence = typename MakeIndexSequenceImpl<N>::type;
 
-template <typename T, size_t I>
-struct ElemFromListImpl<T, I, I> {
-  using type = T;
+template <typename... T>
+using IndexSequenceFor = typename MakeIndexSequence<sizeof...(T)>::type;
+
+template <size_t>
+struct Ignore {
+  Ignore(...);  // NOLINT
 };
 
-// Get the Nth element from T...
-// It uses O(1) instantiation depth.
-template <size_t N, typename I, typename... T>
-struct ElemFromList;
+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 (*)(), ...);
+};
 
-template <size_t N, size_t... I, typename... T>
-struct ElemFromList<N, IndexSequence<I...>, T...>
-    : ElemFromListImpl<T, N, I>... {};
+template <size_t N, typename... T>
+struct ElemFromList {
+  using type =
+      decltype(ElemFromListImpl<typename MakeIndexSequence<N>::type>::Apply(
+          static_cast<T (*)()>(nullptr)...));
+};
 
+struct FlatTupleConstructTag {};
+
 template <typename... T>
 class FlatTuple;
 
@@ -1152,11 +1221,11 @@
 
 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 @@
     : 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 @@
 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 <typename... Args>
+  explicit FlatTuple(FlatTupleConstructTag tag, Args&&... args)
+      : FlatTuple::FlatTupleBase(tag, std::forward<Args>(args)...) {}
 
-  template <size_t I>
-  const typename ElemFromList<I, Indices, T...>::type& Get() const {
-    return static_cast<const FlatTupleElemBase<FlatTuple, I>*>(this)->value;
-  }
-
-  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 @@
 }  // 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 @@
 // 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 @@
 
 // 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 @@
   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 @@
               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_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-param-util.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-param-util.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-param-util.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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,6 +42,7 @@
 #include <memory>
 #include <set>
 #include <tuple>
+#include <type_traits>
 #include <utility>
 #include <vector>
 
@@ -48,6 +49,7 @@
 #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 @@
 
   // 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 @@
 
 // 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 @@
                                       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 @@
   // 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 @@
     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 @@
         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 @@
           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 @@
         }  // 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 @@
   // 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 @@
 
     // 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 @@
   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 @@
 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 @@
   FlatTuple<Ts...> v_;
 };
 
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
 template <typename... T>
 class CartesianProductGenerator
     : public ParamGeneratorInterface<::std::tuple<T...>> {
@@ -880,4 +944,4 @@
 }  // namespace internal
 }  // namespace testing
 
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+#endif  // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port-arch.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port-arch.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port-arch.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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_

Modified: trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port.h
===================================================================
--- trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port.h	2022-01-21 12:15:59 UTC (rev 61678)
+++ trunk/Build/source/texk/dvisvgm/dvisvgm-src/tests/gtest/include/gtest/internal/gtest-port.h	2022-01-21 17:25:16 UTC (rev 61679)
@@ -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/custom/gtest-port.h"
 #include "gtest/internal/gtest-port-arch.h"
-#include "gtest/internal/custom/gtest-port.h"
 
 #if !defined(GTEST_DEV_EMAIL_)
 # define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
@@ -344,6 +359,10 @@
 // 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

@@ Diff output truncated at 1234567 characters. @@


More information about the tex-live-commits mailing list.