Nikolay Sivov : dwrite: Added GetLocaleNameLength/ GetLocaleName for text format and layout.
Alexandre Julliard
julliard at winehq.org
Fri Oct 26 11:36:20 CDT 2012
Module: wine
Branch: master
Commit: 51d0f61272cc2aeb3cc0aba2653174caa7dba8e9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=51d0f61272cc2aeb3cc0aba2653174caa7dba8e9
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Oct 26 12:50:12 2012 -0400
dwrite: Added GetLocaleNameLength/GetLocaleName for text format and layout.
---
dlls/dwrite/layout.c | 35 +++++++++++++++++++++++++++--------
dlls/dwrite/tests/layout.c | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+), 8 deletions(-)
diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 76c5adb..f6bc421 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -35,6 +35,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(dwrite);
struct dwrite_textformat_data {
WCHAR *family_name;
WCHAR *locale;
+ UINT32 locale_len;
DWRITE_FONT_WEIGHT weight;
DWRITE_FONT_STYLE style;
@@ -114,6 +115,7 @@ static ULONG WINAPI dwritetextlayout_Release(IDWriteTextLayout *iface)
if (!ref)
{
+ release_format_data(&This->format);
heap_free(This->str);
heap_free(This);
}
@@ -289,15 +291,19 @@ static FLOAT WINAPI dwritetextlayout_GetFontSize(IDWriteTextLayout *iface)
static UINT32 WINAPI dwritetextlayout_GetLocaleNameLength(IDWriteTextLayout *iface)
{
struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface);
- FIXME("(%p): stub\n", This);
- return 0;
+ TRACE("(%p)\n", This);
+ return This->format.locale_len;
}
static HRESULT WINAPI dwritetextlayout_GetLocaleName(IDWriteTextLayout *iface, WCHAR *name, UINT32 size)
{
struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface);
- FIXME("(%p)->(%p %u): stub\n", This, name, size);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p %u)\n", This, name, size);
+
+ if (size <= This->format.locale_len) return E_NOT_SUFFICIENT_BUFFER;
+ strcpyW(name, This->format.locale);
+ return S_OK;
}
static HRESULT WINAPI dwritetextlayout_SetMaxWidth(IDWriteTextLayout *iface, FLOAT maxWidth)
@@ -668,6 +674,7 @@ static const IDWriteTextLayoutVtbl dwritetextlayoutvtbl = {
HRESULT create_textlayout(const WCHAR *str, UINT32 len, IDWriteTextFormat *format, IDWriteTextLayout **layout)
{
struct dwrite_textlayout *This;
+ UINT32 locale_len;
*layout = NULL;
@@ -682,6 +689,13 @@ HRESULT create_textlayout(const WCHAR *str, UINT32 len, IDWriteTextFormat *forma
/* reference is not kept here, instead copy all underlying data */
IDWriteTextFormat_GetFontCollection(format, &This->format.collection);
+
+ /* locale name and length */
+ locale_len = IDWriteTextFormat_GetLocaleNameLength(format);
+ This->format.locale = heap_alloc((locale_len+1)*sizeof(WCHAR));
+ IDWriteTextFormat_GetLocaleName(format, This->format.locale, locale_len+1);
+ This->format.locale_len = locale_len;
+
This->format.weight = IDWriteTextFormat_GetFontWeight(format);
This->format.style = IDWriteTextFormat_GetFontStyle(format);
This->format.stretch = IDWriteTextFormat_GetFontStretch(format);
@@ -908,15 +922,19 @@ static FLOAT WINAPI dwritetextformat_GetFontSize(IDWriteTextFormat *iface)
static UINT32 WINAPI dwritetextformat_GetLocaleNameLength(IDWriteTextFormat *iface)
{
struct dwrite_textformat *This = impl_from_IDWriteTextFormat(iface);
- FIXME("(%p): stub\n", This);
- return 0;
+ TRACE("(%p)\n", This);
+ return This->format.locale_len;
}
static HRESULT WINAPI dwritetextformat_GetLocaleName(IDWriteTextFormat *iface, WCHAR *name, UINT32 size)
{
struct dwrite_textformat *This = impl_from_IDWriteTextFormat(iface);
- FIXME("(%p)->(%p %u): stub\n", This, name, size);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p %u)\n", This, name, size);
+
+ if (size <= This->format.locale_len) return E_NOT_SUFFICIENT_BUFFER;
+ strcpyW(name, This->format.locale);
+ return S_OK;
}
static const IDWriteTextFormatVtbl dwritetextformatvtbl = {
@@ -964,6 +982,7 @@ HRESULT create_textformat(const WCHAR *family_name, IDWriteFontCollection *colle
This->ref = 1;
This->format.family_name = heap_strdupW(family_name);
This->format.locale = heap_strdupW(locale);
+ This->format.locale_len = strlenW(locale);
This->format.weight = weight;
This->format.style = style;
This->format.size = size;
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 6b8dc62..9656ba6 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -134,6 +134,41 @@ if (0) /* crashes on native */
IDWriteTextFormat_Release(format);
}
+static void test_GetLocaleName(void)
+{
+ static const WCHAR strW[] = {'s','t','r','i','n','g',0};
+ static const WCHAR ruW[] = {'r','u',0};
+ IDWriteTextLayout *layout;
+ IDWriteTextFormat *format;
+ WCHAR buff[10];
+ UINT32 len;
+ HRESULT hr;
+
+ hr = IDWriteFactory_CreateTextFormat(factory, tahomaW, NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL,
+ DWRITE_FONT_STRETCH_NORMAL, 10.0, ruW, &format);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ 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);
+ len = IDWriteTextLayout_GetLocaleNameLength(layout);
+ ok(len == 2, "got %u\n", len);
+ len = IDWriteTextFormat_GetLocaleNameLength(format);
+ ok(len == 2, "got %u\n", len);
+ hr = IDWriteTextLayout_GetLocaleName(layout, buff, len);
+ ok(hr == E_NOT_SUFFICIENT_BUFFER, "got 0x%08x\n", hr);
+ hr = IDWriteTextLayout_GetLocaleName(layout, buff, len+1);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(!lstrcmpW(buff, ruW), "got %s\n", wine_dbgstr_w(buff));
+ hr = IDWriteTextFormat_GetLocaleName(format, buff, len);
+ ok(hr == E_NOT_SUFFICIENT_BUFFER, "got 0x%08x\n", hr);
+ hr = IDWriteTextFormat_GetLocaleName(format, buff, len+1);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(!lstrcmpW(buff, ruW), "got %s\n", wine_dbgstr_w(buff));
+
+ IDWriteTextLayout_Release(layout);
+ IDWriteTextFormat_Release(format);
+}
+
START_TEST(layout)
{
HRESULT hr;
@@ -149,6 +184,7 @@ START_TEST(layout)
test_CreateTextLayout();
test_CreateGdiCompatibleTextLayout();
test_CreateTextFormat();
+ test_GetLocaleName();
IDWriteFactory_Release(factory);
}
More information about the wine-cvs
mailing list