dwrite: Use public APIs to get file streams from fontface.
This commit is contained in:
parent
19869997d4
commit
90753adaaf
|
@ -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++) {
|
||||||
IDWriteFontFile_Release(This->files[i]);
|
if (This->streams[i])
|
||||||
|
IDWriteFontFileStream_Release(This->streams[i]);
|
||||||
|
if (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 && SUCCEEDED(hr); i++)
|
|
||||||
{
|
|
||||||
IDWriteFontFileStream *stream;
|
|
||||||
hr = _dwritefontfile_GetFontFileStream(font_files[i], &stream);
|
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
IDWriteFontFileStream_Release(stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
heap_free(fontface->files);
|
|
||||||
heap_free(fontface);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < fontface->file_count; i++) {
|
for (i = 0; i < fontface->file_count; i++) {
|
||||||
|
hr = get_stream_from_file(font_files[i], &fontface->streams[i]);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
IDWriteFontFace2_Release(&fontface->IDWriteFontFace2_iface);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
fontface->files[i] = font_files[i];
|
fontface->files[i] = font_files[i];
|
||||||
IDWriteFontFile_AddRef(font_files[i]);
|
IDWriteFontFile_AddRef(font_files[i]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue