static void test_system_fontcollection(void) { IDWriteFontCollection *collection, *coll2; IDWriteFontFamily *family; HRESULT hr; UINT32 i; BOOL ret; hr = IDWriteFactory_GetSystemFontCollection(factory, &collection, FALSE); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IDWriteFactory_GetSystemFontCollection(factory, &coll2, FALSE); ok(hr == S_OK, "got 0x%08x\n", hr); ok(coll2 == collection, "got %p, was %p\n", coll2, collection); IDWriteFontCollection_Release(coll2); hr = IDWriteFactory_GetSystemFontCollection(factory, &coll2, TRUE); ok(hr == S_OK, "got 0x%08x\n", hr); ok(coll2 == collection, "got %p, was %p\n", coll2, collection); IDWriteFontCollection_Release(coll2); i = IDWriteFontCollection_GetFontFamilyCount(collection); ok(i, "got %u\n", i); /* invalid index */ family = (void*)0xdeadbeef; hr = IDWriteFontCollection_GetFontFamily(collection, i, &family); ok(hr == E_FAIL, "got 0x%08x\n", hr); ok(family == NULL, "got %p\n", family); ret = FALSE; i = (UINT32)-1; hr = IDWriteFontCollection_FindFamilyName(collection, tahomaW, &i, &ret); ok(hr == S_OK, "got 0x%08x\n", hr); ok(ret, "got %d\n", ret); ok(i != (UINT32)-1, "got %u\n", i); ret = TRUE; i = 0; hr = IDWriteFontCollection_FindFamilyName(collection, blahW, &i, &ret); ok(hr == S_OK, "got 0x%08x\n", hr); ok(!ret, "got %d\n", ret); ok(i == (UINT32)-1, "got %u\n", i); IDWriteFontCollection_Release(collection); }
static HRESULT WINAPI gdiinterop_CreateFontFromLOGFONT(IDWriteGdiInterop *iface, LOGFONTW const *logfont, IDWriteFont **font) { struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface); IDWriteFontCollection *collection; IDWriteFontFamily *family; DWRITE_FONT_STYLE style; BOOL exists = FALSE; UINT32 index; HRESULT hr; TRACE("(%p)->(%p %p)\n", This, logfont, font); *font = NULL; if (!logfont) return E_INVALIDARG; hr = IDWriteFactory2_GetSystemFontCollection(This->factory, &collection, FALSE); if (FAILED(hr)) { ERR("failed to get system font collection: 0x%08x.\n", hr); return hr; } hr = IDWriteFontCollection_FindFamilyName(collection, logfont->lfFaceName, &index, &exists); if (FAILED(hr)) { IDWriteFontCollection_Release(collection); goto done; } if (!exists) { hr = DWRITE_E_NOFONT; goto done; } hr = IDWriteFontCollection_GetFontFamily(collection, index, &family); if (FAILED(hr)) goto done; style = logfont->lfItalic ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL; hr = IDWriteFontFamily_GetFirstMatchingFont(family, logfont->lfWeight, DWRITE_FONT_STRETCH_NORMAL, style, font); IDWriteFontFamily_Release(family); done: IDWriteFontCollection_Release(collection); return hr; }
static HRESULT WINAPI gdiinterop_ConvertFontToLOGFONT(IDWriteGdiInterop *iface, IDWriteFont *font, LOGFONTW *logfont, BOOL *is_systemfont) { struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface); static const WCHAR enusW[] = {'e','n','-','u','s',0}; DWRITE_FONT_SIMULATIONS simulations; IDWriteFontCollection *collection; IDWriteLocalizedStrings *name; IDWriteFontFamily *family; DWRITE_FONT_STYLE style; UINT32 index; BOOL exists; HRESULT hr; TRACE("(%p)->(%p %p %p)\n", This, font, logfont, is_systemfont); *is_systemfont = FALSE; if (!font) return E_INVALIDARG; hr = IDWriteFont_GetFontFamily(font, &family); if (FAILED(hr)) return hr; hr = IDWriteFontFamily_GetFontCollection(family, &collection); IDWriteFontFamily_Release(family); if (FAILED(hr)) return hr; *is_systemfont = is_system_collection(collection); IDWriteFontCollection_Release(collection); simulations = IDWriteFont_GetSimulations(font); style = IDWriteFont_GetStyle(font); logfont->lfCharSet = DEFAULT_CHARSET; logfont->lfWeight = IDWriteFont_GetWeight(font); logfont->lfItalic = style == DWRITE_FONT_STYLE_ITALIC || (simulations & DWRITE_FONT_SIMULATIONS_OBLIQUE); logfont->lfOutPrecision = OUT_OUTLINE_PRECIS; logfont->lfFaceName[0] = 0; exists = FALSE; hr = IDWriteFont_GetInformationalStrings(font, DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES, &name, &exists); if (FAILED(hr) || !exists) return hr; IDWriteLocalizedStrings_FindLocaleName(name, enusW, &index, &exists); IDWriteLocalizedStrings_GetString(name, index, logfont->lfFaceName, sizeof(logfont->lfFaceName)/sizeof(WCHAR)); IDWriteLocalizedStrings_Release(name); return S_OK; }
static void release_format_data(struct dwrite_textformat_data *data) { if (data->collection) IDWriteFontCollection_Release(data->collection); heap_free(data->family_name); heap_free(data->locale); }