diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2011-09-02 11:58:46 (GMT) |
---|---|---|
committer | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com> | 2011-09-02 11:58:46 (GMT) |
commit | ab31160c72ea7e7b03604c87ecac11d756da9dce (patch) | |
tree | a7821d15bcb6651912bf0558a9446aa17ce6875b | |
parent | 3926aa4b69caa9037d610b4e212d99dae86d500c (diff) | |
download | Qt-ab31160c72ea7e7b03604c87ecac11d756da9dce.zip Qt-ab31160c72ea7e7b03604c87ecac11d756da9dce.tar.gz Qt-ab31160c72ea7e7b03604c87ecac11d756da9dce.tar.bz2 |
on windows, don't resolve the gdi32's symbols for each QRawFont instance
Merge-request: 1343
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
-rw-r--r-- | src/gui/text/qrawfont_p.h | 17 | ||||
-rw-r--r-- | src/gui/text/qrawfont_win.cpp | 46 |
2 files changed, 26 insertions, 37 deletions
diff --git a/src/gui/text/qrawfont_p.h b/src/gui/text/qrawfont_p.h index fdf7cad..84e83cf 100644 --- a/src/gui/text/qrawfont_p.h +++ b/src/gui/text/qrawfont_p.h @@ -71,21 +71,17 @@ public: , thread(0) #if defined(Q_WS_WIN) , fontHandle(NULL) - , ptrAddFontMemResourceEx(NULL) - , ptrRemoveFontMemResourceEx(NULL) #endif {} QRawFontPrivate(const QRawFontPrivate &other) - : hintingPreference(other.hintingPreference) + : fontEngine(other.fontEngine) + , hintingPreference(other.hintingPreference) , thread(other.thread) #if defined(Q_WS_WIN) , fontHandle(NULL) - , ptrAddFontMemResourceEx(other.ptrAddFontMemResourceEx) - , ptrRemoveFontMemResourceEx(other.ptrRemoveFontMemResourceEx) #endif { - fontEngine = other.fontEngine; if (fontEngine != 0) fontEngine->ref.ref(); } @@ -111,14 +107,7 @@ public: #if defined(Q_WS_WIN) HANDLE fontHandle; - - typedef HANDLE (WINAPI *PtrAddFontMemResourceEx)(PVOID, DWORD, PVOID, DWORD *); - typedef BOOL (WINAPI *PtrRemoveFontMemResourceEx)(HANDLE); - - PtrAddFontMemResourceEx ptrAddFontMemResourceEx; - PtrRemoveFontMemResourceEx ptrRemoveFontMemResourceEx; - -#endif // Q_WS_WIN +#endif }; QT_END_NAMESPACE diff --git a/src/gui/text/qrawfont_win.cpp b/src/gui/text/qrawfont_win.cpp index 779652f..f612ef1 100644 --- a/src/gui/text/qrawfont_win.cpp +++ b/src/gui/text/qrawfont_win.cpp @@ -525,22 +525,31 @@ extern QFontEngine *qt_load_font_engine_win(const QFontDef &request); // From qfontdatabase.cpp extern QFont::Weight weightFromInteger(int weight); -void QRawFontPrivate::platformCleanUp() +typedef HANDLE (WINAPI *PtrAddFontMemResourceEx)(PVOID, DWORD, PVOID, DWORD *); +static PtrAddFontMemResourceEx ptrAddFontMemResourceEx = 0; +typedef BOOL (WINAPI *PtrRemoveFontMemResourceEx)(HANDLE); +static PtrRemoveFontMemResourceEx ptrRemoveFontMemResourceEx = 0; + +static void resolveGdi32() { - if (fontHandle != NULL) { - if (ptrRemoveFontMemResourceEx == NULL) { - void *func = QSystemLibrary::resolve(QLatin1String("gdi32"), "RemoveFontMemResourceEx"); - ptrRemoveFontMemResourceEx = - reinterpret_cast<QRawFontPrivate::PtrRemoveFontMemResourceEx>(func); + static bool triedResolve = false; + if (!triedResolve) { + QSystemLibrary gdi32(QLatin1String("gdi32")); + if (gdi32.load()) { + ptrAddFontMemResourceEx = (PtrAddFontMemResourceEx)gdi32.resolve("AddFontMemResourceEx"); + ptrRemoveFontMemResourceEx = (PtrRemoveFontMemResourceEx)gdi32.resolve("RemoveFontMemResourceEx"); } - if (ptrRemoveFontMemResourceEx == NULL) { - qWarning("QRawFont::platformCleanUp: Can't find RemoveFontMemResourceEx in gdi32"); - fontHandle = NULL; - } else { + triedResolve = true; + } +} + +void QRawFontPrivate::platformCleanUp() +{ + if (fontHandle != NULL) { + if (ptrRemoveFontMemResourceEx) ptrRemoveFontMemResourceEx(fontHandle); - fontHandle = NULL; - } + fontHandle = NULL; } } @@ -571,18 +580,9 @@ void QRawFontPrivate::platformLoadFromData(const QByteArray &_fontData, return; } - if (ptrAddFontMemResourceEx == NULL || ptrRemoveFontMemResourceEx == NULL) { - void *func = QSystemLibrary::resolve(QLatin1String("gdi32"), "RemoveFontMemResourceEx"); - ptrRemoveFontMemResourceEx = - reinterpret_cast<QRawFontPrivate::PtrRemoveFontMemResourceEx>(func); - - func = QSystemLibrary::resolve(QLatin1String("gdi32"), "AddFontMemResourceEx"); - ptrAddFontMemResourceEx = - reinterpret_cast<QRawFontPrivate::PtrAddFontMemResourceEx>(func); - } - Q_ASSERT(fontHandle == NULL); - if (ptrAddFontMemResourceEx != NULL && ptrRemoveFontMemResourceEx != NULL) { + resolveGdi32(); + if (ptrAddFontMemResourceEx && ptrRemoveFontMemResourceEx) { DWORD count = 0; fontData = font.data(); fontHandle = ptrAddFontMemResourceEx(fontData.data(), fontData.size(), 0, &count); |