Author: jghali
Date: Fri Nov  8 22:54:34 2019
New Revision: 23350

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=23350
Log:
#13630: Add Registry support for fonts in Windows

Modified:
    trunk/Scribus/scribus/scfonts.cpp
    trunk/Scribus/scribus/scfonts.h

Modified: trunk/Scribus/scribus/scfonts.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23350&path=/trunk/Scribus/scribus/scfonts.cpp
==============================================================================
--- trunk/Scribus/scribus/scfonts.cpp   (original)
+++ trunk/Scribus/scribus/scfonts.cpp   Fri Nov  8 22:54:34 2019
@@ -26,6 +26,11 @@
 #include <QMap>
 #include <QRegExp>
 #include <QRawFont>
+#ifdef Q_OS_WIN32
+#include <QSet>
+#include <QSettings>
+#include <QStandardPaths>
+#endif
 #include <QString>
 #include <QTextCodec>
 
@@ -77,7 +82,7 @@
 SCFonts::SCFonts()
 {
 //     insert("", ScFace::none()); // Wtf why inserting an empty entry here 
????
-       m_showFontInfo=false;
+       m_showFontInfo = false;
        m_checkedFonts.clear();
 }
 
@@ -120,7 +125,7 @@
        if (p.right(1) != "/")
                p += "/";
        if (!m_fontPaths.contains(p))
-               m_fontPaths.insert(m_fontPaths.count(),p);
+               m_fontPaths.insert(m_fontPaths.count(), p);
 }
 
 void SCFonts::addScalableFonts(const QString &path, const QString& DocName)
@@ -137,17 +142,17 @@
        QString pathname(path);
        if ( !pathname.endsWith("/") )
                pathname += "/";
