summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonstantin Ritt <ritt.ks@gmail.com>2011-09-02 11:58:46 (GMT)
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>2011-09-02 11:58:46 (GMT)
commitab31160c72ea7e7b03604c87ecac11d756da9dce (patch)
treea7821d15bcb6651912bf0558a9446aa17ce6875b
parent3926aa4b69caa9037d610b4e212d99dae86d500c (diff)
downloadQt-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.h17
-rw-r--r--src/gui/text/qrawfont_win.cpp46
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);