dwrite: Use public APIs to get file streams from fontface.

This commit is contained in:
Nikolay Sivov 2014-11-05 23:30:32 +03:00 committed by Alexandre Julliard
parent 19869997d4
commit 90753adaaf
1 changed files with 46 additions and 53 deletions

View File

@ -105,6 +105,7 @@ struct dwrite_fontface {
IDWriteFontFace2 IDWriteFontFace2_iface; IDWriteFontFace2 IDWriteFontFace2_iface;
LONG ref; LONG ref;
IDWriteFontFileStream **streams;
IDWriteFontFile **files; IDWriteFontFile **files;
UINT32 file_count; UINT32 file_count;
UINT32 index; UINT32 index;
@ -170,25 +171,6 @@ static inline void* get_fontface_cmap(struct dwrite_fontface *fontface)
return fontface->cmap.data; return fontface->cmap.data;
} }
static HRESULT _dwritefontfile_GetFontFileStream(IDWriteFontFile *iface, IDWriteFontFileStream **stream)
{
HRESULT hr;
struct dwrite_fontfile *This = impl_from_IDWriteFontFile(iface);
if (!This->stream)
{
hr = IDWriteFontFileLoader_CreateStreamFromKey(This->loader, This->reference_key, This->key_size, &This->stream);
if (FAILED(hr))
return hr;
}
if (This->stream)
{
IDWriteFontFileStream_AddRef(This->stream);
*stream = This->stream;
return S_OK;
}
return E_FAIL;
}
static void release_font_data(struct dwrite_font_data *data) static void release_font_data(struct dwrite_font_data *data)
{ {
int i; int i;
@ -264,8 +246,12 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace2 *iface)
if (This->cmap.context) if (This->cmap.context)
IDWriteFontFace2_ReleaseFontTable(iface, This->cmap.context); IDWriteFontFace2_ReleaseFontTable(iface, This->cmap.context);
for (i = 0; i < This->file_count; i++) for (i = 0; i < This->file_count; i++) {
if (This->streams[i])
IDWriteFontFileStream_Release(This->streams[i]);
if (This->files[i])
IDWriteFontFile_Release(This->files[i]); IDWriteFontFile_Release(This->files[i]);
}
heap_free(This); heap_free(This);
} }
@ -381,15 +367,8 @@ static HRESULT WINAPI dwritefontface_TryGetFontTable(IDWriteFontFace2 *iface, UI
*exists = FALSE; *exists = FALSE;
for (i = 0; i < This->file_count && !(*exists); i++) { for (i = 0; i < This->file_count && !(*exists); i++) {
IDWriteFontFileStream *stream; hr = opentype_get_font_table(This->streams[i], This->type, This->index, table_tag, table_data, &tablecontext->context, table_size, exists);
hr = _dwritefontfile_GetFontFileStream(This->files[i], &stream);
if (FAILED(hr))
continue;
tablecontext->file_index = i; tablecontext->file_index = i;
hr = opentype_get_font_table(stream, This->type, This->index, table_tag, table_data, &tablecontext->context, table_size, exists);
IDWriteFontFileStream_Release(stream);
} }
if (FAILED(hr) && !*exists) if (FAILED(hr) && !*exists)
heap_free(tablecontext); heap_free(tablecontext);
@ -403,8 +382,7 @@ static void WINAPI dwritefontface_ReleaseFontTable(IDWriteFontFace2 *iface, void
{ {
struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface); struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface);
struct dwrite_fonttablecontext *tablecontext = (struct dwrite_fonttablecontext*)table_context; struct dwrite_fonttablecontext *tablecontext = (struct dwrite_fonttablecontext*)table_context;
IDWriteFontFileStream *stream;
HRESULT hr;
TRACE("(%p)->(%p)\n", This, table_context); TRACE("(%p)->(%p)\n", This, table_context);
if (tablecontext->magic != DWRITE_FONTTABLE_MAGIC) if (tablecontext->magic != DWRITE_FONTTABLE_MAGIC)
@ -413,11 +391,7 @@ static void WINAPI dwritefontface_ReleaseFontTable(IDWriteFontFace2 *iface, void
return; return;
} }
hr = _dwritefontfile_GetFontFileStream(This->files[tablecontext->file_index], &stream); IDWriteFontFileStream_ReleaseFileFragment(This->streams[tablecontext->file_index], tablecontext->context);
if (FAILED(hr))
return;
IDWriteFontFileStream_ReleaseFileFragment(stream, tablecontext->context);
IDWriteFontFileStream_Release(stream);
heap_free(tablecontext); heap_free(tablecontext);
} }
@ -1904,6 +1878,30 @@ HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *reference_ke
return S_OK; return S_OK;
} }
static HRESULT get_stream_from_file(IDWriteFontFile *file, IDWriteFontFileStream **stream)
{
IDWriteFontFileLoader *loader;
UINT32 key_size;
const void *key;
HRESULT hr;
*stream = NULL;
hr = IDWriteFontFile_GetLoader(file, &loader);
if (FAILED(hr))
return hr;
hr = IDWriteFontFile_GetReferenceKey(file, &key, &key_size);
if (FAILED(hr)) {
IDWriteFontFileLoader_Release(loader);
return hr;
}
hr = IDWriteFontFileLoader_CreateStreamFromKey(loader, key, key_size, stream);
IDWriteFontFileLoader_Release(loader);
return hr;
}
HRESULT create_fontface(DWRITE_FONT_FACE_TYPE facetype, UINT32 files_number, IDWriteFontFile* const* font_files, UINT32 index, HRESULT create_fontface(DWRITE_FONT_FACE_TYPE facetype, UINT32 files_number, IDWriteFontFile* const* font_files, UINT32 index,
DWRITE_FONT_SIMULATIONS simulations, IDWriteFontFace2 **ret) DWRITE_FONT_SIMULATIONS simulations, IDWriteFontFace2 **ret)
{ {
@ -1915,8 +1913,12 @@ HRESULT create_fontface(DWRITE_FONT_FACE_TYPE facetype, UINT32 files_number, IDW
if (!fontface) if (!fontface)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
fontface->files = heap_alloc(sizeof(*fontface->files) * files_number); fontface->files = heap_alloc_zero(sizeof(*fontface->files) * files_number);
if (!fontface->files) { fontface->streams = heap_alloc_zero(sizeof(*fontface->streams) * files_number);
if (!fontface->files || !fontface->streams) {
heap_free(fontface->files);
heap_free(fontface->streams);
heap_free(fontface); heap_free(fontface);
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
} }
@ -1929,22 +1931,13 @@ HRESULT create_fontface(DWRITE_FONT_FACE_TYPE facetype, UINT32 files_number, IDW
fontface->cmap.context = NULL; fontface->cmap.context = NULL;
fontface->cmap.size = 0; fontface->cmap.size = 0;
/* Verify font file streams */ for (i = 0; i < fontface->file_count; i++) {
for (i = 0; i < fontface->file_count && SUCCEEDED(hr); i++) hr = get_stream_from_file(font_files[i], &fontface->streams[i]);
{
IDWriteFontFileStream *stream;
hr = _dwritefontfile_GetFontFileStream(font_files[i], &stream);
if (SUCCEEDED(hr))
IDWriteFontFileStream_Release(stream);
}
if (FAILED(hr)) { if (FAILED(hr)) {
heap_free(fontface->files); IDWriteFontFace2_Release(&fontface->IDWriteFontFace2_iface);
heap_free(fontface);
return hr; return hr;
} }
for (i = 0; i < fontface->file_count; i++) {
fontface->files[i] = font_files[i]; fontface->files[i] = font_files[i];
IDWriteFontFile_AddRef(font_files[i]); IDWriteFontFile_AddRef(font_files[i]);
} }