mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-18 16:56:16 +00:00
dwrite: Store factory pointer gdiinterop was created from.
This commit is contained in:
parent
114f32c8b6
commit
ea11f85a94
|
@ -97,7 +97,8 @@ extern HRESULT create_textformat(const WCHAR*,IDWriteFontCollection*,DWRITE_FONT
|
||||||
extern HRESULT create_textlayout(const WCHAR*,UINT32,IDWriteTextFormat*,FLOAT,FLOAT,IDWriteTextLayout**) DECLSPEC_HIDDEN;
|
extern HRESULT create_textlayout(const WCHAR*,UINT32,IDWriteTextFormat*,FLOAT,FLOAT,IDWriteTextLayout**) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT create_trimmingsign(IDWriteInlineObject**) DECLSPEC_HIDDEN;
|
extern HRESULT create_trimmingsign(IDWriteInlineObject**) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT create_typography(IDWriteTypography**) DECLSPEC_HIDDEN;
|
extern HRESULT create_typography(IDWriteTypography**) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT get_gdiinterop(IDWriteGdiInterop**) DECLSPEC_HIDDEN;
|
extern HRESULT create_gdiinterop(IDWriteFactory*,IDWriteGdiInterop**) DECLSPEC_HIDDEN;
|
||||||
|
extern void release_gdiinterop(IDWriteGdiInterop*) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT create_localizedstrings(IDWriteLocalizedStrings**) DECLSPEC_HIDDEN;
|
extern HRESULT create_localizedstrings(IDWriteLocalizedStrings**) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT add_localizedstring(IDWriteLocalizedStrings*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN;
|
extern HRESULT add_localizedstring(IDWriteLocalizedStrings*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **strings) DECLSPEC_HIDDEN;
|
extern HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **strings) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -33,7 +33,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(dwrite);
|
||||||
|
|
||||||
struct gdiinterop {
|
struct gdiinterop {
|
||||||
IDWriteGdiInterop IDWriteGdiInterop_iface;
|
IDWriteGdiInterop IDWriteGdiInterop_iface;
|
||||||
LONG ref;
|
IDWriteFactory *factory;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rendertarget {
|
struct rendertarget {
|
||||||
|
@ -241,7 +241,8 @@ static HRESULT WINAPI gdiinterop_QueryInterface(IDWriteGdiInterop *iface, REFIID
|
||||||
|
|
||||||
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
|
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
|
||||||
|
|
||||||
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDWriteGdiInterop))
|
if (IsEqualIID(riid, &IID_IDWriteGdiInterop) ||
|
||||||
|
IsEqualIID(riid, &IID_IUnknown))
|
||||||
{
|
{
|
||||||
*obj = iface;
|
*obj = iface;
|
||||||
IDWriteGdiInterop_AddRef(iface);
|
IDWriteGdiInterop_AddRef(iface);
|
||||||
|
@ -255,23 +256,15 @@ static HRESULT WINAPI gdiinterop_QueryInterface(IDWriteGdiInterop *iface, REFIID
|
||||||
static ULONG WINAPI gdiinterop_AddRef(IDWriteGdiInterop *iface)
|
static ULONG WINAPI gdiinterop_AddRef(IDWriteGdiInterop *iface)
|
||||||
{
|
{
|
||||||
struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface);
|
struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface);
|
||||||
ULONG ref = InterlockedIncrement(&This->ref);
|
TRACE("(%p)\n", This);
|
||||||
TRACE("(%p)->(%d)\n", This, ref);
|
return IDWriteFactory_AddRef(This->factory);
|
||||||
return ref;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ULONG WINAPI gdiinterop_Release(IDWriteGdiInterop *iface)
|
static ULONG WINAPI gdiinterop_Release(IDWriteGdiInterop *iface)
|
||||||
{
|
{
|
||||||
struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface);
|
struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface);
|
||||||
ULONG ref = InterlockedDecrement(&This->ref);
|
TRACE("(%p)\n", This);
|
||||||
|
return IDWriteFactory_Release(This->factory);
|
||||||
TRACE("(%p)->(%d)\n", This, ref);
|
|
||||||
|
|
||||||
if (!ref)
|
|
||||||
{
|
|
||||||
heap_free(This);
|
|
||||||
}
|
|
||||||
return ref;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI gdiinterop_CreateFontFromLOGFONT(IDWriteGdiInterop *iface,
|
static HRESULT WINAPI gdiinterop_CreateFontFromLOGFONT(IDWriteGdiInterop *iface,
|
||||||
|
@ -328,7 +321,7 @@ static const struct IDWriteGdiInteropVtbl gdiinteropvtbl = {
|
||||||
gdiinterop_CreateBitmapRenderTarget
|
gdiinterop_CreateBitmapRenderTarget
|
||||||
};
|
};
|
||||||
|
|
||||||
HRESULT get_gdiinterop(IDWriteGdiInterop **ret)
|
HRESULT create_gdiinterop(IDWriteFactory *factory, IDWriteGdiInterop **ret)
|
||||||
{
|
{
|
||||||
struct gdiinterop *This;
|
struct gdiinterop *This;
|
||||||
|
|
||||||
|
@ -338,8 +331,14 @@ HRESULT get_gdiinterop(IDWriteGdiInterop **ret)
|
||||||
if (!This) return E_OUTOFMEMORY;
|
if (!This) return E_OUTOFMEMORY;
|
||||||
|
|
||||||
This->IDWriteGdiInterop_iface.lpVtbl = &gdiinteropvtbl;
|
This->IDWriteGdiInterop_iface.lpVtbl = &gdiinteropvtbl;
|
||||||
This->ref = 1;
|
This->factory = factory;
|
||||||
|
|
||||||
*ret= &This->IDWriteGdiInterop_iface;
|
*ret= &This->IDWriteGdiInterop_iface;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void release_gdiinterop(IDWriteGdiInterop *iface)
|
||||||
|
{
|
||||||
|
struct gdiinterop *interop = impl_from_IDWriteGdiInterop(iface);
|
||||||
|
heap_free(interop);
|
||||||
|
}
|
||||||
|
|
|
@ -397,6 +397,7 @@ struct dwritefactory {
|
||||||
|
|
||||||
IDWriteLocalFontFileLoader* localfontfileloader;
|
IDWriteLocalFontFileLoader* localfontfileloader;
|
||||||
IDWriteFontCollection *system_collection;
|
IDWriteFontCollection *system_collection;
|
||||||
|
IDWriteGdiInterop *gdiinterop;
|
||||||
|
|
||||||
IDWriteFontCollectionLoader **loaders;
|
IDWriteFontCollectionLoader **loaders;
|
||||||
LONG loader_count;
|
LONG loader_count;
|
||||||
|
@ -425,6 +426,8 @@ static void release_dwritefactory(struct dwritefactory *factory)
|
||||||
heap_free(factory->file_loaders);
|
heap_free(factory->file_loaders);
|
||||||
if (factory->system_collection)
|
if (factory->system_collection)
|
||||||
IDWriteFontCollection_Release(factory->system_collection);
|
IDWriteFontCollection_Release(factory->system_collection);
|
||||||
|
if (factory->gdiinterop)
|
||||||
|
release_gdiinterop(factory->gdiinterop);
|
||||||
heap_free(factory);
|
heap_free(factory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -727,8 +730,21 @@ static HRESULT WINAPI dwritefactory_CreateTypography(IDWriteFactory *iface, IDWr
|
||||||
static HRESULT WINAPI dwritefactory_GetGdiInterop(IDWriteFactory *iface, IDWriteGdiInterop **gdi_interop)
|
static HRESULT WINAPI dwritefactory_GetGdiInterop(IDWriteFactory *iface, IDWriteGdiInterop **gdi_interop)
|
||||||
{
|
{
|
||||||
struct dwritefactory *This = impl_from_IDWriteFactory(iface);
|
struct dwritefactory *This = impl_from_IDWriteFactory(iface);
|
||||||
|
|
||||||
TRACE("(%p)->(%p)\n", This, gdi_interop);
|
TRACE("(%p)->(%p)\n", This, gdi_interop);
|
||||||
return get_gdiinterop(gdi_interop);
|
|
||||||
|
*gdi_interop = NULL;
|
||||||
|
|
||||||
|
if (!This->gdiinterop) {
|
||||||
|
HRESULT hr = create_gdiinterop(iface, &This->gdiinterop);
|
||||||
|
if (FAILED(hr))
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
*gdi_interop = This->gdiinterop;
|
||||||
|
IDWriteGdiInterop_AddRef(*gdi_interop);
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI dwritefactory_CreateTextLayout(IDWriteFactory *iface, WCHAR const* string,
|
static HRESULT WINAPI dwritefactory_CreateTextLayout(IDWriteFactory *iface, WCHAR const* string,
|
||||||
|
@ -864,6 +880,7 @@ static HRESULT init_dwritefactory(struct dwritefactory *factory, const struct ID
|
||||||
factory->file_loader_count = 2;
|
factory->file_loader_count = 2;
|
||||||
factory->file_loaders = heap_alloc_zero(sizeof(*factory->file_loaders) * 2);
|
factory->file_loaders = heap_alloc_zero(sizeof(*factory->file_loaders) * 2);
|
||||||
factory->system_collection = NULL;
|
factory->system_collection = NULL;
|
||||||
|
factory->gdiinterop = NULL;
|
||||||
|
|
||||||
if (!factory->loaders || !factory->file_loaders) {
|
if (!factory->loaders || !factory->file_loaders) {
|
||||||
heap_free(factory->loaders);
|
heap_free(factory->loaders);
|
||||||
|
|
|
@ -509,15 +509,20 @@ if (0) /* crashes on native */
|
||||||
|
|
||||||
static void test_GetFontFamily(void)
|
static void test_GetFontFamily(void)
|
||||||
{
|
{
|
||||||
|
IDWriteFontCollection *collection, *collection2;
|
||||||
|
IDWriteFontCollection *syscoll;
|
||||||
IDWriteFontFamily *family, *family2;
|
IDWriteFontFamily *family, *family2;
|
||||||
IDWriteGdiInterop *interop;
|
IDWriteGdiInterop *interop;
|
||||||
IDWriteFont *font;
|
IDWriteFont *font, *font2;
|
||||||
LOGFONTW logfont;
|
LOGFONTW logfont;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
hr = IDWriteFactory_GetGdiInterop(factory, &interop);
|
hr = IDWriteFactory_GetGdiInterop(factory, &interop);
|
||||||
EXPECT_HR(hr, S_OK);
|
EXPECT_HR(hr, S_OK);
|
||||||
|
|
||||||
|
hr = IDWriteFactory_GetSystemFontCollection(factory, &syscoll, FALSE);
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
memset(&logfont, 0, sizeof(logfont));
|
memset(&logfont, 0, sizeof(logfont));
|
||||||
logfont.lfHeight = 12;
|
logfont.lfHeight = 12;
|
||||||
logfont.lfWidth = 12;
|
logfont.lfWidth = 12;
|
||||||
|
@ -526,7 +531,11 @@ static void test_GetFontFamily(void)
|
||||||
lstrcpyW(logfont.lfFaceName, tahomaW);
|
lstrcpyW(logfont.lfFaceName, tahomaW);
|
||||||
|
|
||||||
hr = IDWriteGdiInterop_CreateFontFromLOGFONT(interop, &logfont, &font);
|
hr = IDWriteGdiInterop_CreateFontFromLOGFONT(interop, &logfont, &font);
|
||||||
EXPECT_HR(hr, S_OK);
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
hr = IDWriteGdiInterop_CreateFontFromLOGFONT(interop, &logfont, &font2);
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
ok(font2 != font, "got %p, %p\n", font2, font);
|
||||||
|
|
||||||
if (0) /* crashes on native */
|
if (0) /* crashes on native */
|
||||||
hr = IDWriteFont_GetFontFamily(font, NULL);
|
hr = IDWriteFont_GetFontFamily(font, NULL);
|
||||||
|
@ -548,8 +557,32 @@ if (0) /* crashes on native */
|
||||||
EXPECT_HR(hr, E_NOINTERFACE);
|
EXPECT_HR(hr, E_NOINTERFACE);
|
||||||
ok(family2 == NULL, "got %p\n", family2);
|
ok(family2 == NULL, "got %p\n", family2);
|
||||||
|
|
||||||
|
hr = IDWriteFont_GetFontFamily(font2, &family2);
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
ok(family2 != family, "got %p, %p\n", family2, family);
|
||||||
|
|
||||||
|
collection = NULL;
|
||||||
|
hr = IDWriteFontFamily_GetFontCollection(family, &collection);
|
||||||
|
todo_wine
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
collection2 = NULL;
|
||||||
|
hr = IDWriteFontFamily_GetFontCollection(family2, &collection2);
|
||||||
|
todo_wine
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
ok(collection == collection2, "got %p, %p\n", collection, collection2);
|
||||||
|
todo_wine
|
||||||
|
ok(collection == syscoll, "got %p, %p\n", collection, syscoll);
|
||||||
|
|
||||||
|
IDWriteFontCollection_Release(syscoll);
|
||||||
|
if (collection2)
|
||||||
|
IDWriteFontCollection_Release(collection2);
|
||||||
|
if (collection)
|
||||||
|
IDWriteFontCollection_Release(collection);
|
||||||
|
IDWriteFontFamily_Release(family2);
|
||||||
IDWriteFontFamily_Release(family);
|
IDWriteFontFamily_Release(family);
|
||||||
IDWriteFont_Release(font);
|
IDWriteFont_Release(font);
|
||||||
|
IDWriteFont_Release(font2);
|
||||||
IDWriteGdiInterop_Release(interop);
|
IDWriteGdiInterop_Release(interop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1276,6 +1309,110 @@ static void test_GetFirstMatchingFont(void)
|
||||||
IDWriteFontCollection_Release(collection);
|
IDWriteFontCollection_Release(collection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_GetInformationalStrings(void)
|
||||||
|
{
|
||||||
|
IDWriteLocalizedStrings *strings, *strings2;
|
||||||
|
IDWriteFontCollection *collection;
|
||||||
|
IDWriteFontFamily *family;
|
||||||
|
IDWriteFont *font;
|
||||||
|
BOOL exists;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
hr = IDWriteFactory_GetSystemFontCollection(factory, &collection, FALSE);
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
hr = IDWriteFontCollection_GetFontFamily(collection, 0, &family);
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
hr = IDWriteFontFamily_GetFirstMatchingFont(family, DWRITE_FONT_WEIGHT_NORMAL,
|
||||||
|
DWRITE_FONT_STRETCH_NORMAL, DWRITE_FONT_STYLE_NORMAL, &font);
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
exists = TRUE;
|
||||||
|
strings = (void*)0xdeadbeef;
|
||||||
|
hr = IDWriteFont_GetInformationalStrings(font, DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_CID_NAME+1, &strings, &exists);
|
||||||
|
todo_wine {
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
ok(exists == FALSE, "got %d\n", exists);
|
||||||
|
ok(strings == NULL, "got %p\n", strings);
|
||||||
|
}
|
||||||
|
exists = FALSE;
|
||||||
|
strings = NULL;
|
||||||
|
hr = IDWriteFont_GetInformationalStrings(font, DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES, &strings, &exists);
|
||||||
|
todo_wine {
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
ok(exists == TRUE, "got %d\n", exists);
|
||||||
|
}
|
||||||
|
|
||||||
|
exists = TRUE;
|
||||||
|
strings = NULL;
|
||||||
|
hr = IDWriteFont_GetInformationalStrings(font, DWRITE_INFORMATIONAL_STRING_NONE, &strings, &exists);
|
||||||
|
todo_wine {
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
ok(exists == FALSE, "got %d\n", exists);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* strings instance is not reused */
|
||||||
|
strings2 = NULL;
|
||||||
|
hr = IDWriteFont_GetInformationalStrings(font, DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES, &strings2, &exists);
|
||||||
|
todo_wine {
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
ok(strings2 != strings, "got %p, %p\n", strings2, strings);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strings)
|
||||||
|
IDWriteLocalizedStrings_Release(strings);
|
||||||
|
if (strings2)
|
||||||
|
IDWriteLocalizedStrings_Release(strings2);
|
||||||
|
IDWriteFont_Release(font);
|
||||||
|
IDWriteFontFamily_Release(family);
|
||||||
|
IDWriteFontCollection_Release(collection);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_GetGdiInterop(void)
|
||||||
|
{
|
||||||
|
IDWriteGdiInterop *interop, *interop2;
|
||||||
|
IDWriteFactory *factory2;
|
||||||
|
IDWriteFont *font;
|
||||||
|
LOGFONTW logfont;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
interop = NULL;
|
||||||
|
hr = IDWriteFactory_GetGdiInterop(factory, &interop);
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
interop2 = NULL;
|
||||||
|
hr = IDWriteFactory_GetGdiInterop(factory, &interop2);
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
ok(interop == interop2, "got %p, %p\n", interop, interop2);
|
||||||
|
IDWriteGdiInterop_Release(interop2);
|
||||||
|
|
||||||
|
hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_ISOLATED, &IID_IDWriteFactory, (IUnknown**)&factory2);
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
/* each factory gets its own interop */
|
||||||
|
interop2 = NULL;
|
||||||
|
hr = IDWriteFactory_GetGdiInterop(factory2, &interop2);
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
ok(interop != interop2, "got %p, %p\n", interop, interop2);
|
||||||
|
|
||||||
|
/* release factory - interop still works */
|
||||||
|
IDWriteFactory_Release(factory2);
|
||||||
|
|
||||||
|
memset(&logfont, 0, sizeof(logfont));
|
||||||
|
logfont.lfHeight = 12;
|
||||||
|
logfont.lfWidth = 12;
|
||||||
|
logfont.lfWeight = FW_NORMAL;
|
||||||
|
logfont.lfItalic = 1;
|
||||||
|
lstrcpyW(logfont.lfFaceName, tahomaW);
|
||||||
|
|
||||||
|
hr = IDWriteGdiInterop_CreateFontFromLOGFONT(interop2, &logfont, &font);
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
IDWriteGdiInterop_Release(interop2);
|
||||||
|
IDWriteGdiInterop_Release(interop);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(font)
|
START_TEST(font)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
@ -1303,6 +1440,8 @@ START_TEST(font)
|
||||||
test_GetUnicodeRanges();
|
test_GetUnicodeRanges();
|
||||||
test_GetFontFromFontFace();
|
test_GetFontFromFontFace();
|
||||||
test_GetFirstMatchingFont();
|
test_GetFirstMatchingFont();
|
||||||
|
test_GetInformationalStrings();
|
||||||
|
test_GetGdiInterop();
|
||||||
|
|
||||||
IDWriteFactory_Release(factory);
|
IDWriteFactory_Release(factory);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue