]> git.lyx.org Git - features.git/commitdiff
Register math fonts with Qt 4.2 or higher. Using Qt 4.1, the old
authorEnrico Forestieri <forenr@lyx.org>
Fri, 7 Sep 2007 16:22:05 +0000 (16:22 +0000)
committerEnrico Forestieri <forenr@lyx.org>
Fri, 7 Sep 2007 16:22:05 +0000 (16:22 +0000)
xft-fonts package is still required. However, on *nix there seem
to be no way to tell fontconfig to prefer our fonts instead of
others matching the requirements, so, in case of conflict, the
fontconfig files should be manually adjusted, or some existing
font package used (note that the quality of the bakoma fonts is
better than that of the xft ones). There is no such problem on
Windows where our private fonts are always preferred over the
installed ones (and I hope the same holds true for Mac).

* src/LyX.cpp
(LyX::exec): don't call addFontResources() and restoreFontResources()
anymore, as the frontend code will do the job.

* src/frontends/qt4/GuiFontLoader.{cpp,h}
(GuiFontLoader::GuiFontLoader): register math fonts with Qt.
(GuiFontLoader::~GuiFontLoader): unregister math fonts.

* src/support/os.h
* src/support/os_unix.cpp
* src/support/os_win32.cpp
* src/support/os_cygwin.cpp:
remove code dealing with fonts.

* configure.ac: don't check for fontconfig headers anymore.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@20128 a592a061-630c-0410-9148-cb99ea01b6c8

configure.ac
src/LyX.cpp
src/frontends/qt4/GuiFontLoader.cpp
src/frontends/qt4/GuiFontLoader.h
src/support/os.h
src/support/os_cygwin.cpp
src/support/os_unix.cpp
src/support/os_win32.cpp

index bd6b955b89c8163dded55182c24ea632db256b32..39d2292e7d628cf7fdc55715c35b677ca62260a2 100644 (file)
@@ -236,7 +236,7 @@ AC_LANG_POP(C)
 # some standard header files
 AC_HEADER_DIRENT
 AC_HEADER_MAJOR
-AC_CHECK_HEADERS(sys/time.h sys/types.h sys/select.h strings.h locale.h io.h process.h NewAPIs.h utime.h sys/utime.h fontconfig/fontconfig.h)
+AC_CHECK_HEADERS(sys/time.h sys/types.h sys/select.h strings.h locale.h io.h process.h NewAPIs.h utime.h sys/utime.h)
 
 # some standard structures
 AC_HEADER_STAT
index a778d4cb819529a293fc051db037c6e6847becb2..613d73f38c8a33ec7196d39ae73158056c44256a 100644 (file)
@@ -450,9 +450,6 @@ int LyX::exec(int & argc, char * argv[])
                return !final_success;
        }
 
-       // Force adding of font path _before_ Application is initialized
-       support::os::addFontResources();
-
        // Let the frontend parse and remove all arguments that it knows
        pimpl_->application_.reset(createApplication(argc, argv));
 
@@ -487,9 +484,6 @@ int LyX::exec(int & argc, char * argv[])
 
        prepareExit();
 
-       // Restore original font resources after Application is destroyed.
-       support::os::restoreFontResources();
-
        return exit_status;
 }
 
index 87e43978ee71d2e3a716e7814c285823395b4674..41913a673b4779bd95e3351a5b249819ac803e71 100644 (file)
 #include "support/filetools.h"
 #include "support/lstrings.h"
 #include "support/Systemcall.h"
+#include "support/Package.h"
+#include "support/os.h"
 
 #include <qfontinfo.h>
+#include <QFontDatabase>
 
 #include <boost/tuple/tuple.hpp>
 
@@ -33,6 +36,9 @@
 #endif
 
 using lyx::support::contains;
+using lyx::support::package;
+using lyx::support::addPath;
+using lyx::support::addName;
 
 using std::endl;
 using std::make_pair;
@@ -41,6 +47,12 @@ using std::pair;
 using std::vector;
 using std::string;
 
