diff options
author | Karl Berry <karl@freefriends.org> | 2024-01-16 18:32:08 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2024-01-16 18:32:08 +0000 |
commit | 84b532c711d3e644d6ba05e8118356310fd68fbf (patch) | |
tree | 33d34c031bb6342b29a3801d2cc1f9208f637920 /Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp | |
parent | 32d816973b284f3e5a0bd28a7ad5ef73e3102b34 (diff) |
dvisvgm 3.2
git-svn-id: svn://tug.org/texlive/trunk@69453 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp')
-rw-r--r-- | Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp | 70 |
1 files changed, 45 insertions, 25 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp index d6a7f35bc43..402a83997f4 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp @@ -2,7 +2,7 @@ ** SVGOptimizer.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2023 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2024 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -21,6 +21,7 @@ #include <algorithm> #include <array> #include <map> +#include <set> #include "SVGOptimizer.hpp" #include "../SVGTree.hpp" @@ -30,7 +31,6 @@ #include "RedundantElementRemover.hpp" #include "TextSimplifier.hpp" #include "TransformSimplifier.hpp" -#include "WSNodeRemover.hpp" using namespace std; @@ -39,35 +39,53 @@ string SVGOptimizer::MODULE_SEQUENCE; SVGOptimizer::SVGOptimizer (SVGTree *svg) : _svg(svg) { // optimizer modules available to the user; must be listed in default order // _moduleEntries.emplace_back(ModuleEntry("remove-ws", util::make_unique<WSNodeRemover>())); - _moduleEntries.emplace_back(ModuleEntry("simplify-text", util::make_unique<TextSimplifier>())); - _moduleEntries.emplace_back(ModuleEntry("simplify-transform", util::make_unique<TransformSimplifier>())); - _moduleEntries.emplace_back(ModuleEntry("group-attributes", util::make_unique<AttributeExtractor>())); - _moduleEntries.emplace_back(ModuleEntry("collapse-groups", util::make_unique<GroupCollapser>())); - _moduleEntries.emplace_back(ModuleEntry("remove-clippaths", util::make_unique<RedundantElementRemover>())); - _moduleEntries.emplace_back(ModuleEntry("reassign-clippaths", util::make_unique<ClipPathReassigner>())); + _moduleEntries.emplace_back("simplify-text", util::make_unique<TextSimplifier>()); + _moduleEntries.emplace_back("simplify-transform", util::make_unique<TransformSimplifier>()); + _moduleEntries.emplace_back("group-attributes", util::make_unique<AttributeExtractor>()); + _moduleEntries.emplace_back("collapse-groups", util::make_unique<GroupCollapser>()); + _moduleEntries.emplace_back("remove-clippaths", util::make_unique<RedundantElementRemover>()); + _moduleEntries.emplace_back("reassign-clippaths", util::make_unique<ClipPathReassigner>()); } void SVGOptimizer::execute () { if (!_svg || MODULE_SEQUENCE == "none") return; - if (MODULE_SEQUENCE.empty()) - MODULE_SEQUENCE = "remove-clippath"; // default behaviour of previous dvisvgm releases + + vector<string> names = util::split(MODULE_SEQUENCE, ",", true); + set<string> removedNames; + if (names.empty()) + names.emplace_back("remove-clippaths"); // default behaviour of previous dvisvgm releases else { - if (MODULE_SEQUENCE == "all") { - for (const auto &entry: _moduleEntries) - entry.module->execute(_svg->defsNode(), _svg->pageNode()); + auto it = names.begin(); + if (*it == "all" || (!it->empty() && it->at(0) == '-')) { + if (*it == "all") + it = names.erase(it); + // add names of all optimizer modules + for (const auto &moduleEntry : _moduleEntries) { + it = names.insert(it, moduleEntry.modname); + ++it; + } + } + } + // create sequence of module names to be considered + for (auto it=names.begin(); it != names.end();) { + if ((*it)[0] == '-') { + removedNames.insert(it->substr(1)); + it = names.erase(it); } 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()); - } + if ((*it)[0] == '+') + *it = it->substr(1); + ++it; + } + } + GroupCollapser::COMBINE_TRANSFORMS = (find(names.begin(), names.end(), "simplify-transform") != names.end()); + // execute optimizer modules + for (const string &name: names) { + if (removedNames.find(name) == removedNames.end()) { + if (OptimizerModule *module = getModule(name)) + module->execute(_svg->defsNode(), _svg->pageNode()); } } } @@ -93,11 +111,13 @@ void SVGOptimizer::listModules (ostream &os) const { * @return true if all names are known */ bool SVGOptimizer::checkModuleString (string &namestr, vector<string> &unknownNames) const { unknownNames.clear(); - if (namestr.empty() || namestr == "all" || namestr == "none") + if (namestr.empty() || namestr == "none" || namestr == "all" || namestr.substr(0,4) == "all,") return true; vector<string> givenNames = util::split(namestr, ","); - for (const string &name : givenNames) { - if (!getModule(name)) + for (string name : givenNames) { + if (name[0] == '-' || name[0] == '+') + name = name.substr(1); + if (!name.empty() && !getModule(name)) unknownNames.emplace_back(name); } return unknownNames.empty(); |