From e7f6d77919f75e7a2cabf6f901087eba009a2ccf Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Wed, 6 Nov 2013 12:44:21 +0900 Subject: [PATCH] gdiplus: Implement GdipPrivateAddFontFile. --- dlls/gdiplus/font.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/dlls/gdiplus/font.c b/dlls/gdiplus/font.c index a6c79248a0a..a811a60b7fa 100644 --- a/dlls/gdiplus/font.c +++ b/dlls/gdiplus/font.c @@ -1127,15 +1127,39 @@ GpStatus WINGDIPAPI GdipDeletePrivateFontCollection(GpFontCollection **fontColle /***************************************************************************** * GdipPrivateAddFontFile [GDIPLUS.@] */ -GpStatus WINGDIPAPI GdipPrivateAddFontFile(GpFontCollection* fontCollection, - GDIPCONST WCHAR* filename) +GpStatus WINGDIPAPI GdipPrivateAddFontFile(GpFontCollection *collection, GDIPCONST WCHAR *name) { - FIXME("stub: %p, %s\n", fontCollection, debugstr_w(filename)); + HANDLE file, mapping; + LARGE_INTEGER size; + void *mem; + GpStatus status; - if (!(fontCollection && filename)) + TRACE("%p, %s\n", collection, debugstr_w(name)); + + if (!collection || !name) return InvalidParameter; + + file = CreateFileW(name, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); + if (file == INVALID_HANDLE_VALUE) return InvalidParameter; + + if (!GetFileSizeEx(file, &size) || size.u.HighPart) + { + CloseHandle(file); return InvalidParameter; + } - return NotImplemented; + mapping = CreateFileMappingW(file, NULL, PAGE_READONLY, 0, 0, NULL); + CloseHandle(file); + if (!mapping) return InvalidParameter; + + mem = MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0); + CloseHandle(mapping); + if (!mem) return InvalidParameter; + + /* GdipPrivateAddMemoryFont creates a copy of the memory block */ + status = GdipPrivateAddMemoryFont(collection, mem, size.u.LowPart); + UnmapViewOfFile(mem); + + return status; } #define TT_PLATFORM_APPLE_UNICODE 0