You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.4 KiB
103 lines
3.4 KiB
// -*- 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 <config.h> |
|
|
|
#ifdef HAVE_FREETYPE |
|
|
|
#include "debug_dvi.h" |
|
#include "fontEncoding.h" |
|
|
|
#include <QFile> |
|
#include <QLoggingCategory> |
|
#include <QProcess> |
|
#include <QStandardPaths> |
|
#include <QTextStream> |
|
|
|
//#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
|
|
|