dwrite: Initial implementation of CreateCustomFontFileReference.

This commit is contained in:
Aric Stewart 2014-08-12 14:11:34 -05:00 committed by Alexandre Julliard
parent a254741b36
commit bb9721bd29
4 changed files with 144 additions and 2 deletions

View file

@ -89,3 +89,4 @@ extern HRESULT add_localizedstring(IDWriteLocalizedStrings*,const WCHAR*,const W
extern HRESULT get_system_fontcollection(IDWriteFontCollection**) DECLSPEC_HIDDEN;
extern void release_system_fontcollection(void) DECLSPEC_HIDDEN;
extern HRESULT get_textanalyzer(IDWriteTextAnalyzer**) DECLSPEC_HIDDEN;
extern HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *reference_key, UINT32 key_size, IDWriteFontFile **font_file) DECLSPEC_HIDDEN;

View file

@ -162,6 +162,15 @@ struct dwrite_fontface {
LOGFONTW logfont;
};
struct dwrite_fontfile {
IDWriteFontFile IDWriteFontFile_iface;
LONG ref;
IDWriteFontFileLoader *loader;
void *reference_key;
UINT32 key_size;
};
static HRESULT create_fontfamily(const WCHAR *familyname, IDWriteFontFamily **family);
static inline struct dwrite_fontface *impl_from_IDWriteFontFace(IDWriteFontFace *iface)
@ -174,6 +183,11 @@ static inline struct dwrite_font *impl_from_IDWriteFont(IDWriteFont *iface)
return CONTAINING_RECORD(iface, struct dwrite_font, IDWriteFont_iface);
}
static inline struct dwrite_fontfile *impl_from_IDWriteFontFile(IDWriteFontFile *iface)
{
return CONTAINING_RECORD(iface, struct dwrite_fontfile, IDWriteFontFile_iface);
}
static inline struct dwrite_fontfamily *impl_from_IDWriteFontFamily(IDWriteFontFamily *iface)
{
return CONTAINING_RECORD(iface, struct dwrite_fontfamily, IDWriteFontFamily_iface);
@ -978,3 +992,101 @@ HRESULT create_font_from_logfont(const LOGFONTW *logfont, IDWriteFont **font)
return S_OK;
}
static HRESULT WINAPI dwritefontfile_QueryInterface(IDWriteFontFile *iface, REFIID riid, void **obj)
{
struct dwrite_fontfile *This = impl_from_IDWriteFontFile(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDWriteFontFile))
{
*obj = iface;
IDWriteFontFile_AddRef(iface);
return S_OK;
}
*obj = NULL;
return E_NOINTERFACE;
}
static ULONG WINAPI dwritefontfile_AddRef(IDWriteFontFile *iface)
{
struct dwrite_fontfile *This = impl_from_IDWriteFontFile(iface);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)->(%d)\n", This, ref);
return ref;
}
static ULONG WINAPI dwritefontfile_Release(IDWriteFontFile *iface)
{
struct dwrite_fontfile *This = impl_from_IDWriteFontFile(iface);
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p)->(%d)\n", This, ref);
if (!ref)
{
IDWriteFontFileLoader_Release(This->loader);
heap_free(This->reference_key);
heap_free(This);
}
return ref;
}
static HRESULT WINAPI dwritefontfile_GetReferenceKey(IDWriteFontFile *iface, const void **fontFileReferenceKey, UINT32 *fontFileReferenceKeySize)
{
struct dwrite_fontfile *This = impl_from_IDWriteFontFile(iface);
TRACE("(%p)->(%p, %p)\n", This, fontFileReferenceKey, fontFileReferenceKeySize);
*fontFileReferenceKey = This->reference_key;
*fontFileReferenceKeySize = This->key_size;
return S_OK;
}
static HRESULT WINAPI dwritefontfile_GetLoader(IDWriteFontFile *iface, IDWriteFontFileLoader **fontFileLoader)
{
struct dwrite_fontfile *This = impl_from_IDWriteFontFile(iface);
TRACE("(%p)->(%p)\n", This, fontFileLoader);
*fontFileLoader = This->loader;
IDWriteFontFileLoader_AddRef(This->loader);
return S_OK;
}
static HRESULT WINAPI dwritefontfile_Analyze(IDWriteFontFile *iface, BOOL *isSupportedFontType, DWRITE_FONT_FILE_TYPE *fontFileType, DWRITE_FONT_FACE_TYPE *fontFaceType, UINT32 *numberOfFaces)
{
struct dwrite_fontfile *This = impl_from_IDWriteFontFile(iface);
FIXME("(%p)->(%p, %p, %p, %p): Stub\n", This, isSupportedFontType, fontFileType, fontFaceType, numberOfFaces);
return E_NOTIMPL;
}
static const IDWriteFontFileVtbl dwritefontfilevtbl = {
dwritefontfile_QueryInterface,
dwritefontfile_AddRef,
dwritefontfile_Release,
dwritefontfile_GetReferenceKey,
dwritefontfile_GetLoader,
dwritefontfile_Analyze,
};
HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *reference_key, UINT32 key_size, IDWriteFontFile **font_file)
{
struct dwrite_fontfile *This;
This = heap_alloc(sizeof(struct dwrite_fontfile));
if (!This) return E_OUTOFMEMORY;
This->IDWriteFontFile_iface.lpVtbl = &dwritefontfilevtbl;
This->ref = 1;
IDWriteFontFileLoader_AddRef(loader);
This->loader = loader;
This->reference_key = heap_alloc(key_size);
memcpy(This->reference_key, reference_key, key_size);
This->key_size = key_size;
*font_file = &This->IDWriteFontFile_iface;
return S_OK;
}

