dwrite: Initial implementation of CreateCustomFontFileReference.
This commit is contained in:
parent
a254741b36
commit
bb9721bd29
|
@ -89,3 +89,4 @@ extern HRESULT add_localizedstring(IDWriteLocalizedStrings*,const WCHAR*,const W
|
||||||
extern HRESULT get_system_fontcollection(IDWriteFontCollection**) DECLSPEC_HIDDEN;
|
extern HRESULT get_system_fontcollection(IDWriteFontCollection**) DECLSPEC_HIDDEN;
|
||||||
extern void release_system_fontcollection(void) DECLSPEC_HIDDEN;
|
extern void release_system_fontcollection(void) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT get_textanalyzer(IDWriteTextAnalyzer**) 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;
|
||||||
|
|
|
@ -162,6 +162,15 @@ struct dwrite_fontface {
|
||||||
LOGFONTW logfont;
|
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 HRESULT create_fontfamily(const WCHAR *familyname, IDWriteFontFamily **family);
|
||||||
|
|
||||||
static inline struct dwrite_fontface *impl_from_IDWriteFontFace(IDWriteFontFace *iface)
|
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);
|
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)
|
static inline struct dwrite_fontfamily *impl_from_IDWriteFontFamily(IDWriteFontFamily *iface)
|
||||||
{
|
{
|
||||||
return CONTAINING_RECORD(iface, struct dwrite_fontfamily, 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;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -509,9 +509,21 @@ static HRESULT WINAPI dwritefactory_CreateFontFileReference(IDWriteFactory *ifac
|
||||||
static HRESULT WINAPI dwritefactory_CreateCustomFontFileReference(IDWriteFactory *iface,
|
static HRESULT WINAPI dwritefactory_CreateCustomFontFileReference(IDWriteFactory *iface,
|
||||||
void const *reference_key, UINT32 key_size, IDWriteFontFileLoader *loader, IDWriteFontFile **font_file)
|
void const *reference_key, UINT32 key_size, IDWriteFontFileLoader *loader, IDWriteFontFile **font_file)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
struct dwritefactory *This = impl_from_IDWriteFactory(iface);
|
struct dwritefactory *This = impl_from_IDWriteFactory(iface);
|
||||||
FIXME("(%p)->(%p %u %p %p): stub\n", This, reference_key, key_size, loader, font_file);
|
HRESULT hr;
|
||||||
return E_NOTIMPL;
|
|
||||||
|
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,
|
static HRESULT WINAPI dwritefactory_CreateFontFace(IDWriteFactory *iface,
|
||||||
|
|
|
@ -761,6 +761,8 @@ static void test_FontLoader(void)
|
||||||
{
|
{
|
||||||
IDWriteFontFileLoader floader = { &dwritefontfileloadervtbl };
|
IDWriteFontFileLoader floader = { &dwritefontfileloadervtbl };
|
||||||
IDWriteFontFileLoader floader2 = { &dwritefontfileloadervtbl };
|
IDWriteFontFileLoader floader2 = { &dwritefontfileloadervtbl };
|
||||||
|
IDWriteFontFileLoader floader3 = { &dwritefontfileloadervtbl };
|
||||||
|
IDWriteFontFile *ffile = NULL;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
hr = IDWriteFactory_RegisterFontFileLoader(factory, NULL);
|
hr = IDWriteFactory_RegisterFontFileLoader(factory, NULL);
|
||||||
|
@ -772,6 +774,21 @@ static void test_FontLoader(void)
|
||||||
hr = IDWriteFactory_RegisterFontFileLoader(factory, &floader);
|
hr = IDWriteFactory_RegisterFontFileLoader(factory, &floader);
|
||||||
ok(hr == DWRITE_E_ALREADYREGISTERED, "got 0x%08x\n", hr);
|
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);
|
hr = IDWriteFactory_UnregisterFontFileLoader(factory, &floader);
|
||||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
hr = IDWriteFactory_UnregisterFontFileLoader(factory, &floader);
|
hr = IDWriteFactory_UnregisterFontFileLoader(factory, &floader);
|
||||||
|
|
Loading…
Reference in New Issue