summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2024-01-16 18:32:08 +0000
committerKarl Berry <karl@freefriends.org>2024-01-16 18:32:08 +0000
commit84b532c711d3e644d6ba05e8118356310fd68fbf (patch)
tree33d34c031bb6342b29a3801d2cc1f9208f637920 /Build/source/texk/dvisvgm/dvisvgm-src/src/optimizer/SVGOptimizer.cpp
parent32d816973b284f3e5a0bd28a7ad5ef73e3102b34 (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.cpp70
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();