From fe81deae10a41d0d72a8abfb7e92af7108c3476e Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 1 Dec 2014 13:22:51 +0300 Subject: [PATCH] dwrite: Make fonts installed in Fonts dir accessible through system collection. --- dlls/dwrite/font.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 5e82b81eecc..135ea4d0669 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -1660,8 +1660,8 @@ static HRESULT WINAPI systemfontfileenumerator_GetCurrentFontFile(IDWriteFontFil { struct system_fontfile_enumerator *enumerator = impl_from_IDWriteFontFileEnumerator(iface); DWORD ret, type, count; + WCHAR *filename; HRESULT hr; - BYTE *data; *file = NULL; @@ -1671,17 +1671,30 @@ static HRESULT WINAPI systemfontfileenumerator_GetCurrentFontFile(IDWriteFontFil if (RegEnumValueW(enumerator->hkey, enumerator->index, NULL, NULL, NULL, &type, NULL, &count)) return E_FAIL; - if (!(data = heap_alloc(count))) + if (!(filename = heap_alloc(count))) return E_OUTOFMEMORY; - ret = RegEnumValueW(enumerator->hkey, enumerator->index, NULL, NULL, NULL, &type, data, &count); + ret = RegEnumValueW(enumerator->hkey, enumerator->index, NULL, NULL, NULL, &type, (BYTE*)filename, &count); if (ret) { - heap_free(data); + heap_free(filename); return E_FAIL; } - hr = IDWriteFactory_CreateFontFileReference(enumerator->factory, (WCHAR*)data, NULL, file); - heap_free(data); + /* Fonts installed in 'Fonts' system dir don't get full path in registry font files cache */ + if (!strchrW(filename, '\\')) { + static const WCHAR fontsW[] = {'\\','f','o','n','t','s','\\',0}; + WCHAR fullpathW[MAX_PATH]; + + GetWindowsDirectoryW(fullpathW, sizeof(fullpathW)/sizeof(WCHAR)); + strcatW(fullpathW, fontsW); + strcatW(fullpathW, filename); + + hr = IDWriteFactory_CreateFontFileReference(enumerator->factory, fullpathW, NULL, file); + } + else + hr = IDWriteFactory_CreateFontFileReference(enumerator->factory, filename, NULL, file); + + heap_free(filename); return hr; }