View file

@ -509,9 +509,21 @@ static HRESULT WINAPI dwritefactory_CreateFontFileReference(IDWriteFactory *ifac
static HRESULT WINAPI dwritefactory_CreateCustomFontFileReference(IDWriteFactory *iface,
void const *reference_key, UINT32 key_size, IDWriteFontFileLoader *loader, IDWriteFontFile **font_file)
{
int i;
struct dwritefactory *This = impl_from_IDWriteFactory(iface);
FIXME("(%p)->(%p %u %p %p): stub\n", This, reference_key, key_size, loader, font_file);
return E_NOTIMPL;
HRESULT hr;
TRACE("(%p)->(%p %u %p %p)\n", This, reference_key, key_size, loader, font_file);
if (loader == NULL)
return E_INVALIDARG;
for (i = 0; i < This->file_loader_count; i++)
if (This->file_loaders[i] == loader) break;
if (i == This->file_loader_count)
return E_INVALIDARG;
hr = create_font_file(loader, reference_key, key_size, font_file);
return hr;
}
static HRESULT WINAPI dwritefactory_CreateFontFace(IDWriteFactory *iface,

View file

@ -761,6 +761,8 @@ static void test_FontLoader(void)
{
IDWriteFontFileLoader floader = { &dwritefontfileloadervtbl };
IDWriteFontFileLoader floader2 = { &dwritefontfileloadervtbl };
IDWriteFontFileLoader floader3 = { &dwritefontfileloadervtbl };
IDWriteFontFile *ffile = NULL;
HRESULT hr;
hr = IDWriteFactory_RegisterFontFileLoader(factory, NULL);
@ -772,6 +774,21 @@ static void test_FontLoader(void)
hr = IDWriteFactory_RegisterFontFileLoader(factory, &floader);
ok(hr == DWRITE_E_ALREADYREGISTERED, "got 0x%08x\n", hr);
hr = IDWriteFactory_CreateCustomFontFileReference(factory, "test", 4, &floader, &ffile);
ok(hr == S_OK, "got 0x%08x\n", hr);
if (SUCCEEDED(hr))
IDWriteFontFile_Release(ffile);
hr = IDWriteFactory_CreateCustomFontFileReference(factory, "test", 4, &floader3, &ffile);
ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
if (SUCCEEDED(hr))
IDWriteFontFile_Release(ffile);
hr = IDWriteFactory_CreateCustomFontFileReference(factory, "test", 4, NULL, &ffile);
ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
if (SUCCEEDED(hr))
IDWriteFontFile_Release(ffile);
hr = IDWriteFactory_UnregisterFontFileLoader(factory, &floader);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IDWriteFactory_UnregisterFontFileLoader(factory, &floader);