diff options
Diffstat (limited to 'kdvi/fontMap.cpp')
-rw-r--r-- | kdvi/fontMap.cpp | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/kdvi/fontMap.cpp b/kdvi/fontMap.cpp new file mode 100644 index 00000000..cf5fa841 --- /dev/null +++ b/kdvi/fontMap.cpp @@ -0,0 +1,159 @@ +// fontMap.cpp +// +// Part of KDVI - A DVI previewer for the KDE desktop environemt +// +// (C) 2003 Stefan Kebekus +// Distributed under the GPL + +#include <config.h> +#ifdef HAVE_FREETYPE + +#include <kdebug.h> +#include <kprocio.h> +#include <qfile.h> + +#include "fontMap.h" + +//#define DEBUG_FONTMAP + +fontMap::fontMap() +{ + // Read the map file of ps2pk which will provide us with a + // dictionary "TeX Font names" <-> "Name of font files, Font Names + // and Encodings" (example: the font "Times-Roman" is called + // "ptmr8y" in the DVI file, but the Type1 font file name is + // "utmr8a.pfb". We use the map file of "ps2pk" because that progam + // has, like kdvi (and unlike dvips), no built-in fonts. + + // Finding ps2pk.map is not easy. In teTeX < 3.0, the kpsewhich + // program REQUIRES the option "--format=dvips config". In teTeX = + // 3.0, the option "--format=map" MUST be used. Since there is no + // way to give both options at the same time, there is seemingly no + // other way than to try both options one after another. We use the + // teTeX 3.0 format first. + KProcIO proc; + proc << "kpsewhich" << "--format=map" << "ps2pk.map"; + if (proc.start(KProcess::Block) == false) { + kdError(4700) << "fontMap::fontMap(): kpsewhich could not be started." << endl; + return; + } + + QString map_fileName; + proc.readln(map_fileName); + map_fileName = map_fileName.stripWhiteSpace(); + if (map_fileName.isEmpty()) { + // Map file not found? Then we try the teTeX < 3.0 way of finding + // the file. + proc << "kpsewhich" << "--format=dvips config" << "ps2pk.map"; + if (proc.start(KProcess::Block) == false) { + kdError(4700) << "fontMap::fontMap(): kpsewhich could not be started." << endl; + return; + } + proc.readln(map_fileName); + map_fileName = map_fileName.stripWhiteSpace(); + + // If both versions fail, then there is nothing left to do. + if (map_fileName.isEmpty()) { + kdError(4700) << "fontMap::fontMap(): The file 'ps2pk.map' could not be found by kpsewhich." << endl; + return; + } + } + + QFile file( map_fileName ); + if ( file.open( IO_ReadOnly ) ) { + QTextStream stream( &file ); + QString line; + while ( !stream.atEnd() ) { + line = stream.readLine().simplifyWhiteSpace(); + if (line.at(0) == '%') + continue; + + QString TeXName = line.section(' ', 0, 0); + QString FullName = line.section(' ', 1, 1); + QString fontFileName = line.section('<', -1).stripWhiteSpace().section(' ', 0, 0); + QString encodingName = line.section('<', -2, -2).stripWhiteSpace().section(' ', 0, 0); + // It seems that sometimes the encoding is prepended by the + // letter '[', which we ignore + if ((!encodingName.isEmpty()) && (encodingName[0] == '[')) + encodingName = encodingName.mid(1); + + double slant = 0.0; + int i = line.find("SlantFont"); + if (i >= 0) { + bool ok; + slant = line.left(i).section(' ', -1, -1 ,QString::SectionSkipEmpty).toDouble(&ok); + if (ok == false) + slant = 0.0; + } + + fontMapEntry &entry = fontMapEntries[TeXName]; + + entry.slant = slant; + entry.fontFileName = fontFileName; + entry.fullFontName = FullName; + if (encodingName.endsWith(".enc")) + entry.fontEncoding = encodingName; + else + entry.fontEncoding = QString::null; + } + file.close(); + } else + kdError(4300) << QString("fontMap::fontMap(): The file '%1' could not be opened.").arg(map_fileName) << endl; + +#ifdef DEBUG_FONTMAP + kdDebug(4300) << "FontMap file parsed. Results:" << endl; + QMap<QString, fontMapEntry>::Iterator it; + for ( it = fontMapEntries.begin(); it != fontMapEntries.end(); ++it ) + kdDebug(4300) << "TeXName: " << it.key() + << ", FontFileName=" << it.data().fontFileName + << ", FullName=" << it.data().fullFontName + << ", Encoding=" << it.data().fontEncoding + << "." << endl;; +#endif +} + + +const QString &fontMap::findFileName(const QString &TeXName) +{ + QMap<QString, fontMapEntry>::Iterator it = fontMapEntries.find(TeXName); + + if (it != fontMapEntries.end()) + return it.data().fontFileName; + else + return QString::null; +} + + +const QString &fontMap::findFontName(const QString &TeXName) +{ + QMap<QString, fontMapEntry>::Iterator it = fontMapEntries.find(TeXName); + + if (it != fontMapEntries.end()) + return it.data().fullFontName; + else + return QString::null; +} + + +const QString &fontMap::findEncoding(const QString &TeXName) +{ + QMap<QString, fontMapEntry>::Iterator it = fontMapEntries.find(TeXName); + + if (it != fontMapEntries.end()) + return it.data().fontEncoding; + else + return QString::null; +} + + +double fontMap::findSlant(const QString &TeXName) +{ + QMap<QString, fontMapEntry>::Iterator it = fontMapEntries.find(TeXName); + + if (it != fontMapEntries.end()) + return it.data().slant; + else + return 0.0; +} + +#endif // HAVE_FREETYPE |