dwrite: Pass index directly to font and family creation helpers.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2017-04-11 14:21:33 +03:00 committed by Alexandre Julliard
parent be5a4656bd
commit f5b6563bec
1 changed files with 25 additions and 24 deletions

View File

@ -1737,7 +1737,7 @@ void get_logfont_from_fontface(IDWriteFontFace *iface, LOGFONTW *lf)
*lf = fontface->lf; *lf = fontface->lf;
} }
static HRESULT create_font(struct dwrite_font_data *data, struct dwrite_fontfamily *family, IDWriteFont3 **font) static HRESULT create_font(struct dwrite_fontfamily *family, UINT32 index, IDWriteFont3 **font)
{ {
struct dwrite_font *This; struct dwrite_font *This;
@ -1751,8 +1751,8 @@ static HRESULT create_font(struct dwrite_font_data *data, struct dwrite_fontfami
This->ref = 1; This->ref = 1;
This->family = family; This->family = family;
IDWriteFontFamily1_AddRef(&family->IDWriteFontFamily1_iface); IDWriteFontFamily1_AddRef(&family->IDWriteFontFamily1_iface);
This->style = data->style; This->data = family->data->fonts[index];
This->data = data; This->style = This->data->style;
InterlockedIncrement(&This->data->ref); InterlockedIncrement(&This->data->ref);
*font = &This->IDWriteFont3_iface; *font = &This->IDWriteFont3_iface;
@ -1835,7 +1835,7 @@ static HRESULT WINAPI dwritefontlist_GetFont(IDWriteFontList1 *iface, UINT32 ind
if (index >= This->font_count) if (index >= This->font_count)
return E_INVALIDARG; return E_INVALIDARG;
return create_font(This->fonts[index], This->family, (IDWriteFont3 **)font); return create_font(This->family, index, (IDWriteFont3 **)font);
} }
static DWRITE_LOCALITY WINAPI dwritefontlist1_GetFontLocality(IDWriteFontList1 *iface, UINT32 index) static DWRITE_LOCALITY WINAPI dwritefontlist1_GetFontLocality(IDWriteFontList1 *iface, UINT32 index)
@ -1861,7 +1861,7 @@ static HRESULT WINAPI dwritefontlist1_GetFont(IDWriteFontList1 *iface, UINT32 in
if (index >= This->font_count) if (index >= This->font_count)
return E_FAIL; return E_FAIL;
return create_font(This->fonts[index], This->family, font); return create_font(This->family, index, font);
} }
static HRESULT WINAPI dwritefontlist1_GetFontFaceReference(IDWriteFontList1 *iface, UINT32 index, static HRESULT WINAPI dwritefontlist1_GetFontFaceReference(IDWriteFontList1 *iface, UINT32 index,
@ -1974,7 +1974,7 @@ static HRESULT WINAPI dwritefontfamily_GetFont(IDWriteFontFamily1 *iface, UINT32
if (index >= This->data->font_count) if (index >= This->data->font_count)
return E_INVALIDARG; return E_INVALIDARG;
return create_font(This->data->fonts[index], This, (IDWriteFont3 **)font); return create_font(This, index, (IDWriteFont3 **)font);
} }
static HRESULT WINAPI dwritefontfamily_GetFamilyNames(IDWriteFontFamily1 *iface, IDWriteLocalizedStrings **names) static HRESULT WINAPI dwritefontfamily_GetFamilyNames(IDWriteFontFamily1 *iface, IDWriteLocalizedStrings **names)
@ -2029,8 +2029,7 @@ static HRESULT WINAPI dwritefontfamily_GetFirstMatchingFont(IDWriteFontFamily1 *
{ {
struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface); struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily1(iface);
struct dwrite_font_propvec req; struct dwrite_font_propvec req;
struct dwrite_font_data *match; UINT32 i, match;
UINT32 i;
TRACE("(%p)->(%d %d %d %p)\n", This, weight, stretch, style, font); TRACE("(%p)->(%d %d %d %p)\n", This, weight, stretch, style, font);
@ -2040,14 +2039,14 @@ static HRESULT WINAPI dwritefontfamily_GetFirstMatchingFont(IDWriteFontFamily1 *
} }
init_font_prop_vec(weight, stretch, style, &req); init_font_prop_vec(weight, stretch, style, &req);
match = This->data->fonts[0]; match = 0;
for (i = 1; i < This->data->font_count; i++) { for (i = 1; i < This->data->font_count; i++) {
if (is_better_font_match(&This->data->fonts[i]->propvec, &match->propvec, &req)) if (is_better_font_match(&This->data->fonts[i]->propvec, &This->data->fonts[match]->propvec, &req))
match = This->data->fonts[i]; match = i;
} }
return create_font(match, This, (IDWriteFont3 **)font); return create_font(This, match, (IDWriteFont3 **)font);
} }
typedef BOOL (*matching_filter_func)(const struct dwrite_font_data*); typedef BOOL (*matching_filter_func)(const struct dwrite_font_data*);
@ -2163,7 +2162,7 @@ static HRESULT WINAPI dwritefontfamily1_GetFont(IDWriteFontFamily1 *iface, UINT3
if (index >= This->data->font_count) if (index >= This->data->font_count)
return E_FAIL; return E_FAIL;
return create_font(This->data->fonts[index], This, font); return create_font(This, index, font);
} }
static HRESULT WINAPI dwritefontfamily1_GetFontFaceReference(IDWriteFontFamily1 *iface, UINT32 index, static HRESULT WINAPI dwritefontfamily1_GetFontFaceReference(IDWriteFontFamily1 *iface, UINT32 index,
@ -2202,8 +2201,7 @@ static const IDWriteFontFamily1Vtbl fontfamilyvtbl = {
dwritefontfamily1_GetFontFaceReference dwritefontfamily1_GetFontFaceReference
}; };
static HRESULT create_fontfamily(struct dwrite_fontfamily_data *data, struct dwrite_fontcollection *collection, static HRESULT create_fontfamily(struct dwrite_fontcollection *collection, UINT32 index, IDWriteFontFamily1 **family)
IDWriteFontFamily1 **family)
{ {
struct dwrite_fontfamily *This; struct dwrite_fontfamily *This;
@ -2216,7 +2214,7 @@ static HRESULT create_fontfamily(struct dwrite_fontfamily_data *data, struct dwr
This->ref = 1; This->ref = 1;
This->collection = collection; This->collection = collection;
IDWriteFontCollection1_AddRef(&collection->IDWriteFontCollection1_iface); IDWriteFontCollection1_AddRef(&collection->IDWriteFontCollection1_iface);
This->data = data; This->data = collection->family_data[index];
InterlockedIncrement(&This->data->ref); InterlockedIncrement(&This->data->ref);
*family = &This->IDWriteFontFamily1_iface; *family = &This->IDWriteFontFamily1_iface;
@ -2317,7 +2315,7 @@ static HRESULT WINAPI dwritefontcollection_GetFontFamily(IDWriteFontCollection1
return E_FAIL; return E_FAIL;
} }
return create_fontfamily(This->family_data[index], This, (IDWriteFontFamily1 **)family); return create_fontfamily(This, index, (IDWriteFontFamily1 **)family);
} }
static UINT32 collection_find_family(struct dwrite_fontcollection *collection, const WCHAR *name) static UINT32 collection_find_family(struct dwrite_fontcollection *collection, const WCHAR *name)
@ -2375,10 +2373,9 @@ static BOOL is_same_fontfile(IDWriteFontFile *left, IDWriteFontFile *right)
static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollection1 *iface, IDWriteFontFace *face, IDWriteFont **font) static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollection1 *iface, IDWriteFontFace *face, IDWriteFont **font)
{ {
struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection1(iface); struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection1(iface);
struct dwrite_fontfamily_data *found_family = NULL;
struct dwrite_font_data *found_font = NULL;
IDWriteFontFamily1 *family; IDWriteFontFamily1 *family;
UINT32 i, j, face_index; UINT32 i, j, face_index;
BOOL found_font = FALSE;
IDWriteFontFile *file; IDWriteFontFile *file;
HRESULT hr; HRESULT hr;
@ -2395,27 +2392,31 @@ static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollec
return hr; return hr;
face_index = IDWriteFontFace_GetIndex(face); face_index = IDWriteFontFace_GetIndex(face);
found_font = FALSE;
for (i = 0; i < This->family_count; i++) { for (i = 0; i < This->family_count; i++) {
struct dwrite_fontfamily_data *family_data = This->family_data[i]; struct dwrite_fontfamily_data *family_data = This->family_data[i];
for (j = 0; j < family_data->font_count; j++) { for (j = 0; j < family_data->font_count; j++) {
struct dwrite_font_data *font_data = family_data->fonts[j]; struct dwrite_font_data *font_data = family_data->fonts[j];
if (face_index == font_data->face_index && is_same_fontfile(file, font_data->file)) { if (face_index == font_data->face_index && is_same_fontfile(file, font_data->file)) {
found_font = font_data; found_font = TRUE;
found_family = family_data;
break; break;
} }
} }
if (found_font)
break;
} }
if (!found_font) if (!found_font)
return DWRITE_E_NOFONT; return DWRITE_E_NOFONT;
hr = create_fontfamily(found_family, This, &family); hr = create_fontfamily(This, i, &family);
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
hr = create_font(found_font, impl_from_IDWriteFontFamily1(family), (IDWriteFont3 **)font); hr = create_font(impl_from_IDWriteFontFamily1(family), j, (IDWriteFont3 **)font);
IDWriteFontFamily1_Release(family); IDWriteFontFamily1_Release(family);
return hr; return hr;
} }
@ -2440,7 +2441,7 @@ static HRESULT WINAPI dwritefontcollection1_GetFontFamily(IDWriteFontCollection1
return E_FAIL; return E_FAIL;
} }
return create_fontfamily(This->family_data[index], This, family); return create_fontfamily(This, index, family);
} }
static const IDWriteFontCollection1Vtbl fontcollectionvtbl = { static const IDWriteFontCollection1Vtbl fontcollectionvtbl = {