[5/5] dwrite: Separate format data and keep it in both layout and text format

Nikolay Sivov nsivov at codeweavers.com
Tue Oct 23 06:29:04 CDT 2012


Separate format data and keep it in both layout and text format
-------------- next part --------------
>From c9d3f5841e358e30b1f7df67e3ffc38259a3af83 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue, 23 Oct 2012 08:32:34 -0400
Subject: [PATCH 5/7] Separate format data and keep it in both layout and text
 format

---
 dlls/dwrite/layout.c |   54 ++++++++++++++++++++++++++++++--------------------
 1 file changed, 32 insertions(+), 22 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 91360ee..a2d1ef9 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -32,17 +32,7 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(dwrite);
 
-struct dwrite_textlayout {
-    IDWriteTextLayout IDWriteTextLayout_iface;
-    LONG ref;
-
-    WCHAR *str;
-};
-
-struct dwrite_textformat {
-    IDWriteTextFormat IDWriteTextFormat_iface;
-    LONG ref;
-
+struct dwrite_textformat_data {
     WCHAR *family_name;
     WCHAR *locale;
 
@@ -55,6 +45,27 @@ struct dwrite_textformat {
     IDWriteFontCollection *collection;
 };
 
+struct dwrite_textlayout {
+    IDWriteTextLayout IDWriteTextLayout_iface;
+    LONG ref;
+
+    WCHAR *str;
+    struct dwrite_textformat_data format;
+};
+
+struct dwrite_textformat {
+    IDWriteTextFormat IDWriteTextFormat_iface;
+    LONG ref;
+    struct dwrite_textformat_data format;
+};
+
+static void release_format_data(struct dwrite_textformat_data *data)
+{
+    if (data->collection) IDWriteFontCollection_Release(data->collection);
+    heap_free(data->family_name);
+    heap_free(data->locale);
+}
+
 static inline struct dwrite_textlayout *impl_from_IDWriteTextLayout(IDWriteTextLayout *iface)
 {
     return CONTAINING_RECORD(iface, struct dwrite_textlayout, IDWriteTextLayout_iface);
@@ -665,6 +676,7 @@ HRESULT create_textlayout(const WCHAR *str, UINT32 len, IDWriteTextLayout **layo
     This->IDWriteTextLayout_iface.lpVtbl = &dwritetextlayoutvtbl;
     This->ref = 1;
     This->str = heap_strdupnW(str, len);
+    memset(&This->format, 0, sizeof(This->format));
 
     *layout = &This->IDWriteTextLayout_iface;
 
@@ -707,9 +719,7 @@ static ULONG WINAPI dwritetextformat_Release(IDWriteTextFormat *iface)
 
     if (!ref)
     {
-        if (This->collection) IDWriteFontCollection_Release(This->collection);
-        heap_free(This->family_name);
-        heap_free(This->locale);
+        release_format_data(&This->format);
         heap_free(This);
     }
 
@@ -838,7 +848,7 @@ static HRESULT WINAPI dwritetextformat_GetFontCollection(IDWriteTextFormat *ifac
 
     TRACE("(%p)->(%p)\n", This, collection);
 
-    *collection = This->collection;
+    *collection = This->format.collection;
     IDWriteFontCollection_AddRef(*collection);
 
     return S_OK;
@@ -943,20 +953,20 @@ HRESULT create_textformat(const WCHAR *family_name, IDWriteFontCollection *colle
 
     This->IDWriteTextFormat_iface.lpVtbl = &dwritetextformatvtbl;
     This->ref = 1;
-    This->family_name = heap_strdupW(family_name);
-    This->locale = heap_strdupW(locale);
-    This->weight = weight;
-    This->style = style;
-    This->size = size;
+    This->format.family_name = heap_strdupW(family_name);
+    This->format.locale = heap_strdupW(locale);
+    This->format.weight = weight;
+    This->format.style = style;
+    This->format.size = size;
 
     if (collection)
     {
-        This->collection = collection;
+        This->format.collection = collection;
         IDWriteFontCollection_AddRef(collection);
     }
     else
     {
-        HRESULT hr = get_system_fontcollection(&This->collection);
+        HRESULT hr = get_system_fontcollection(&This->format.collection);
         if (hr != S_OK)
         {
             IDWriteTextFormat_Release(&This->IDWriteTextFormat_iface);
-- 
1.7.10.4




More information about the wine-patches mailing list