// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; c-brace-offset: 0; -*- // fontEncoding.cpp // // Part of KDVI - A DVI previewer for the KDE desktop environment // // SPDX-FileCopyrightText: 2003 Stefan Kebekus // SPDX-License-Identifier: GPL-2.0-or-later #include #ifdef HAVE_FREETYPE #include "debug_dvi.h" #include "fontEncoding.h" #include #include #include #include #include //#define DEBUG_FONTENC fontEncoding::fontEncoding(const QString &encName) { #ifdef DEBUG_FONTENC qCDebug(OkularDviDebug) << "fontEncoding( " << encName << " )"; #endif _isValid = false; // Use kpsewhich to find the encoding file. QProcess kpsewhich; kpsewhich.setProcessChannelMode(QProcess::MergedChannels); // Make sure kpsewhich is in PATH and not just in the CWD static const QString fullPath = QStandardPaths::findExecutable(QStringLiteral("kpsewhich")); if (fullPath.isEmpty()) { qCCritical(OkularDviDebug) << "fontEncoding::fontEncoding(...): kpsewhich is not in path." << endl; return; } kpsewhich.start(fullPath, QStringList() << encName, QIODevice::ReadOnly | QIODevice::Text); if (!kpsewhich.waitForStarted()) { qCCritical(OkularDviDebug) << "fontEncoding::fontEncoding(...): kpsewhich could not be started." << endl; return; } // We wait here while the external program runs concurrently. kpsewhich.waitForFinished(-1); const QString encFileName = QString::fromLocal8Bit(kpsewhich.readAll()).trimmed(); if (encFileName.isEmpty()) { qCCritical(OkularDviDebug) << QStringLiteral("fontEncoding::fontEncoding(...): The file '%1' could not be found by kpsewhich.").arg(encName) << endl; return; } #ifdef DEBUG_FONTENC qCDebug(OkularDviDebug) << "FileName of the encoding: " << encFileName; #endif QFile file(encFileName); if (file.open(QIODevice::ReadOnly)) { // Read the file (excluding comments) into the QString variable // 'fileContent' QTextStream stream(&file); QString fileContent; while (!stream.atEnd()) fileContent += stream.readLine().section(QLatin1Char('%'), 0, 0); // line of text excluding '\n' until first '%'-sign file.close(); fileContent = fileContent.trimmed(); // Find the name of the encoding encodingFullName = fileContent.section(QLatin1Char('['), 0, 0).simplified().mid(1); #ifdef DEBUG_FONTENC qCDebug(OkularDviDebug) << "encodingFullName: " << encodingFullName; #endif fileContent = fileContent.section(QLatin1Char('['), 1, 1).section(QLatin1Char(']'), 0, 0).simplified(); const QStringList glyphNameList = fileContent.split(QLatin1Char('/'), QString::SkipEmptyParts); int i = 0; for (QStringList::ConstIterator it = glyphNameList.constBegin(); (it != glyphNameList.constEnd()) && (i < 256); ++it) { glyphNameVector[i] = (*it).simplified(); #ifdef DEBUG_FONTENC qCDebug(OkularDviDebug) << i << ": " << glyphNameVector[i]; #endif i++; } for (; i < 256; i++) glyphNameVector[i] = QStringLiteral(".notdef"); } else { qCCritical(OkularDviDebug) << QStringLiteral("fontEncoding::fontEncoding(...): The file '%1' could not be opened.").arg(encFileName) << endl; return; } _isValid = true; } #endif // HAVE_FREETYPE