Aric Stewart : dwrite: Add face data to font data.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Sep 2 14:30:39 CDT 2014


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Tue Sep  2 10:19:36 2014 -0500

dwrite: Add face data to font data.

---

 dlls/dwrite/font.c | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 7c107db..07a8b86 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -126,6 +126,8 @@ typedef struct
 #define MS_POST_TAG MS_MAKE_TAG('p','o','s','t')
 
 struct dwrite_fontface_data {
+    LONG ref;
+
     DWRITE_FONT_FACE_TYPE type;
     UINT32 file_count;
     IDWriteFontFile ** files;
@@ -140,6 +142,8 @@ struct dwrite_font_data {
     DWRITE_FONT_SIMULATIONS simulations;
     DWRITE_FONT_METRICS metrics;
 
+    struct dwrite_fontface_data *face_data;
+
     WCHAR *facename;
 };
 
@@ -247,6 +251,11 @@ static HRESULT _dwritefontfile_GetFontFileStream(IDWriteFontFile *iface, IDWrite
 static VOID _free_fontface_data(struct dwrite_fontface_data *data)
 {
     int i;
+    if (!data)
+        return;
+    i = InterlockedDecrement(&data->ref);
+    if (i > 0)
+        return;
     for (i = 0; i < data->file_count; i++)
         IDWriteFontFile_Release(data->files[i]);
     heap_free(data->files);
@@ -607,6 +616,7 @@ static ULONG WINAPI dwritefont_Release(IDWriteFont *iface)
         if (This->face) IDWriteFontFace_Release(This->face);
         IDWriteFontFamily_Release(This->family);
         heap_free(This->data->facename);
+        _free_fontface_data(This->data->face_data);
         heap_free(This->data);
         heap_free(This);
     }
@@ -711,11 +721,16 @@ static HRESULT WINAPI dwritefont_CreateFontFace(IDWriteFont *iface, IDWriteFontF
     else
     {
         TRACE("(%p)->(%p)\n", This, face);
-        if (This->face)
+
+        if (!This->face)
         {
-            *face = This->face;
-            IDWriteFontFace_AddRef(*face);
+            HRESULT hr = font_create_fontface(NULL, This->data->face_data->type, This->data->face_data->file_count, This->data->face_data->files, This->data->face_data->index, This->data->face_data->simulations, &This->face);
+            if (FAILED(hr)) return hr;
         }
+
+        *face = This->face;
+        IDWriteFontFace_AddRef(*face);
+
         return S_OK;
     }
 }
@@ -1150,6 +1165,7 @@ HRESULT create_font_from_logfont(const LOGFONTW *logfont, IDWriteFont **font)
     This->data->simulations = DWRITE_FONT_SIMULATIONS_NONE;
     This->data->style = logfont->lfItalic ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL;
     This->data->facename = heap_strdupW(logfont->lfFaceName);
+    This->data->face_data = NULL;
 
     *font = &This->IDWriteFont_iface;
 
@@ -1298,6 +1314,7 @@ HRESULT font_create_fontface(IDWriteFactory *iface, DWRITE_FONT_FACE_TYPE facety
 
     This->IDWriteFontFace_iface.lpVtbl = &dwritefontfacevtbl;
     This->ref = 1;
+    This->data->ref = 1;
     This->data->type = facetype;
     This->data->file_count = files_number;
     This->data->files = heap_alloc(sizeof(*This->data->files) * files_number);




More information about the wine-cvs mailing list