summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.cpp')
-rw-r--r--Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.cpp157
1 files changed, 0 insertions, 157 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.cpp
deleted file mode 100644
index 7788bef3d9c..00000000000
--- a/Build/source/texk/dvisvgm/dvisvgm-src/src/MetafontWrapper.cpp
+++ /dev/null
@@ -1,157 +0,0 @@
-/*************************************************************************
-** MetafontWrapper.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 <cctype>
-#include <fstream>
-#include <sstream>
-#include "FileSystem.hpp"
-#include "FileFinder.hpp"
-#include "Message.hpp"
-#include "MetafontWrapper.hpp"
-#include "Process.hpp"
-#include "XMLString.hpp"
-
-using namespace std;
-
-
-MetafontWrapper::MetafontWrapper (string fname, string dir)
- : _fontname(std::move(fname)), _dir(std::move(dir))
-{
- // ensure that folder paths ends with slash
- if (_dir.empty())
- _dir = "./";
- else if (_dir != "/" && _dir.back() != '/')
- _dir += '/';
-}
-
-
-/** Calls Metafont and evaluates the logfile. If a gf file was successfully
- * generated the dpi value is stripped from the filename
- * (e.g. cmr10.600gf => cmr10.gf). This makes life easier...
- * @param[in] mode Metafont mode, e.g. "ljfour"
- * @param[in] mag magnification factor
- * @return true on success */
-bool MetafontWrapper::call (const string &mode, double mag) {
- if (!FileFinder::instance().lookup(_fontname+".mf"))
- return false; // mf file not available => no need to call the "slow" Metafont
- FileSystem::remove(_fontname+".gf");
-
- string mfName = "mf"; // file name of Metafont executable
-#ifndef MIKTEX
- if (const char *mfnowinPath = FileFinder::instance().lookupExecutable("mf-nowin", true))
- mfName = mfnowinPath;
- else
-#endif
- if (const char *mfPath = FileFinder::instance().lookupExecutable(mfName, true))
- mfName = mfPath;
-#ifdef _WIN32
- else {
- Message::estream(true) << "can't run Metafont (mf.exe and mf-nowin.exe not found)\n";
- return false;
- }
-#endif
- ostringstream oss;
- oss << "\"\\mode=" << mode << ";" // set MF mode, e.g. 'proof', 'ljfour' or 'localfont'
- "mode_setup;" // initialize MF variables
- "mag:=" << mag << ";" // set magnification factor
- "show pixels_per_inch*mag;" // print character resolution to stdout
- "batchmode;" // don't halt on errors and don't print informational messages
- "input " << _fontname << "\""; // load font description
- Message::mstream(false, Message::MC_STATE) << "\nrunning Metafont for " << _fontname << '\n';
- Process mf_process(mfName, oss.str());
- string mf_messages;
- mf_process.run(_dir, &mf_messages);
-
- int resolution = getResolution(mf_messages);
-
- // compose expected name of GF file (see Metafont Book, p. 324)
- string gfname = _dir + _fontname + ".";
- if (resolution > 0)
- gfname += XMLString(resolution);
- gfname += "gf";
- FileSystem::rename(gfname, _dir+_fontname+".gf"); // remove resolution value from filename
- return FileSystem::exists(_dir+_fontname+".gf");
-}
-
-
-/** Returns the resolution applied to a GF file generated by Metafont. Since the resolution
- * is part of the filename suffix, we need this value in order to address the file.
- * @param[in] mfMessage output written to stdout by Metafont
- * @return the resolution (>0 on success, 0 otherwise) */
-int MetafontWrapper::getResolution (const string &mfMessage) const {
- int res = 0;
- char buf[256];
- if (!mfMessage.empty()) {
- // try get resolution value written to stdout by above MF command
- istringstream iss(mfMessage);
- while (iss) {
- iss.getline(buf, sizeof(buf));
- string line = buf;
- if (line.substr(0, 3) == ">> ") {
- res = stoi(line.substr(3));
- break;
- }
- }
- }
- // couldn't read resolution from stdout, try to get it from log file
- if (res == 0) {
- ifstream ifs(_dir+_fontname+".log");
- while (ifs) {
- ifs.getline(buf, sizeof(buf));
- string line = buf;
- if (line.substr(0, 18) == "Output written on ") {
- line = line.substr(18);
- size_t pos = line.find(' ');
- line = line.substr(0, pos);
- pos = line.rfind('.');
- if (pos != string::npos && line.substr(line.length()-2) == "gf") {
- line.pop_back();
- line.pop_back();
- try {
- res = stoi(line.substr(pos+1));
- }
- catch (...) {
- }
- }
- }
- }
- }
- return res;
-}
-
-
-/** Calls Metafont if output files (tfm and gf) don't already exist.
- * @param[in] mode Metafont mode to be used (e.g. 'ljfour')
- * @param[in] mag magnification factor
- * @return true on success */
-bool MetafontWrapper::make (const string &mode, double mag) {
- ifstream tfm(_dir+_fontname+".tfm");
- ifstream gf(_dir+_fontname+".gf");
- if (gf && tfm) // @@ distinguish between gf and tfm
- return true;
- return call(mode, mag);
-}
-
-
-bool MetafontWrapper::success () const {
- ifstream tfm(_dir+_fontname+".tfm");
- ifstream gf(_dir+_fontname+".gf");
- return tfm && gf;
-}