blob: 949814fbe71864d44ccf8f4c0fab6e78e23e7a5a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
/*
For general Scribus (>=1.3.2) copyright and licensing information please refer
to the COPYING file provided with the program. Following this notice may exist
a copyright and/or license notice that predates the release of Scribus 1.3.2
for which a new license (GPL+exception) is in place.
*/
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include "ftface.h"
#include "scface_ps.h"
QStringList ScFace_postscript::findFontMetrics(const QString& fontPath) const
{
QStringList metricsFiles;
QFileInfo fi(fontPath);
QString fontDir = fi.absolutePath();
QString fontFile = fi.fileName();
metricsFiles += findFontMetrics(fontDir, fontFile);
//if no metrics found look in afm and pfm subdirs
if ( metricsFiles.size() <= 0 )
{
QDir dir;
if (dir.exists(fontDir + "/AFMs"))
metricsFiles += findFontMetrics(fontDir + "/AFMs", fontFile);
if (dir.exists(fontDir + "/afm") && metricsFiles.size() <= 0)
metricsFiles += findFontMetrics(fontDir + "/afm", fontFile);
if (dir.exists(fontDir + "/Pfm") && metricsFiles.size() <= 0)
metricsFiles += findFontMetrics(fontDir + "/Pfm", fontFile);
if (dir.exists(fontDir + "/pfm") && metricsFiles.size() <= 0)
metricsFiles += findFontMetrics(fontDir + "/pfm", fontFile);
}
return metricsFiles;
}
QStringList ScFace_postscript::findFontMetrics(const QString& baseDir, const QString& baseName) const
{
QStringList metricsFiles;
QString basePath = baseDir + "/" + baseName;
QString afnm = basePath.left(basePath.length()-3);
// Look for afm files
QString afmName(afnm+"afm");
if(QFile::exists(afmName))
metricsFiles.append(afmName);
else
{
afmName = afnm+"Afm";
if(QFile::exists(afmName))
metricsFiles.append(afmName);
else
{
afmName = afnm+"AFM";
if(QFile::exists(afmName))
metricsFiles.append(afmName);
}
}
// Look for pfm files
QString pfmName(afnm+"pfm");
if(QFile::exists(pfmName))
metricsFiles.append(pfmName);
else
{
pfmName = afnm+"Pfm";
if(QFile::exists(pfmName))
metricsFiles.append(pfmName);
else
{
afmName = afnm+"PFM";
if(QFile::exists(pfmName))
metricsFiles.append(pfmName);
}
}
return metricsFiles;
}
bool ScFace_postscript::loadFontMetrics(FT_Face face, const QString& fontPath) const
{
bool metricsFound = false;
QStringList fontMetrics = findFontMetrics(fontPath);
if (fontMetrics.size() > 0)
{
bool brokenMetric = false;
QString metricsFile;
for (int i = 0; i < fontMetrics.size(); ++i)
{
metricsFile = fontMetrics.at(i);
if (FT_Attach_File(face, metricsFile.toLocal8Bit().constData()))
{
qDebug() << QObject::tr("Font %1 has broken metrics in file %2, ignoring metrics").arg(fontPath).arg(metricsFile);
brokenMetric = true;
}
else
{
if (brokenMetric)
qDebug() << QObject::tr("Valid metrics were found for font %1, using metrics in file %2").arg(fontFile).arg(metricsFile);
metricsFound = true;
break;
}
}
}
else
qDebug() << QObject::tr("No metrics found for font %1, ignoring font").arg(fontPath);
return metricsFound;
}
|