Aric Stewart : dwrite: Shift to using localized string for family name.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Sep 5 11:10:36 CDT 2014
Module: wine
Branch: master
Commit: 5d3eaf57ca2b18e3dcd44ced1711c898bbd19224
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5d3eaf57ca2b18e3dcd44ced1711c898bbd19224
Author: Aric Stewart <aric at codeweavers.com>
Date: Thu Sep 4 17:45:37 2014 -0500
dwrite: Shift to using localized string for family name.
---
dlls/dwrite/dwrite_private.h | 1 +
dlls/dwrite/font.c | 44 +++++++++++++++++++++++++++-----------------
dlls/dwrite/main.c | 31 +++++++++++++++++++++++++++++++
3 files changed, 59 insertions(+), 17 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index a23a9d5..77834cd 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -91,6 +91,7 @@ extern HRESULT create_trimmingsign(IDWriteInlineObject**) DECLSPEC_HIDDEN;
extern HRESULT get_gdiinterop(IDWriteGdiInterop**) DECLSPEC_HIDDEN;
extern HRESULT create_localizedstrings(IDWriteLocalizedStrings**) DECLSPEC_HIDDEN;
extern HRESULT add_localizedstring(IDWriteLocalizedStrings*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN;
+extern HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **strings) DECLSPEC_HIDDEN;
extern HRESULT get_system_fontcollection(IDWriteFontCollection**) DECLSPEC_HIDDEN;
extern HRESULT get_textanalyzer(IDWriteTextAnalyzer**) DECLSPEC_HIDDEN;
extern HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *reference_key, UINT32 key_size, IDWriteFontFile **font_file) DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index c6fcf6a..8b59a37 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -77,7 +77,7 @@ struct dwrite_fontfamily {
IDWriteFontCollection* collection;
- WCHAR *familyname;
+ IDWriteLocalizedStrings *familyname;
};
struct dwrite_font {
@@ -123,7 +123,7 @@ struct dwrite_fontfile {
IDWriteFontFileStream *stream;
};
-static HRESULT create_fontfamily(const WCHAR *familyname, IDWriteFontFamily **family);
+static HRESULT create_fontfamily(IDWriteLocalizedStrings *familyname, IDWriteFontFamily **family);
static HRESULT create_font_base(IDWriteFont **font);
static HRESULT create_font_from_data(struct dwrite_font_data *data, IDWriteFont **font);
@@ -744,7 +744,7 @@ static ULONG WINAPI dwritefontfamily_Release(IDWriteFontFamily *iface)
if (!ref)
{
int i;
- heap_free(This->familyname);
+ IDWriteLocalizedStrings_Release(This->familyname);
if (This->collection)
IDWriteFontCollection_Release(This->collection);
@@ -803,15 +803,7 @@ static HRESULT WINAPI dwritefontfamily_GetFont(IDWriteFontFamily *iface, UINT32
static HRESULT WINAPI dwritefontfamily_GetFamilyNames(IDWriteFontFamily *iface, IDWriteLocalizedStrings **names)
{
struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily(iface);
- static const WCHAR enusW[] = {'e','n','-','u','s',0};
- HRESULT hr;
-
- TRACE("(%p)->(%p)\n", This, names);
-
- hr = create_localizedstrings(names);
- if (FAILED(hr)) return hr;
-
- return add_localizedstring(*names, enusW, This->familyname);
+ return clone_localizedstring(This->familyname, names);
}
static HRESULT WINAPI dwritefontfamily_GetFirstMatchingFont(IDWriteFontFamily *iface, DWRITE_FONT_WEIGHT weight,
@@ -828,7 +820,7 @@ static HRESULT WINAPI dwritefontfamily_GetFirstMatchingFont(IDWriteFontFamily *i
memset(&lf, 0, sizeof(lf));
lf.lfWeight = weight;
lf.lfItalic = style == DWRITE_FONT_STYLE_ITALIC;
- strcpyW(lf.lfFaceName, This->familyname);
+ IDWriteLocalizedStrings_GetString(This->familyname, 0, lf.lfFaceName, LF_FACESIZE);
return create_font_from_logfont(&lf, font);
}
@@ -929,6 +921,9 @@ static UINT32 WINAPI dwritefontcollection_GetFontFamilyCount(IDWriteFontCollecti
static HRESULT WINAPI dwritefontcollection_GetFontFamily(IDWriteFontCollection *iface, UINT32 index, IDWriteFontFamily **family)
{
struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection(iface);
+ HRESULT hr;
+ IDWriteLocalizedStrings *familyname;
+ static const WCHAR enusW[] = {'e','n','-','u','s',0};
TRACE("(%p)->(%u %p)\n", This, index, family);
@@ -938,7 +933,12 @@ static HRESULT WINAPI dwritefontcollection_GetFontFamily(IDWriteFontCollection *
return E_FAIL;
}
- return create_fontfamily(This->families[index], family);
+ hr = create_localizedstrings(&familyname);
+ if (FAILED(hr))
+ return hr;
+ add_localizedstring(familyname, enusW, This->families[index]);
+
+ return create_fontfamily(familyname, family);
}
static HRESULT WINAPI dwritefontcollection_FindFamilyName(IDWriteFontCollection *iface, const WCHAR *name, UINT32 *index, BOOL *exists)
@@ -1035,7 +1035,7 @@ HRESULT get_system_fontcollection(IDWriteFontCollection **collection)
return S_OK;
}
-static HRESULT create_fontfamily(const WCHAR *familyname, IDWriteFontFamily **family)
+static HRESULT create_fontfamily(IDWriteLocalizedStrings *familyname, IDWriteFontFamily **family)
{
struct dwrite_fontfamily *This;
@@ -1050,7 +1050,7 @@ static HRESULT create_fontfamily(const WCHAR *familyname, IDWriteFontFamily **fa
This->alloc = 2;
This->fonts = heap_alloc(sizeof(*This->fonts) * 2);
This->collection = NULL;
- This->familyname = heap_strdupW(familyname);
+ This->familyname = familyname;
*family = &This->IDWriteFontFamily_iface;
@@ -1098,6 +1098,7 @@ static HRESULT create_font_base(IDWriteFont **font)
HRESULT create_font_from_logfont(const LOGFONTW *logfont, IDWriteFont **font)
{
const WCHAR* facename, *familyname;
+ IDWriteLocalizedStrings *name;
struct dwrite_font *This;
IDWriteFontFamily *family;
OUTLINETEXTMETRICW *otm;
@@ -1105,6 +1106,7 @@ HRESULT create_font_from_logfont(const LOGFONTW *logfont, IDWriteFont **font)
HFONT hfont;
HDC hdc;
int ret;
+ static const WCHAR enusW[] = {'e','n','-','u','s',0};
LPVOID tt_os2 = NULL;
LPVOID tt_head = NULL;
LPVOID tt_post = NULL;
@@ -1174,7 +1176,15 @@ HRESULT create_font_from_logfont(const LOGFONTW *logfont, IDWriteFont **font)
familyname = (WCHAR*)((char*)otm + (ptrdiff_t)otm->otmpFamilyName);
TRACE("facename=%s, familyname=%s\n", debugstr_w(facename), debugstr_w(familyname));
- hr = create_fontfamily(familyname, &family);
+ hr = create_localizedstrings(&name);
+ if (FAILED(hr))
+ {
+ heap_free(This);
+ return hr;
+ }
+ add_localizedstring(name, enusW, familyname);
+ hr = create_fontfamily(name, &family);
+
heap_free(otm);
if (hr != S_OK)
{
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 01394dc..bcddbba 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -355,6 +355,37 @@ HRESULT add_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *locale,
return S_OK;
}
+HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **strings)
+{
+ struct localizedstrings *This = impl_from_IDWriteLocalizedStrings(iface);
+ struct localizedstrings *New;
+ int i;
+
+ *strings = NULL;
+
+ New = heap_alloc(sizeof(struct localizedstrings));
+ if (!This) return E_OUTOFMEMORY;
+
+ New->IDWriteLocalizedStrings_iface.lpVtbl = &localizedstringsvtbl;
+ New->ref = 1;
+ New->count = This->count;
+ New->data = heap_alloc(sizeof(struct localizedpair) * New->count);
+ if (!New->data) {
+ heap_free(New);
+ return E_OUTOFMEMORY;
+ }
+ for (i = 0; i < New->count; i++)
+ {
+ New->data[i].locale = heap_strdupW(This->data[i].locale);
+ New->data[i].string = heap_strdupW(This->data[i].string);
+ }
+ New->alloc = New->count;
+
+ *strings = &New->IDWriteLocalizedStrings_iface;
+
+ return S_OK;
+}
+
struct dwritefactory{
IDWriteFactory IDWriteFactory_iface;
LONG ref;
More information about the wine-cvs
mailing list