Module: wine Branch: master Commit: fe81deae10a41d0d72a8abfb7e92af7108c3476e URL: http://source.winehq.org/git/wine.git/?a=commit;h=fe81deae10a41d0d72a8abfb7e...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Mon Dec 1 13:22:51 2014 +0300
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 5e82b81..135ea4d 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; }