Subversion Repositories Scribus

Rev

Rev 9672 | Rev 13085 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
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 <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).toLatin1().constData());
                                brokenMetric = true;
                        }
                        else
                        {
                                if (brokenMetric)
                                        qDebug(QObject::tr("Valid metrics were found for font %1, using metrics in file %2").arg(fontFile).arg(metricsFile).toLatin1().constData());
                                metricsFound = true;
                                break;
                        }
                }
        }
        else
                qDebug(QObject::tr("No metrics found for font %1, ignoring font").arg(fontPath).toLatin1().constData());
        return metricsFound;
}