-       pathname=QDir::toNativeSeparators(pathname);
+       pathname = QDir::toNativeSeparators(pathname);
        QDir d(pathname, "*", QDir::Name, QDir::Dirs | QDir::Files | 
QDir::Readable);
        if ((d.exists()) && (d.count() != 0))
        {
-               for (uint dc = 0; dc < d.count(); ++dc)
+               for (uint i = 0; i < d.count(); ++i)
                {
                        // readdir may return . or .., which we don't want to 
recurse
                        // over. Skip 'em.
-                       if (d[dc] == "." || d[dc] == "..")
+                       if (d[i] == "." || d[i] == "..")
                                continue;
-                       fullpath = pathname+d[dc];
+                       fullpath = pathname + d[i];
                        QFileInfo fi(fullpath);
                        if (!fi.exists())      // Sanity check for broken 
Symlinks
                                continue;
@@ -159,7 +164,7 @@
                        {
                                QFileInfo fi3(fi.readLink());
                                if (fi3.isRelative())
-                                       pathfile = pathname+fi.readLink();
+                                       pathfile = pathname + fi.readLink();
                                else
                                        pathfile = fi3.absoluteFilePath();
                        }
@@ -1039,6 +1044,152 @@
        FcFontSetDestroy(fs);
 }
 
+#elif defined(Q_OS_WIN32)
+
+void SCFonts::addRegistryFonts()
+{
+       const QStringList keys = { 
QStringLiteral("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows 
NT\\CurrentVersion\\Fonts"),
+                                      
QStringLiteral("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows 
NT\\CurrentVersion\\Fonts"),
+#if defined(Q_OS_WIN64)
+                                  
QStringLiteral("HKEY_CURRENT_USER\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows 
NT\\CurrentVersion\\Fonts"),
+                                      
QStringLiteral("HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows 
NT\\CurrentVersion\\Fonts"),
+#endif
+                                };
+       QSet<QString> foundFonts;
+
+       FT_Library library = nullptr;
+       FT_Init_FreeType( &library );
+
+       for (const auto key : keys)
+       {
+               const QSettings fontRegistry(key, QSettings::NativeFormat);
+               const QStringList allKeys = fontRegistry.allKeys();
+
+               int size = allKeys.size();
+               for (int i = 0; i < size; ++i)
+               {
+                       const QString &fontKey = allKeys.at(i);
+                       const QString fileName = 
fontRegistry.value(fontKey).toString();
+
+                       QFileInfo fontInfo(fileName);
+                       if (fontInfo.isRelative())
+                               continue; // Font located in system font 
directory, nothing to do
+                       if (!fontInfo.exists())
+                               continue; // Sanity check for broken Symlinks
+                       QString fontPath = fontInfo.absoluteFilePath();
+                       QString pathName = fontInfo.absolutePath();
+
+                       qApp->processEvents();
+                       
+                       bool isSymlink = fontInfo.isSymLink();
+                       if (isSymlink)
+                       {
+                               QFileInfo symlinkInfo(fontInfo.readLink());
+                               if (symlinkInfo.isRelative())
+                                       fontPath = pathName + 
fontInfo.readLink();
+                               else
+                                       fontPath = 
symlinkInfo.absoluteFilePath();
+                       }
+
+                       fontPath = QDir::toNativeSeparators(fontPath);
+                       if (foundFonts.contains(fontPath))
+                               continue;
+
+                       QFileInfo fontInfo2(fontPath);
+                       QString ext = fontInfo.suffix().toLower();
+                       QString ext2 = fontInfo2.suffix().toLower();
+                       if ((ext != ext2) && (ext.isEmpty())) 
+                               ext = ext2;
+                       if ((ext == "ttc") || (ext == "dfont") || (ext == 
"pfa") || (ext == "pfb") || (ext == "ttf") || (ext == "otf"))
+                       {
+                               foundFonts.insert(fontPath);
+                               addScalableFont(fontPath, library, QString());
+                       }
+               }
+       }
+
+       FT_Done_FreeType(library);
+}
+
+void SCFonts::addType1RegistryFonts()
+{
+       const QStringList keys = { 
QStringLiteral("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows 
NT\\CurrentVersion\\Type 1 Installer\\Type 1 Fonts"),
+                                      
QStringLiteral("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows 
NT\\CurrentVersion\\Type 1 Installer\\Type 1 Fonts"),
+#if defined(Q_OS_WIN64)
+                                  
QStringLiteral("HKEY_CURRENT_USER\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows 
NT\\CurrentVersion\\Type 1 Installer\\Type 1 Fonts"),
+                                      
QStringLiteral("HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows 
NT\\CurrentVersion\\Type 1 Installer\\Type 1 Fonts"),
+#endif
+                                };
+       QSet<QString> foundFonts;
+
+       FT_Library library = nullptr;
+       FT_Init_FreeType( &library );
+
+       for (const auto key : keys)
+       {
+               const QSettings fontRegistry(key, QSettings::NativeFormat);
+               const QStringList allKeys = fontRegistry.allKeys();
+
+               int size = allKeys.size();
+               for (int i = 0; i < size; ++i)
+               {
+                       const QString &fontKey = allKeys.at(i);
+                       const QStringList fileNames = 
fontRegistry.value(fontKey).toStringList();
+                       if (fileNames.size() <= 0)
+                               continue;
+                       if (fileNames.at(0) != "T")
+                               continue;
+
+                       for (int j = 1; j < fileNames.count(); ++j)
+                       {
+                               QString fileName = fileNames.at(j);
+
+                               QFileInfo fontInfo(fileName);
+                               if (fontInfo.isRelative())
+                                       continue; // Font located in system 
font directory, nothing to do
+                               if (!fontInfo.exists())
+                                       continue; // Sanity check for broken 
Symlinks
+
+                               QString ext = fontInfo.suffix().toLower();
+                               if ((ext != "pfa") && (ext != "pfb"))
+                                       continue;
+
+                               QString fontPath = fontInfo.absoluteFilePath();
+                               QString pathName = fontInfo.absolutePath();
+
+                               qApp->processEvents();
+                       
+                               bool isSymlink = fontInfo.isSymLink();
+                               if (isSymlink)
+                               {
+                                       QFileInfo 
symlinkInfo(fontInfo.readLink());
+                                       if (symlinkInfo.isRelative())
+                                               fontPath = pathName + 
fontInfo.readLink();
+                                       else
+                                               fontPath = 
symlinkInfo.absoluteFilePath();
+                               }
+
+                               fontPath = QDir::toNativeSeparators(fontPath);
+                               if (foundFonts.contains(fontPath))
+                                       continue;
+
+                               QFileInfo fontInfo2(fontPath);
+                               QString ext2 = fontInfo2.suffix().toLower();
+                               if ((ext != ext2) && (ext.isEmpty())) 
+                                       ext = ext2;
+                               if ((ext == "pfa") || (ext == "pfb"))
+                               {
+                                       foundFonts.insert(fontPath);
+                                       addScalableFont(fontPath, library, 
QString());
+                                       break;
+                               }
+                       }
+               }
+       }
+
+       FT_Done_FreeType(library);
+}
+
 #elif defined(Q_OS_LINUX)
 
 void SCFonts::addXFontPath()
@@ -1207,17 +1358,27 @@
        readFontCache(pf);
        ScCore->setSplashStatus( QObject::tr("Searching for Fonts") );
        addUserPath(pf);
+
        // Search the system paths
        QStringList ftDirs = ScPaths::systemFontDirs();
        for (int i = 0; i < ftDirs.count(); i++)
                addScalableFonts( ftDirs[i] );
+
+#ifdef Q_OS_WIN32
+       // Search fonts outside system paths using Windows Registry
+       addRegistryFonts();
+       addType1RegistryFonts();
+#endif
+
        // Search Scribus font path
        if (!ScPaths::instance().fontDir().isEmpty() && 
QDir(ScPaths::instance().fontDir()).exists())
                addScalableFonts( ScPaths::instance().fontDir() );
+
        //Add downloaded user fonts
        QString userFontDir(ScPaths::instance().userFontDir(false));
        if (QDir(userFontDir).exists())
                addScalableFonts( userFontDir );
+
 // if fontconfig is there, it does all the work
 #if HAVE_FONTCONFIG
        // Search fontconfig paths

Modified: trunk/Scribus/scribus/scfonts.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23350&path=/trunk/Scribus/scribus/scfonts.h
==============================================================================
--- trunk/Scribus/scribus/scfonts.h     (original)
+++ trunk/Scribus/scribus/scfonts.h     Fri Nov  8 22:54:34 2019
@@ -45,6 +45,7 @@
                void getFonts(const QString& pf, bool showFontInfo=false);
                ScFace loadScalableFont(const QString &filename);
                void addScalableFonts(const QString& path, const QString& 
DocName = "");
+
                /// Returns a font with that name; creates a replacement font 
if not found
                const ScFace& findFont(const QString& fontName, ScribusDoc* doc 
= nullptr);
                const ScFace& findFont(const QString& fontFamily, const 
QString& fontStyle, ScribusDoc* doc = nullptr);
@@ -69,11 +70,12 @@
                void addUserPath(const QString& pf);
 #ifdef HAVE_FONTCONFIG
                void addFontconfigFonts();
-#else
-#ifndef Q_OS_MAC
+#elif defined(Q_OS_WIN32)
+               void addRegistryFonts();
+               void addType1RegistryFonts();
+#elif defined(Q_OS_LINUX)
                void addXFontServerPath();
                void addXFontPath();
-#endif
 #endif
                QStringList m_fontPaths;
 


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to