Update DirectWrite code so that it is loadable on XP.

This change delay loads GetUserDefaultLocaleName since it is available
in Vista+.

R=reed@google.com

Review URL: https://codereview.chromium.org/23380002

git-svn-id: http://skia.googlecode.com/svn/trunk/src@10847 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/ports/SkFontHost_win_dw.cpp b/ports/SkFontHost_win_dw.cpp
index e1685e6..fe246db 100644
--- a/ports/SkFontHost_win_dw.cpp
+++ b/ports/SkFontHost_win_dw.cpp
@@ -97,12 +97,6 @@
     SkTDArray<uint8_t> fBits;
 };
 
-typedef HRESULT (WINAPI *DWriteCreateFactoryProc)(
-    __in DWRITE_FACTORY_TYPE factoryType,
-    __in REFIID iid,
-    __out IUnknown **factory
-);
-
 static HRESULT get_dwrite_factory(IDWriteFactory** factory) {
     static IDWriteFactory* gDWriteFactory = NULL;
 
@@ -111,6 +105,7 @@
         return S_OK;
     }
 
+    typedef decltype(DWriteCreateFactory)* DWriteCreateFactoryProc;
     DWriteCreateFactoryProc dWriteCreateFactoryProc =
         reinterpret_cast<DWriteCreateFactoryProc>(
             GetProcAddress(LoadLibraryW(L"dwrite.dll"), "DWriteCreateFactory")
@@ -1847,6 +1842,13 @@
 
 #endif
 
+typedef decltype(GetUserDefaultLocaleName)* GetUserDefaultLocaleNameProc;
+static GetUserDefaultLocaleNameProc GetGetUserDefaultLocaleNameProc() {
+    return reinterpret_cast<GetUserDefaultLocaleNameProc>(
+        GetProcAddress(LoadLibraryW(L"Kernel32.dll"), "GetUserDefaultLocaleName")
+    );
+}
+
 SkFontMgr* SkFontMgr::Factory() {
     IDWriteFactory* factory;
     HRNM(get_dwrite_factory(&factory), "Could not get factory.");
@@ -1857,10 +1859,18 @@
 
     WCHAR localeNameStorage[LOCALE_NAME_MAX_LENGTH];
     WCHAR* localeName = NULL;
-    int localeNameLen = GetUserDefaultLocaleName(localeNameStorage, LOCALE_NAME_MAX_LENGTH);
-    if (localeNameLen) {
-        localeName = localeNameStorage;
-    };
+    int localeNameLen = 0;
+
+    // Dynamically load GetUserDefaultLocaleName function, as it is not available on XP.
+    GetUserDefaultLocaleNameProc getUserDefaultLocaleNameProc = GetGetUserDefaultLocaleNameProc();
+    if (NULL == getUserDefaultLocaleNameProc) {
+        SkDebugf("Could not get GetUserDefaultLocaleName.");
+    } else {
+        localeNameLen = getUserDefaultLocaleNameProc(localeNameStorage, LOCALE_NAME_MAX_LENGTH);
+        if (localeNameLen) {
+            localeName = localeNameStorage;
+        };
+    }
 
     return SkNEW_ARGS(SkFontMgr_DirectWrite, (sysFontCollection.get(), localeName, localeNameLen));
 }