dwrite/tests: Add CreateFontFaceFromHdc() test for in-memory font.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2018-11-19 12:27:36 +03:00 committed by Alexandre Julliard
parent 0c38f73486
commit 5ac5154c3d
1 changed files with 154 additions and 4 deletions

View File

@ -3711,16 +3711,52 @@ static void test_GetGdiInterop(void)
ok(ref == 0, "factory not released, %u\n", ref);
}
static void *map_font_file(const WCHAR *filename, DWORD *file_size)
{
HANDLE file, mapping;
void *ptr;
file = CreateFileW(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
if (file == INVALID_HANDLE_VALUE) return NULL;
*file_size = GetFileSize(file, NULL);
mapping = CreateFileMappingA(file, NULL, PAGE_READONLY, 0, 0, NULL);
if (!mapping)
{
CloseHandle(file);
return NULL;
}
ptr = MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);
CloseHandle(file);
CloseHandle(mapping);
return ptr;
}
static void test_CreateFontFaceFromHdc(void)
{
IDWriteFontFileStream *stream, *stream2;
void *font_data, *fragment_context;
const void *refkey, *fragment;
IDWriteFontFileLoader *loader;
DWORD data_size, num_fonts;
IDWriteGdiInterop *interop;
IDWriteFontFace *fontface;
IDWriteFactory *factory;
UINT64 size, writetime;
IDWriteFontFile *file;
HFONT hfont, oldhfont;
LOGFONTW logfont;
HANDLE resource;
IUnknown *unk;
UINT32 count;
LOGFONTA lf;
WCHAR *path;
HRESULT hr;
ULONG ref;
BOOL ret;
HDC hdc;
factory = create_factory();
@ -3771,8 +3807,91 @@ static void test_CreateFontFaceFromHdc(void)
ok(fontface == NULL, "got %p\n", fontface);
DeleteObject(SelectObject(hdc, oldhfont));
DeleteDC(hdc);
/* Memory resource font */
path = create_testfontfile(test_fontfile);
data_size = 0;
font_data = map_font_file(path, &data_size);
num_fonts = 0;
resource = AddFontMemResourceEx(font_data, data_size, NULL, &num_fonts);
ok(resource != NULL, "Failed to add memory resource font, %d.\n", GetLastError());
ok(num_fonts == 1, "Unexpected number of fonts.\n");
memset(&lf, 0, sizeof(lf));
lf.lfHeight = -12;
strcpy(lf.lfFaceName, "wine_test");
hfont = CreateFontIndirectA(&lf);
ok(hfont != NULL, "Failed to create a font.\n");
oldhfont = SelectObject(hdc, hfont);
hr = IDWriteGdiInterop_CreateFontFaceFromHdc(interop, hdc, &fontface);
todo_wine
ok(hr == S_OK, "Failed to create fontface, hr %#x.\n", hr);
if (fontface)
{
count = 1;
hr = IDWriteFontFace_GetFiles(fontface, &count, &file);
ok(hr == S_OK, "Failed to get font files, hr %#x.\n", hr);
hr = IDWriteFontFile_GetLoader(file, &loader);
ok(hr == S_OK, "Failed to get file loader, hr %#x.\n", hr);
hr = IDWriteFactory_RegisterFontFileLoader(factory, loader);
ok(hr == DWRITE_E_ALREADYREGISTERED, "Unexpected hr %#x.\n", hr);
hr = IDWriteFontFileLoader_QueryInterface(loader, &IID_IDWriteInMemoryFontFileLoader, (void **)&unk);
ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
hr = IDWriteFontFileLoader_QueryInterface(loader, &IID_IDWriteLocalFontFileLoader, (void **)&unk);
ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
count = 0;
hr = IDWriteFontFile_GetReferenceKey(file, &refkey, &count);
ok(hr == S_OK, "Failed to get ref key, hr %#x.\n", hr);
ok(count > 0, "Unexpected key length %u.\n", count);
hr = IDWriteFontFileLoader_CreateStreamFromKey(loader, refkey, count, &stream);
ok(hr == S_OK, "Failed to create file stream, hr %#x.\n", hr);
hr = IDWriteFontFileLoader_CreateStreamFromKey(loader, refkey, count, &stream2);
ok(hr == S_OK, "Failed to create file stream, hr %#x.\n", hr);
ok(stream2 != stream, "Unexpected stream instance.\n");
IDWriteFontFileStream_Release(stream2);
hr = IDWriteFontFileStream_GetFileSize(stream, &size);
ok(hr == S_OK, "Failed to get stream size, hr %#x.\n", hr);
ok(size == data_size, "Unexpected stream size.\n");
hr = IDWriteFontFileStream_GetLastWriteTime(stream, &writetime);
ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
fragment_context = NULL;
hr = IDWriteFontFileStream_ReadFileFragment(stream, &fragment, 0, size, &fragment_context);
ok(hr == S_OK, "Failed to read fragment, hr %#x.\n", hr);
ok(fragment_context != NULL, "Unexpected context %p.\n", fragment_context);
ok(fragment == fragment_context, "Unexpected data pointer %p, context %p.\n", fragment, fragment_context);
IDWriteFontFileStream_ReleaseFileFragment(stream, fragment_context);
IDWriteFontFileStream_Release(stream);
IDWriteFontFileLoader_Release(loader);
IDWriteFontFile_Release(file);
IDWriteFontFace_Release(fontface);
}
ret = RemoveFontMemResourceEx(resource);
ok(ret, "Failed to remove memory resource font, %d.\n", GetLastError());
UnmapViewOfFile(font_data);
DELETE_FONTFILE(path);
DeleteObject(SelectObject(hdc, oldhfont));
DeleteDC(hdc);
IDWriteGdiInterop_Release(interop);
ref = IDWriteFactory_Release(factory);
ok(ref == 0, "factory not released, %u\n", ref);
@ -7935,6 +8054,7 @@ static void test_inmemory_file_loader(void)
hr = IDWriteInMemoryFontFileLoader_CreateStreamFromKey(inmemory, &ref_key, sizeof(ref_key), &stream2);
ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
/* With owner object. */
hr = IDWriteInMemoryFontFileLoader_CreateInMemoryFontFileReference(inmemory, (IDWriteFactory *)factory, data,
file_size, &ownerobject.IUnknown_iface, &file);
ok(hr == S_OK, "Failed to create in-memory file reference, hr %#x.\n", hr);
@ -7946,7 +8066,7 @@ static void test_inmemory_file_loader(void)
context2 = (void *)0xdeadbeef;
hr = IDWriteFontFileStream_ReadFileFragment(stream2, &frag_start, 0, file_size, &context2);
ok(hr == S_OK, "Failed to read a fragment, hr %#x.\n", hr);
ok(context == NULL, "Unexpected context %p.\n", context2);
ok(context2 == NULL, "Unexpected context %p.\n", context2);
ok(frag_start == data, "Unexpected fragment pointer %p.\n", frag_start);
hr = IDWriteFontFileStream_GetFileSize(stream2, &size);
@ -7962,6 +8082,36 @@ static void test_inmemory_file_loader(void)
IDWriteFontFileStream_Release(stream2);
/* Without owner object. */
hr = IDWriteInMemoryFontFileLoader_CreateInMemoryFontFileReference(inmemory, (IDWriteFactory *)factory, data,
file_size, NULL, &file2);
ok(hr == S_OK, "Failed to create in-memory file reference, hr %#x.\n", hr);
ref_key = 1;
hr = IDWriteInMemoryFontFileLoader_CreateStreamFromKey(inmemory, &ref_key, sizeof(ref_key), &stream2);
ok(hr == S_OK, "Failed to create a stream, hr %#x.\n", hr);
context2 = (void *)0xdeadbeef;
hr = IDWriteFontFileStream_ReadFileFragment(stream2, &frag_start, 0, file_size, &context2);
ok(hr == S_OK, "Failed to read a fragment, hr %#x.\n", hr);
ok(context2 == NULL, "Unexpected context %p.\n", context2);
ok(frag_start != data, "Unexpected fragment pointer %p.\n", frag_start);
hr = IDWriteFontFileStream_GetFileSize(stream2, &size);
ok(hr == S_OK, "Failed to get file size, hr %#x.\n", hr);
ok(size == file_size, "Unexpected file size.\n");
IDWriteFontFileStream_ReleaseFileFragment(stream2, context2);
writetime = 1;
hr = IDWriteFontFileStream_GetLastWriteTime(stream2, &writetime);
ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
ok(writetime == 0, "Unexpected writetime.\n");
IDWriteFontFileStream_Release(stream2);
IDWriteFontFile_Release(file2);
/* Key size validation. */
ref_key = 0;
hr = IDWriteInMemoryFontFileLoader_CreateStreamFromKey(inmemory, NULL, sizeof(ref_key) - 1, &stream2);
ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
@ -7975,7 +8125,7 @@ static void test_inmemory_file_loader(void)
ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
count = IDWriteInMemoryFontFileLoader_GetFileCount(inmemory);
ok(count == 1, "Unexpected file count %u.\n", count);
ok(count == 2, "Unexpected file count %u.\n", count);
hr = IDWriteFontFile_GetReferenceKey(file, &key, &key_size);
ok(hr == S_OK, "Failed to get reference key, hr %#x.\n", hr);
@ -7986,7 +8136,7 @@ static void test_inmemory_file_loader(void)
IDWriteFontFile_Release(file);
count = IDWriteInMemoryFontFileLoader_GetFileCount(inmemory);
ok(count == 1, "Unexpected file count %u.\n", count);
ok(count == 2, "Unexpected file count %u.\n", count);
hr = IDWriteFactory5_UnregisterFontFileLoader(factory, (IDWriteFontFileLoader *)inmemory);
ok(hr == S_OK, "Failed to unregister loader, hr %#x.\n", hr);