Optimize QWindowsFontEngineDirectWrite::initFontInfo() a bit
authorKonstantin Ritt <ritt.ks@gmail.com>
Sun, 1 Jul 2012 10:10:10 +0000 (13:10 +0300)
committerQt by Nokia <qt-info@nokia.com>
Mon, 2 Jul 2012 23:09:14 +0000 (01:09 +0200)
by using QVarLengthArray instead of allocating memory on a heap
and by skipping a subsequent checks & calls in some cases.

Change-Id: I300d8eaf02ef718ce50833b7c2ca7ebe8cfd0224
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp

index 568de48..80f91ea 100644 (file)
@@ -47,6 +47,7 @@
 
 #include <QtCore/QSettings>
 #include <QtCore/QtEndian>
+#include <QtCore/QVarLengthArray>
 
 #include <dwrite.h>
 #include <d2d1.h>
@@ -680,39 +681,38 @@ void QWindowsFontEngineDirectWrite::initFontInfo(const QFontDef &request,
         hr = fontFamily->GetFamilyNames(&familyNames);
 
     UINT32 index = 0;
-    BOOL exists = false;
-
-    wchar_t localeName[LOCALE_NAME_MAX_LENGTH];
 
     if (SUCCEEDED(hr)) {
-        int defaultLocaleSuccess = GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH);
+        BOOL exists = false;
 
+        wchar_t localeName[LOCALE_NAME_MAX_LENGTH];
+        int defaultLocaleSuccess = GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH);
         if (defaultLocaleSuccess)
             hr = familyNames->FindLocaleName(localeName, &index, &exists);
 
         if (SUCCEEDED(hr) && !exists)
             hr = familyNames->FindLocaleName(L"en-us", &index, &exists);
+
+        if (!exists)
+            index = 0;
     }
 
-    if (!exists)
-        index = 0;
+    // Get the family name.
+    if (SUCCEEDED(hr)) {
+        UINT32 length = 0;
 
-    UINT32 length = 0;
-    if (SUCCEEDED(hr))
         hr = familyNames->GetStringLength(index, &length);
 
-    wchar_t *name = new (std::nothrow) wchar_t[length+1];
-    if (name == NULL)
-        hr = E_OUTOFMEMORY;
+        if (SUCCEEDED(hr)) {
+            QVarLengthArray<wchar_t, 128> name(length+1);
 
-    // Get the family name.
-    if (SUCCEEDED(hr))
-        hr = familyNames->GetString(index, name, length + 1);
+            hr = familyNames->GetString(index, name.data(), name.size());
 
-    if (SUCCEEDED(hr))
-        fontDef.family = QString::fromWCharArray(name);
+            if (SUCCEEDED(hr))
+                fontDef.family = QString::fromWCharArray(name.constData());
+        }
+    }
 
-    delete[] name;
     if (familyNames != NULL)
         familyNames->Release();