Aric Stewart : dwrite: Store font data in its own structure.

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


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

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

dwrite: Store font data in its own structure.

---

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

diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 5be7c83..8cb8413 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -125,6 +125,16 @@ typedef struct
 #define MS_OS2_TAG  MS_MAKE_TAG('O','S','/','2')
 #define MS_POST_TAG MS_MAKE_TAG('p','o','s','t')
 
+struct dwrite_font_data {
+    DWRITE_FONT_STYLE style;
+    DWRITE_FONT_STRETCH stretch;
+    DWRITE_FONT_WEIGHT weight;
+    DWRITE_FONT_SIMULATIONS simulations;
+    DWRITE_FONT_METRICS metrics;
+
+    WCHAR *facename;
+};
+
 struct dwrite_fontcollection {
     IDWriteFontCollection IDWriteFontCollection_iface;
     LONG ref;
@@ -148,11 +158,8 @@ struct dwrite_font {
     BOOL is_system;
     IDWriteFontFamily *family;
     IDWriteFontFace *face;
-    DWRITE_FONT_STYLE style;
-    DWRITE_FONT_STRETCH stretch;
-    DWRITE_FONT_WEIGHT weight;
-    DWRITE_FONT_METRICS metrics;
-    WCHAR *facename;
+
+    struct dwrite_font_data *data;
 };
 
 #define DWRITE_FONTTABLE_MAGIC 0xededfafa
@@ -528,10 +535,10 @@ static HRESULT create_system_fontface(struct dwrite_font *font, IDWriteFontFace
 
     This->is_system = TRUE;
     memset(&This->logfont, 0, sizeof(This->logfont));
-    This->logfont.lfItalic = font->style == DWRITE_FONT_STYLE_ITALIC;
+    This->logfont.lfItalic = font->data->style == DWRITE_FONT_STYLE_ITALIC;
     /* weight values from DWRITE_FONT_WEIGHT match values used for LOGFONT */
-    This->logfont.lfWeight = font->weight;
-    strcpyW(This->logfont.lfFaceName, font->facename);
+    This->logfont.lfWeight = font->data->weight;
+    strcpyW(This->logfont.lfFaceName, font->data->facename);
 
     *face = &This->IDWriteFontFace_iface;
 
@@ -583,7 +590,8 @@ static ULONG WINAPI dwritefont_Release(IDWriteFont *iface)
     {
         if (This->face) IDWriteFontFace_Release(This->face);
         IDWriteFontFamily_Release(This->family);
-        heap_free(This->facename);
+        heap_free(This->data->facename);
+        heap_free(This->data);
         heap_free(This);
     }
 
@@ -604,21 +612,21 @@ static DWRITE_FONT_WEIGHT WINAPI dwritefont_GetWeight(IDWriteFont *iface)
 {
     struct dwrite_font *This = impl_from_IDWriteFont(iface);
     TRACE("(%p)\n", This);
-    return This->weight;
+    return This->data->weight;
 }
 
 static DWRITE_FONT_STRETCH WINAPI dwritefont_GetStretch(IDWriteFont *iface)
 {
     struct dwrite_font *This = impl_from_IDWriteFont(iface);
     TRACE("(%p)\n", This);
-    return This->stretch;
+    return This->data->stretch;
 }
 
 static DWRITE_FONT_STYLE WINAPI dwritefont_GetStyle(IDWriteFont *iface)
 {
     struct dwrite_font *This = impl_from_IDWriteFont(iface);
     TRACE("(%p)\n", This);
-    return This->style;
+    return This->data->style;
 }
 
 static BOOL WINAPI dwritefont_IsSymbolFont(IDWriteFont *iface)
@@ -646,8 +654,8 @@ static HRESULT WINAPI dwritefont_GetInformationalStrings(IDWriteFont *iface,
 static DWRITE_FONT_SIMULATIONS WINAPI dwritefont_GetSimulations(IDWriteFont *iface)
 {
     struct dwrite_font *This = impl_from_IDWriteFont(iface);
-    FIXME("(%p): stub\n", This);
-    return DWRITE_FONT_SIMULATIONS_NONE;
+    TRACE("(%p)\n", This);
+    return This->data->simulations;
 }
 
 static void WINAPI dwritefont_GetMetrics(IDWriteFont *iface, DWRITE_FONT_METRICS *metrics)
@@ -655,7 +663,7 @@ static void WINAPI dwritefont_GetMetrics(IDWriteFont *iface, DWRITE_FONT_METRICS
     struct dwrite_font *This = impl_from_IDWriteFont(iface);
 
     TRACE("(%p)->(%p)\n", This, metrics);
-    *metrics = This->metrics;
+    *metrics = This->data->metrics;
 }
 
 static HRESULT WINAPI dwritefont_HasCharacter(IDWriteFont *iface, UINT32 value, BOOL *exists)
@@ -1011,10 +1019,10 @@ static void get_font_properties(struct dwrite_font *font, HDC hdc)
     LONG size;
 
     /* default stretch and weight to normal */
-    font->stretch = DWRITE_FONT_STRETCH_NORMAL;
-    font->weight = DWRITE_FONT_WEIGHT_NORMAL;
+    font->data->stretch = DWRITE_FONT_STRETCH_NORMAL;
+    font->data->weight = DWRITE_FONT_WEIGHT_NORMAL;
 
-    memset(&font->metrics, 0, sizeof(font->metrics));
+    memset(&font->data->metrics, 0, sizeof(font->data->metrics));
 
     size = GetFontData(hdc, MS_OS2_TAG, 0, NULL, 0);
     if (size != GDI_ERROR)
@@ -1026,31 +1034,31 @@ static void get_font_properties(struct dwrite_font *font, HDC hdc)
 
         /* DWRITE_FONT_STRETCH enumeration values directly match font data values */
         if (GET_BE_WORD(tt_os2.usWidthClass) <= DWRITE_FONT_STRETCH_ULTRA_EXPANDED)
-            font->stretch = GET_BE_WORD(tt_os2.usWidthClass);
-
-        font->weight = GET_BE_WORD(tt_os2.usWeightClass);
-        TRACE("stretch=%d, weight=%d\n", font->stretch, font->weight);
-
-        font->metrics.ascent    = GET_BE_WORD(tt_os2.sTypoAscender);
-        font->metrics.descent   = GET_BE_WORD(tt_os2.sTypoDescender);
-        font->metrics.lineGap   = GET_BE_WORD(tt_os2.sTypoLineGap);
-        font->metrics.capHeight = GET_BE_WORD(tt_os2.sCapHeight);
-        font->metrics.xHeight   = GET_BE_WORD(tt_os2.sxHeight);
-        font->metrics.strikethroughPosition  = GET_BE_WORD(tt_os2.yStrikeoutPosition);
-        font->metrics.strikethroughThickness = GET_BE_WORD(tt_os2.yStrikeoutSize);
+            font->data->stretch = GET_BE_WORD(tt_os2.usWidthClass);
+
+        font->data->weight = GET_BE_WORD(tt_os2.usWeightClass);
+        TRACE("stretch=%d, weight=%d\n", font->data->stretch, font->data->weight);
+
+        font->data->metrics.ascent    = GET_BE_WORD(tt_os2.sTypoAscender);
+        font->data->metrics.descent   = GET_BE_WORD(tt_os2.sTypoDescender);
+        font->data->metrics.lineGap   = GET_BE_WORD(tt_os2.sTypoLineGap);
+        font->data->metrics.capHeight = GET_BE_WORD(tt_os2.sCapHeight);
+        font->data->metrics.xHeight   = GET_BE_WORD(tt_os2.sxHeight);
+        font->data->metrics.strikethroughPosition  = GET_BE_WORD(tt_os2.yStrikeoutPosition);
+        font->data->metrics.strikethroughThickness = GET_BE_WORD(tt_os2.yStrikeoutSize);
     }
 
     memset(&tt_head, 0, sizeof(tt_head));
     if (GetFontData(hdc, MS_HEAD_TAG, 0, &tt_head, sizeof(tt_head)) != GDI_ERROR)
     {
-        font->metrics.designUnitsPerEm = GET_BE_WORD(tt_head.unitsPerEm);
+        font->data->metrics.designUnitsPerEm = GET_BE_WORD(tt_head.unitsPerEm);
     }
 
     memset(&tt_post, 0, sizeof(tt_post));
     if (GetFontData(hdc, MS_POST_TAG, 0, &tt_post, sizeof(tt_post)) != GDI_ERROR)
     {
-        font->metrics.underlinePosition = GET_BE_WORD(tt_post.underlinePosition);
-        font->metrics.underlineThickness = GET_BE_WORD(tt_post.underlineThickness);
+        font->data->metrics.underlinePosition = GET_BE_WORD(tt_post.underlinePosition);
+        font->data->metrics.underlineThickness = GET_BE_WORD(tt_post.underlineThickness);
     }
 }
 
@@ -1069,10 +1077,17 @@ HRESULT create_font_from_logfont(const LOGFONTW *logfont, IDWriteFont **font)
 
     This = heap_alloc(sizeof(struct dwrite_font));
     if (!This) return E_OUTOFMEMORY;
+    This->data = heap_alloc(sizeof(struct dwrite_font_data));
+    if (!This->data)
+    {
+        heap_free(This);
+        return E_OUTOFMEMORY;
+    }
 
     hfont = CreateFontIndirectW(logfont);
     if (!hfont)
     {
+        heap_free(This->data);
         heap_free(This);
         return DWRITE_E_NOFONT;
     }
@@ -1084,6 +1099,7 @@ HRESULT create_font_from_logfont(const LOGFONTW *logfont, IDWriteFont **font)
     otm = heap_alloc(ret);
     if (!otm)
     {
+        heap_free(This->data);
         heap_free(This);
         DeleteDC(hdc);
         DeleteObject(hfont);
@@ -1105,6 +1121,7 @@ HRESULT create_font_from_logfont(const LOGFONTW *logfont, IDWriteFont **font)
     heap_free(otm);
     if (hr != S_OK)
     {
+        heap_free(This->data);
         heap_free(This);
         return hr;
     }
@@ -1114,8 +1131,9 @@ HRESULT create_font_from_logfont(const LOGFONTW *logfont, IDWriteFont **font)
     This->face = NULL;
     This->is_system = TRUE;
     This->family = family;
-    This->style = logfont->lfItalic ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL;
-    This->facename = heap_strdupW(logfont->lfFaceName);
+    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);
 
     *font = &This->IDWriteFont_iface;
 




More information about the wine-cvs mailing list