summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.cpp')
-rw-r--r--Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.cpp136
1 files changed, 0 insertions, 136 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.cpp
deleted file mode 100644
index 02f83e8c999..00000000000
--- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGCharPathHandler.cpp
+++ /dev/null
@@ -1,136 +0,0 @@
-/*************************************************************************
-** SVGCharPathHandler.cpp **
-** **
-** This file is part of dvisvgm -- a fast DVI to SVG converter **
-** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.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 "Font.hpp"
-#include "FontManager.hpp"
-#include "SVGCharPathHandler.hpp"
-#include "utility.hpp"
-#include "XMLNode.hpp"
-
-using namespace std;
-
-/** Constructs a new path builder.
- * @param[in] createUseElements determines whether to create "use" elements to reference previous paths or not
- * @param[in] relativePathCommands determines whether to create relative or absolute SVG path commands */
-SVGCharPathHandler::SVGCharPathHandler (bool createUseElements, bool relativePathCommands)
- : _relativePathCommands(relativePathCommands)
-{
- if (createUseElements)
- _appendChar = &SVGCharPathHandler::appendUseElement;
- else
- _appendChar = &SVGCharPathHandler::appendPathElement;
-}
-
-
-void SVGCharPathHandler::resetContextNode () {
- SVGCharHandler::resetContextNode();
- _groupNode = nullptr;
-}
-
-
-/** Appends the path representation of a single character to the context element.
- * @param[in] c code of the character to be appended
- * @param[in] x horizontal position of the character (in bp units)
- * @param[in] y vertical position of the character (in bp units) */
-void SVGCharPathHandler::appendChar (uint32_t c, double x, double y) {
- if (_font.changed()) {
- _fontColor.set(_font.get()->color());
- if (_fontColor.changed() && _fontColor.get() != Color::BLACK)
- _color.changed(true); // ensure application of text color when resetting the font color to black
- _font.changed(false);
- }
- // 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.
- CharProperty<Color> &color = (_fontColor.get() != Color::BLACK) ? _fontColor : _color;
- bool applyColor = color.get() != Color::BLACK;
- bool applyMatrix = !_matrix.get().isIdentity();
- if (!_groupNode) {
- color.changed(applyColor);
- _matrix.changed(applyMatrix);
- }
- if (color.changed() || _matrix.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());
- }
- color.changed(false);
- _matrix.changed(false);
- }
- const Font *font = _font.get();
- if (font->verticalLayout()) {
- // move glyph graphics so that its origin is located at the top center position
- GlyphMetrics metrics;
- font->getGlyphMetrics(c, _vertical, metrics);
- x -= metrics.wl;
- if (auto pf = dynamic_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);
- y += exact_metrics.h+(metrics.d-exact_metrics.h-exact_metrics.d)/2;
- }
- else
- y += metrics.d;
- }
- Matrix rotation(1);
- if (_vertical && !font->verticalLayout()) {
- // alphabetic text designed for horizontal mode
- // must be rotated by 90 degrees if in vertical mode
- rotation.translate(-x, -y);
- rotation.rotate(90);
- rotation.translate(x, y);
- }
- (this->*_appendChar)(c, x, y, rotation);
-}
-
-
-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));
- useNode->addAttribute("xlink:href", id);
- if (!matrix.isIdentity())
- useNode->addAttribute("transform", matrix.toSVG());
- contextNode()->append(std::move(useNode));
-}
-
-
-void SVGCharPathHandler::appendPathElement (uint32_t c, double x, double y, const Matrix &matrix) {
- Glyph glyph;
- auto pf = dynamic_cast<const PhysicalFont*>(_font.get());
- if (pf && pf->getGlyph(c, glyph)) {
- 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");
- glyphNode->addAttribute("d", oss.str());
- if (!matrix.isIdentity())
- glyphNode->addAttribute("transform", matrix.toSVG());
- contextNode()->append(std::move(glyphNode));
- }
-}