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

Alexandre Julliard julliard at wine.codeweavers.com
Thu Nov 6 09:22:40 CST 2014


Module: wine
Branch: master
Commit: 90753adaafb8ef925983a6e1837aa52eb06cbc80
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=90753adaafb8ef925983a6e1837aa52eb06cbc80

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Nov  5 23:30:32 2014 +0300

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

---

 dlls/dwrite/font.c | 99 +++++++++++++++++++++++++-----------------------------
 1 file changed, 46 insertions(+), 53 deletions(-)

diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index d5d6b41..6c62056 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -105,6 +105,7 @@ struct dwrite_fontface {
     IDWriteFontFace2 IDWriteFontFace2_iface;
     LONG ref;
 
+    IDWriteFontFileStream **streams;
     IDWriteFontFile **files;
     UINT32 file_count;
     UINT32 index;
@@ -170,25 +171,6 @@ static inline void* get_fontface_cmap(struct dwrite_fontface *fontface)
     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)
 {
     int i;
@@ -264,8 +246,12 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace2 *iface)
 
         if (This->cmap.context)
             IDWriteFontFace2_ReleaseFontTable(iface, This->cmap.context);
-        for (i = 0; i < This->file_count; i++)
-            IDWriteFontFile_Release(This->files[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]);
+        }
         heap_free(This);
     }
 
@@ -381,15 +367,8 @@ static HRESULT WINAPI dwritefontface_TryGetFontTable(IDWriteFontFace2 *iface, UI
 
     *exists = FALSE;
     for (i = 0; i < This->file_count && !(*exists); i++) {
-        IDWriteFontFileStream *stream;
-        hr = _dwritefontfile_GetFontFileStream(This->files[i], &stream);
-        if (FAILED(hr))
-            continue;
+        hr = opentype_get_font_table(This->streams[i], This->type, This->index, table_tag, table_data, &tablecontext->context, table_size, exists);
         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)
         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_fonttablecontext *tablecontext = (struct dwrite_fonttablecontext*)table_context;
-    IDWriteFontFileStream *stream;
-    HRESULT hr;
+
     TRACE("(%p)->(%p)\n", This, table_context);
 
     if (tablecontext->magic != DWRITE_FONTTABLE_MAGIC)
@@ -413,11 +391,7 @@ static void WINAPI dwritefontface_ReleaseFontTable(IDWriteFontFace2 *iface, void
         return;
     }
 
-    hr = _dwritefontfile_GetFontFileStream(This->files[tablecontext->file_index], &stream);
-    if (FAILED(hr))
-        return;
-    IDWriteFontFileStream_ReleaseFileFragment(stream, tablecontext->context);
-    IDWriteFontFileStream_Release(stream);
+    IDWriteFontFileStream_ReleaseFileFragment(This->streams[tablecontext->file_index], tablecontext->context);
     heap_free(tablecontext);
 }
 
@@ -1904,6 +1878,30 @@ HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *reference_ke
     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,
     DWRITE_FONT_SIMULATIONS simulations, IDWriteFontFace2 **ret)
 {
@@ -1915,8 +1913,12 @@ HRESULT create_fontface(DWRITE_FONT_FACE_TYPE facetype, UINT32 files_number, IDW
     if (!fontface)
         return E_OUTOFMEMORY;
 
-    fontface->files = heap_alloc(sizeof(*fontface->files) * files_number);
-    if (!fontface->files) {
+    fontface->files = heap_alloc_zero(sizeof(*fontface->files) * files_number);
+    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);
         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.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++) {
+        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];
         IDWriteFontFile_AddRef(font_files[i]);
     }




More information about the wine-cvs mailing list