+#if QT_VERSION >= 0x040200
+string const math_fonts[] = {"cmex10", "cmmi10", "cmr10", "cmsy10",
+       "eufm10", "msam10", "msbm10", "wasy10", "esint10"};
+int const num_math_fonts = sizeof(math_fonts) / sizeof(*math_fonts);
+#endif
+
 
 namespace lyx {
 namespace frontend {
@@ -189,6 +201,24 @@ pair<QFont, bool> const getSymbolFont(string const & family)
 
 GuiFontLoader::GuiFontLoader()
 {
+#if QT_VERSION >= 0x040200
+       fontID = new int[num_math_fonts];
+
+       string const fonts_dir =
+               addPath(package().system_support().absFilename(), "fonts");
+
+       for (int i = 0 ; i < num_math_fonts; ++i) {
+               string const font_file = lyx::support::os::external_path(
+                               addName(fonts_dir, math_fonts[i] + ".ttf"));
+               fontID[i] = QFontDatabase::addApplicationFont(toqstr(font_file));
+
+               LYXERR(Debug::FONT) << "Adding font " << font_file
+                                   << static_cast<const char *>
+                                       (fontID[i] < 0 ? " FAIL" : " OK")
+                                   << endl;
+       }
+#endif
+
        for (int i1 = 0; i1 < Font::NUM_FAMILIES; ++i1)
                for (int i2 = 0; i2 < 2; ++i2)
                        for (int i3 = 0; i3 < 4; ++i3)
@@ -197,6 +227,19 @@ GuiFontLoader::GuiFontLoader()
 }
 
 
+GuiFontLoader::~GuiFontLoader()
+{
+#if QT_VERSION >= 0x040200
+       for (int i = 0 ; i < num_math_fonts; ++i) {
+               if (fontID[i] >= 0)
+                       QFontDatabase::removeApplicationFont(fontID[i]);
+       }
+
+       delete [] fontID;
+#endif
+}
+
+
 void GuiFontLoader::update()
 {
        for (int i1 = 0; i1 < Font::NUM_FAMILIES; ++i1) {
index 5fc718fbbfa1f07dab6f8be7cf705bf5bfc4ec18..7329cc2ac21b6c1dd209fd88546f3302e453eaf3 100644 (file)
@@ -48,7 +48,7 @@ public:
        GuiFontLoader();
 
        /// Destructor
-       virtual ~GuiFontLoader() {}
+       ~GuiFontLoader();
 
        virtual void update();
        virtual bool available(Font const & f);
@@ -74,6 +74,9 @@ public:
        }
 
 private:
+#if QT_VERSION >= 0x040200
+       int * fontID;
+#endif
        /// BUTT ugly !
        QLFontInfo * fontinfo_[Font::NUM_FAMILIES][2][4][10];
 };
index f0333a633dad1a16f418acdd0b694471df2a224e..11147e596b4f4a0cbe523684788af63c189afb89 100644 (file)
@@ -109,19 +109,6 @@ bool canAutoOpenFile(std::string const & ext, auto_open_mode const mode = VIEW);
  */
 bool autoOpenFile(std::string const & filename, auto_open_mode const mode = VIEW);
 
-/** General font utilities.
- *  FIXME: only MAC and WIN32 for now but it would be nice to convince
- *  fontconfig to do the same for linux.
- */
-
-/// Add fonts to the font subsystem, must be called before Application
-/// is initialized.
-void addFontResources();
-
-/// Restore original font resources, must be called after Application
-/// is destroyed.
-void restoreFontResources();
-
 } // namespace os
 } // namespace support
 } // namespace lyx
index c11a6fdc081e38c6f760291ebda87d80854e4bce..304dd3e9975de715bb2476bf77469e13bd384d71 100644 (file)
@@ -32,24 +32,6 @@ using std::string;
 
 using lyx::support::contains;
 
-#ifdef X_DISPLAY_MISSING
-#include "support/filetools.h"
-#include "support/Package.h"
-#include "support/Path.h"
-using lyx::support::addName;
-using lyx::support::addPath;
-using lyx::support::package;
-
-// API definition for manually calling font functions on Windows 2000 and later
-typedef int (WINAPI *FONTAPI)(LPCSTR, DWORD, PVOID);
-#define FR_PRIVATE     0x10
-
-// Names of TrueType fonts to load
-string const win_fonts_truetype[] = {"cmex10", "cmmi10", "cmr10", "cmsy10",
-       "eufm10", "msam10", "msbm10", "wasy10", "esint10"};
-const int num_fonts_truetype = sizeof(win_fonts_truetype) / sizeof(*win_fonts_truetype);
-#endif
-
 
 namespace lyx {
 namespace support {
@@ -294,59 +276,6 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode)
                win_path.c_str(), NULL, NULL, 1)) > 32;
 }
 
-
-void addFontResources()
-{
-#ifdef X_DISPLAY_MISSING
-       // Windows only: Add BaKoMa TrueType font resources
-       string const fonts_dir = addPath(package().system_support().absFilename(), "fonts");
-
-       HMODULE hDLL = LoadLibrary("gdi32");
-       FONTAPI pAddFontResourceEx =
-               (FONTAPI) GetProcAddress(hDLL, "AddFontResourceExA");
-
-       for (int i = 0 ; i < num_fonts_truetype ; ++i) {
-               string const font_current = to_local8bit(from_utf8(convert_path(
-                       addName(fonts_dir, win_fonts_truetype[i] + ".ttf"),
-                       PathStyle(windows))));
-               if (pAddFontResourceEx) {
-                       // Windows 2000 and later: Use AddFontResourceEx
-                       pAddFontResourceEx(font_current.c_str(), FR_PRIVATE, 0);
-               } else {
-                       // Older Windows versions: Use AddFontResource
-                       AddFontResource(font_current.c_str());
-               }
-       }
-       FreeLibrary(hDLL);
-#endif
-}
-
-
-void restoreFontResources()
-{
-#ifdef X_DISPLAY_MISSING
-       // Windows only: Remove BaKoMa TrueType font resources
-       string const fonts_dir = addPath(package().system_support().absFilename(), "fonts");
-
-       HMODULE hDLL = LoadLibrary("gdi32");
-       FONTAPI pRemoveFontResourceEx = (FONTAPI) GetProcAddress(hDLL, "RemoveFontResourceExA");
-
-       for(int i = 0 ; i < num_fonts_truetype ; ++i) {
-               string const font_current = to_local8bit(from_utf8(convert_path(
-                       addName(fonts_dir, win_fonts_truetype[i] + ".ttf"),
-                       PathStyle(windows))));
-               if (pRemoveFontResourceEx) {
-                       // Windows 2000 and later: Use RemoveFontResourceEx
-                       pRemoveFontResourceEx(font_current.c_str(), FR_PRIVATE, 0);
-               } else {
-                       // Older Windows versions: Use RemoveFontResource
-                       RemoveFontResource(font_current.c_str());
-               }
-       }
-       FreeLibrary(hDLL);
-#endif
-}
-
 } // namespace os
 } // namespace support
 } // namespace lyx
index c3494798098d5c4f5e64bbf28e0024b08227d576..f5e4c841028240bcb00d8b0ce558ede37bed3935 100644 (file)
 #include <config.h>
 
 #include "support/os.h"
-#include "debug.h"
 
 #ifdef __APPLE__
 #include <Carbon/Carbon.h>
-#include <ApplicationServices/ApplicationServices.h>
-#elif defined(HAVE_FONTCONFIG_FONTCONFIG_H)
-#include "support/filetools.h"
-#include "support/Package.h"
-#include <fontconfig/fontconfig.h>
-using lyx::support::addPath;
 #endif
 
-using std::endl;
 using std::string;
 
 
@@ -200,52 +192,6 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode)
 #endif
 }
 
-
-void addFontResources()
-{
-#ifdef __APPLE__
-       CFBundleRef  myAppBundle = CFBundleGetMainBundle();
-       CFURLRef  myAppResourcesURL, FontsURL;
-       FSRef  fontDirRef;
-       FSSpec  fontDirSpec;
-       CFStringRef  filePath = CFStringCreateWithBytes(kCFAllocatorDefault,
-                                       (UInt8 *) "fonts", strlen("fonts"),
-                                       kCFStringEncodingISOLatin1, false);
-
-       myAppResourcesURL = CFBundleCopyResourcesDirectoryURL(myAppBundle);
-       FontsURL = CFURLCreateCopyAppendingPathComponent(kCFAllocatorDefault,
-                       myAppResourcesURL, filePath, true);
-       if (lyxerr.debugging(Debug::FONT)) {
-               UInt8  buf[255];
-               if (CFURLGetFileSystemRepresentation(FontsURL, true, buf, 255))
-                       lyxerr << "Adding Fonts directory: " << buf << endl;
-       }
-       CFURLGetFSRef (FontsURL, &fontDirRef);
-       OSStatus err = FSGetCatalogInfo (&fontDirRef, kFSCatInfoNone,
-                                        NULL, NULL, &fontDirSpec, NULL);
-       if (err)
-               lyxerr << "FSGetCatalogInfo err = " << err << endl;
-       err = FMActivateFonts (&fontDirSpec, NULL, NULL,
-                              kFMLocalActivationContext);
-       if (err)
-               lyxerr << "FMActivateFonts err = " << err << endl;
-#elif defined(HAVE_FONTCONFIG_FONTCONFIG_H)
-       // Register BaKoMa truetype fonts with fontconfig
-       string const fonts_dir =
-               addPath(package().system_support().absFilename(), "fonts");
-       if (!FcConfigAppFontAddDir(0, (FcChar8 const *)fonts_dir.c_str()))
-               lyxerr << "Unable to register fonts with fontconfig." << endl;
-#endif
-}
-
-
-void restoreFontResources()
-{
-#if defined(HAVE_FONTCONFIG_FONTCONFIG_H) && !defined(__APPLE__)
-       FcConfigAppFontClear(0);
-#endif
-}
-
 } // namespace os
 } // namespace support
 } // namespace lyx
