Nikolay Sivov : dwrite: Store text string in layout object.

Alexandre Julliard julliard at winehq.org
Mon Oct 22 13:42:45 CDT 2012


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat Oct 20 17:02:25 2012 -0400

dwrite: Store text string in layout object.

---

 dlls/dwrite/dwrite_private.h |   18 ++++++++++++++++--
 dlls/dwrite/layout.c         |    8 +++++++-
 dlls/dwrite/main.c           |    4 ++--
 dlls/dwrite/tests/layout.c   |   36 ++++++++++++++++++++++++++++++++++++
 4 files changed, 61 insertions(+), 5 deletions(-)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index d5890bb..9e63da0 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -38,7 +38,7 @@ static inline BOOL heap_free(void *mem)
     return HeapFree(GetProcessHeap(), 0, mem);
 }
 
-static inline LPWSTR heap_strdupW(LPCWSTR str)
+static inline LPWSTR heap_strdupW(const WCHAR *str)
 {
     LPWSTR ret = NULL;
 
@@ -53,10 +53,24 @@ static inline LPWSTR heap_strdupW(LPCWSTR str)
     return ret;
 }
 
+static inline LPWSTR heap_strdupnW(const WCHAR *str, UINT32 len)
+{
+    WCHAR *ret = NULL;
+
+    if (len)
+    {
+        ret = heap_alloc((len+1)*sizeof(WCHAR));
+        memcpy(ret, str, len*sizeof(WCHAR));
+        ret[len] = 0;
+    }
+
+    return ret;
+}
+
 extern HRESULT create_font_from_logfont(const LOGFONTW*, IDWriteFont**) DECLSPEC_HIDDEN;
 extern HRESULT create_textformat(const WCHAR*,DWRITE_FONT_WEIGHT,DWRITE_FONT_STYLE,DWRITE_FONT_STRETCH,
                                  FLOAT,const WCHAR*,IDWriteTextFormat**) DECLSPEC_HIDDEN;
-extern HRESULT create_textlayout(IDWriteTextLayout**) DECLSPEC_HIDDEN;
+extern HRESULT create_textlayout(const WCHAR*,UINT32,IDWriteTextLayout**) DECLSPEC_HIDDEN;
 extern HRESULT create_gdiinterop(IDWriteGdiInterop**) DECLSPEC_HIDDEN;
 extern HRESULT create_localizedstrings(IDWriteLocalizedStrings**) DECLSPEC_HIDDEN;
 extern HRESULT add_localizedstring(IDWriteLocalizedStrings*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 64f3c0d..577a261 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -35,6 +35,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(dwrite);
 struct dwrite_textlayout {
     IDWriteTextLayout IDWriteTextLayout_iface;
     LONG ref;
+
+    WCHAR *str;
 };
 
 struct dwrite_textformat {
@@ -97,7 +99,10 @@ static ULONG WINAPI dwritetextlayout_Release(IDWriteTextLayout *iface)
     TRACE("(%p)->(%d)\n", This, ref);
 
     if (!ref)
+    {
+        heap_free(This->str);
         heap_free(This);
+    }
 
     return S_OK;
 }
@@ -646,7 +651,7 @@ static const IDWriteTextLayoutVtbl dwritetextlayoutvtbl = {
     dwritetextlayout_HitTestTextRange
 };
 
-HRESULT create_textlayout(IDWriteTextLayout **layout)
+HRESULT create_textlayout(const WCHAR *str, UINT32 len, IDWriteTextLayout **layout)
 {
     struct dwrite_textlayout *This;
 
@@ -657,6 +662,7 @@ HRESULT create_textlayout(IDWriteTextLayout **layout)
 
     This->IDWriteTextLayout_iface.lpVtbl = &dwritetextlayoutvtbl;
     This->ref = 1;
+    This->str = heap_strdupnW(str, len);
 
     *layout = &This->IDWriteTextLayout_iface;
 
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 20aed56..75445e8 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -506,7 +506,7 @@ static HRESULT WINAPI dwritefactory_CreateTextLayout(IDWriteFactory *iface, WCHA
     FIXME("(%s %u %p %f %f %p): stub\n", debugstr_w(string), len, format, max_width, max_height, layout);
 
     if (!format) return E_INVALIDARG;
-    return create_textlayout(layout);
+    return create_textlayout(string, len, layout);
 }
 
 static HRESULT WINAPI dwritefactory_CreateGdiCompatibleTextLayout(IDWriteFactory *iface, WCHAR const* string,
@@ -517,7 +517,7 @@ static HRESULT WINAPI dwritefactory_CreateGdiCompatibleTextLayout(IDWriteFactory
         pixels_per_dip, transform, use_gdi_natural, layout);
 
     if (!format) return E_INVALIDARG;
-    return create_textlayout(layout);
+    return create_textlayout(string, len, layout);
 }
 
 static HRESULT WINAPI dwritefactory_CreateEllipsisTrimmingSign(IDWriteFactory *iface, IDWriteTextFormat *format,
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 6e2c718..ab29c06 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -27,6 +27,16 @@
 
 static IDWriteFactory *factory;
 
+static const WCHAR tahomaW[] = {'T','a','h','o','m','a',0};
+
+#define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__)
+static void _expect_ref(IUnknown* obj, ULONG ref, int line)
+{
+    ULONG rc = IUnknown_AddRef(obj);
+    IUnknown_Release(obj);
+    ok_(__FILE__,line)(rc-1 == ref, "expected refcount %d, got %d\n", ref, rc-1);
+}
+
 static void test_CreateTextLayout(void)
 {
     static const WCHAR strW[] = {'s','t','r','i','n','g',0};
@@ -52,7 +62,9 @@ static void test_CreateTextLayout(void)
 static void test_CreateGdiCompatibleTextLayout(void)
 {
     static const WCHAR strW[] = {'s','t','r','i','n','g',0};
+    static const WCHAR enusW[] = {'e','n','-','u','s',0};
     IDWriteTextLayout *layout;
+    IDWriteTextFormat *format;
     HRESULT hr;
 
     hr = IDWriteFactory_CreateGdiCompatibleTextLayout(factory, NULL, 0, NULL, 0.0, 0.0, 0.0, NULL, FALSE, &layout);
@@ -69,6 +81,30 @@ static void test_CreateGdiCompatibleTextLayout(void)
 
     hr = IDWriteFactory_CreateGdiCompatibleTextLayout(factory, strW, 6, NULL, 1000.0, 1000.0, 1.0, NULL, FALSE, &layout);
     ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+    /* create with text format */
+    hr = IDWriteFactory_CreateTextFormat(factory, tahomaW, NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL,
+        DWRITE_FONT_STRETCH_NORMAL, 10.0, enusW, &format);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    EXPECT_REF(format, 1);
+
+    hr = IDWriteFactory_CreateGdiCompatibleTextLayout(factory, strW, 6, format, 100.0, 100.0, 1.0, NULL, FALSE, &layout);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    EXPECT_REF(format, 1);
+    EXPECT_REF(layout, 1);
+
+    IDWriteTextLayout_AddRef(layout);
+    EXPECT_REF(format, 1);
+    EXPECT_REF(layout, 2);
+    IDWriteTextLayout_Release(layout);
+    IDWriteTextLayout_Release(layout);
+
+    /* zero length string is okay */
+    hr = IDWriteFactory_CreateGdiCompatibleTextLayout(factory, strW, 0, format, 100.0, 100.0, 1.0, NULL, FALSE, &layout);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    IDWriteTextLayout_Release(layout);
+
+    IDWriteTextFormat_Release(format);
 }
 
 START_TEST(layout)




More information about the wine-cvs mailing list