Module: wine Branch: master Commit: 8b2e666d3f94c5dcd3c3f336df82350bb7472f71 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8b2e666d3f94c5dcd3c3f336df...
Author: Aric Stewart aric@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);