// fontMap.cpp // // Part of KDVI - A DVI previewer for the KDE desktop environemt // // (C) 2003 Stefan Kebekus // Distributed under the GPL #include #ifdef HAVE_FREETYPE #include #include #include #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 RETQUIRES 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; } TQString 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; } } TQFile file( map_fileName ); if ( file.open( IO_ReadOnly ) ) { TQTextStream stream( &file ); TQString line; while ( !stream.atEnd() ) { line = stream.readLine().simplifyWhiteSpace(); if (line.at(0) == '%') continue; TQString TeXName = line.section(' ', 0, 0); TQString FullName = line.section(' ', 1, 1); TQString fontFileName = line.section('<', -1).stripWhiteSpace().section(' ', 0, 0); TQString 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 ,TQString::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 = TQString(); } file.close(); } else kdError(4300) << TQString("fontMap::fontMap(): The file '%1' could not be opened.").arg(map_fileName) << endl; #ifdef DEBUG_FONTMAP kdDebug(4300) << "FontMap file parsed. Results:" << endl; TQMap::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 TQString &fontMap::findFileName(const TQString &TeXName) { TQMap::Iterator it = fontMapEntries.find(TeXName); if (it != fontMapEntries.end()) return it.data().fontFileName; else return TQString(); } const TQString &fontMap::findFontName(const TQString &TeXName) { TQMap::Iterator it = fontMapEntries.find(TeXName); if (it != fontMapEntries.end()) return it.data().fullFontName; else return TQString(); } const TQString &fontMap::findEncoding(const TQString &TeXName) { TQMap::Iterator it = fontMapEntries.find(TeXName); if (it != fontMapEntries.end()) return it.data().fontEncoding; else return TQString(); } double fontMap::findSlant(const TQString &TeXName) { TQMap::Iterator it = fontMapEntries.find(TeXName); if (it != fontMapEntries.end()) return it.data().slant; else return 0.0; } #endif // HAVE_FREETYPE