index 463e341d62f4d69cff9483dcce291757d653a803..f48759e369b2302c47dc13273d1efd79dd351ed8 100644 (file)
@@ -19,8 +19,6 @@
 #include "support/lstrings.h"
 #include "support/filetools.h"
 #include "support/ExceptionMessage.h"
-#include "support/Package.h"
-#include "support/Path.h"
 
 #include "debug.h"
 #include "gettext.h"
@@ -70,18 +68,6 @@ using std::string;
 
 using lyx::support::runCommand;
 using lyx::support::split;
-using lyx::support::addName;
-using lyx::support::addPath;
-using lyx::support::package;
-
-// API definition for manually calling font functions on Windows 2000 and later
-typedef int (WINAPI *FONTAPI)(LPCSTR, DWORD, PVOID);
-#define FR_PRIVATE     0x10
-
-// Names of TrueType fonts to load
-string const win_fonts_truetype[] = {"cmex10", "cmmi10", "cmr10", "cmsy10",
-       "eufm10", "msam10", "msbm10", "wasy10", "esint10"};
-const int num_fonts_truetype = sizeof(win_fonts_truetype) / sizeof(*win_fonts_truetype);
 
 
 namespace lyx {
@@ -407,54 +393,6 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode)
                to_local8bit(from_utf8(filename)).c_str(), NULL, NULL, 1)) > 32;
 }
 
-
-void addFontResources()
-{
-       // Windows only: Add BaKoMa TrueType font resources
-       string const fonts_dir = addPath(package().system_support().absFilename(), "fonts");
-
-       HMODULE hDLL = LoadLibrary("gdi32");
-       FONTAPI pAddFontResourceEx = (FONTAPI) GetProcAddress(hDLL, "AddFontResourceExA");
-
-       for (int i = 0 ; i < num_fonts_truetype ; ++i) {
-               string const font_current =
-                       addName(fonts_dir, win_fonts_truetype[i] + ".ttf");
-               if (pAddFontResourceEx) {
-                       // Windows 2000 and later: Use AddFontResourceEx for private font
-                       pAddFontResourceEx(to_local8bit(from_utf8(external_path(font_current))).c_str(), FR_PRIVATE, 0);
-               } else {
-                       // Older Windows versions: Use AddFontResource
-                       AddFontResource(to_local8bit(from_utf8(external_path(font_current))).c_str());
-               }
-       }
-
-       FreeLibrary(hDLL);
-}
-
-
-void restoreFontResources()
-{
-       // Windows only: Remove BaKoMa TrueType font resources
-       string const fonts_dir = addPath(package().system_support().absFilename(), "fonts");
-
-       HMODULE hDLL = LoadLibrary("gdi32");
-       FONTAPI pRemoveFontResourceEx = (FONTAPI) GetProcAddress(hDLL, "RemoveFontResourceExA");
-
-       for(int i = 0 ; i < num_fonts_truetype ; ++i) {
-               string const font_current =
-                       addName(fonts_dir, win_fonts_truetype[i] + ".ttf");
-               if (pRemoveFontResourceEx) {
-                       // Windows 2000 and later: Use RemoveFontResourceEx for private font
-                       pRemoveFontResourceEx(to_local8bit(from_utf8(external_path(font_current))).c_str(), FR_PRIVATE, 0);
-               } else {
-                       // Older Windows versions: Use RemoveFontResource
-                       RemoveFontResource(to_local8bit(from_utf8(external_path(font_current))).c_str());
-               }
-       }
-
-       FreeLibrary(hDLL);
-}
-
 } // namespace os
 } // namespace support
 } // namespace lyx