dwrite: Evaluate IsMonospacedFont() flag at font level.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
0b0a2ce8fd
commit
fec78e62ee
|
@ -186,7 +186,7 @@ struct fontfacecached
|
||||||
enum font_flags
|
enum font_flags
|
||||||
{
|
{
|
||||||
FONT_IS_SYMBOL = 1 << 0,
|
FONT_IS_SYMBOL = 1 << 0,
|
||||||
FONTFACE_IS_MONOSPACED = 1 << 1,
|
FONT_IS_MONOSPACED = 1 << 1,
|
||||||
FONTFACE_HAS_KERNING_PAIRS = 1 << 2,
|
FONTFACE_HAS_KERNING_PAIRS = 1 << 2,
|
||||||
FONTFACE_HAS_VERTICAL_VARIANTS = 1 << 3
|
FONTFACE_HAS_VERTICAL_VARIANTS = 1 << 3
|
||||||
};
|
};
|
||||||
|
@ -391,7 +391,6 @@ extern void release_freetype(void) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT freetype_get_design_glyph_metrics(struct dwrite_fontface *fontface, UINT16 glyph,
|
extern HRESULT freetype_get_design_glyph_metrics(struct dwrite_fontface *fontface, UINT16 glyph,
|
||||||
DWRITE_GLYPH_METRICS *metrics) DECLSPEC_HIDDEN;
|
DWRITE_GLYPH_METRICS *metrics) DECLSPEC_HIDDEN;
|
||||||
extern void freetype_notify_cacheremove(IDWriteFontFace5 *fontface) DECLSPEC_HIDDEN;
|
extern void freetype_notify_cacheremove(IDWriteFontFace5 *fontface) DECLSPEC_HIDDEN;
|
||||||
extern BOOL freetype_is_monospaced(IDWriteFontFace5 *fontface) DECLSPEC_HIDDEN;
|
|
||||||
extern HRESULT freetype_get_glyphrun_outline(IDWriteFontFace5 *fontface, float emsize, UINT16 const *glyphs,
|
extern HRESULT freetype_get_glyphrun_outline(IDWriteFontFace5 *fontface, float emsize, UINT16 const *glyphs,
|
||||||
float const *advances, DWRITE_GLYPH_OFFSET const *offsets, unsigned int count, BOOL is_rtl,
|
float const *advances, DWRITE_GLYPH_OFFSET const *offsets, unsigned int count, BOOL is_rtl,
|
||||||
IDWriteGeometrySink *sink) DECLSPEC_HIDDEN;
|
IDWriteGeometrySink *sink) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -955,7 +955,7 @@ static BOOL WINAPI dwritefontface1_IsMonospacedFont(IDWriteFontFace5 *iface)
|
||||||
|
|
||||||
TRACE("%p.\n", iface);
|
TRACE("%p.\n", iface);
|
||||||
|
|
||||||
return !!(fontface->flags & FONTFACE_IS_MONOSPACED);
|
return !!(fontface->flags & FONT_IS_MONOSPACED);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fontface_get_design_advance(struct dwrite_fontface *fontface, DWRITE_MEASURING_MODE measuring_mode,
|
static int fontface_get_design_advance(struct dwrite_fontface *fontface, DWRITE_MEASURING_MODE measuring_mode,
|
||||||
|
@ -1765,19 +1765,10 @@ static HRESULT WINAPI dwritefont1_GetUnicodeRanges(IDWriteFont3 *iface, UINT32 m
|
||||||
static BOOL WINAPI dwritefont1_IsMonospacedFont(IDWriteFont3 *iface)
|
static BOOL WINAPI dwritefont1_IsMonospacedFont(IDWriteFont3 *iface)
|
||||||
{
|
{
|
||||||
struct dwrite_font *font = impl_from_IDWriteFont3(iface);
|
struct dwrite_font *font = impl_from_IDWriteFont3(iface);
|
||||||
IDWriteFontFace5 *fontface;
|
|
||||||
HRESULT hr;
|
|
||||||
BOOL ret;
|
|
||||||
|
|
||||||
TRACE("%p.\n", iface);
|
TRACE("%p.\n", iface);
|
||||||
|
|
||||||
hr = get_fontface_from_font(font, &fontface);
|
return !!(font->data->flags & FONT_IS_MONOSPACED);
|
||||||
if (FAILED(hr))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
ret = IDWriteFontFace5_IsMonospacedFont(fontface);
|
|
||||||
IDWriteFontFace5_Release(fontface);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL WINAPI dwritefont2_IsColorFont(IDWriteFont3 *iface)
|
static BOOL WINAPI dwritefont2_IsColorFont(IDWriteFont3 *iface)
|
||||||
|
@ -4690,8 +4681,6 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li
|
||||||
fontface->charmap = freetype_get_charmap_index(&fontface->IDWriteFontFace5_iface);
|
fontface->charmap = freetype_get_charmap_index(&fontface->IDWriteFontFace5_iface);
|
||||||
if (freetype_has_kerning_pairs(&fontface->IDWriteFontFace5_iface))
|
if (freetype_has_kerning_pairs(&fontface->IDWriteFontFace5_iface))
|
||||||
fontface->flags |= FONTFACE_HAS_KERNING_PAIRS;
|
fontface->flags |= FONTFACE_HAS_KERNING_PAIRS;
|
||||||
if (freetype_is_monospaced(&fontface->IDWriteFontFace5_iface))
|
|
||||||
fontface->flags |= FONTFACE_IS_MONOSPACED;
|
|
||||||
if (opentype_has_vertical_variants(&fontface->IDWriteFontFace5_iface))
|
if (opentype_has_vertical_variants(&fontface->IDWriteFontFace5_iface))
|
||||||
fontface->flags |= FONTFACE_HAS_VERTICAL_VARIANTS;
|
fontface->flags |= FONTFACE_HAS_VERTICAL_VARIANTS;
|
||||||
fontface->glyph_image_formats = opentype_get_glyph_image_formats(&fontface->IDWriteFontFace5_iface);
|
fontface->glyph_image_formats = opentype_get_glyph_image_formats(&fontface->IDWriteFontFace5_iface);
|
||||||
|
@ -4709,8 +4698,7 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li
|
||||||
fontface->panose = desc->font_data->panose;
|
fontface->panose = desc->font_data->panose;
|
||||||
fontface->fontsig = desc->font_data->fontsig;
|
fontface->fontsig = desc->font_data->fontsig;
|
||||||
fontface->lf = desc->font_data->lf;
|
fontface->lf = desc->font_data->lf;
|
||||||
if (desc->font_data->flags & FONT_IS_SYMBOL)
|
fontface->flags |= desc->font_data->flags & (FONT_IS_SYMBOL | FONT_IS_MONOSPACED);
|
||||||
fontface->flags |= FONT_IS_SYMBOL;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -4730,8 +4718,7 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li
|
||||||
fontface->panose = data->panose;
|
fontface->panose = data->panose;
|
||||||
fontface->fontsig = data->fontsig;
|
fontface->fontsig = data->fontsig;
|
||||||
fontface->lf = data->lf;
|
fontface->lf = data->lf;
|
||||||
if (data->flags & FONT_IS_SYMBOL)
|
fontface->flags |= data->flags & (FONT_IS_SYMBOL | FONT_IS_MONOSPACED);
|
||||||
fontface->flags |= FONT_IS_SYMBOL;
|
|
||||||
|
|
||||||
IDWriteLocalizedStrings_Release(names);
|
IDWriteLocalizedStrings_Release(names);
|
||||||
release_font_data(data);
|
release_font_data(data);
|
||||||
|
|
|
@ -303,19 +303,6 @@ HRESULT freetype_get_design_glyph_metrics(struct dwrite_fontface *fontface, UINT
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL freetype_is_monospaced(IDWriteFontFace5 *fontface)
|
|
||||||
{
|
|
||||||
BOOL is_monospaced = FALSE;
|
|
||||||
FT_Face face;
|
|
||||||
|
|
||||||
EnterCriticalSection(&freetype_cs);
|
|
||||||
if (pFTC_Manager_LookupFace(cache_manager, fontface, &face) == 0)
|
|
||||||
is_monospaced = !!FT_IS_FIXED_WIDTH(face);
|
|
||||||
LeaveCriticalSection(&freetype_cs);
|
|
||||||
|
|
||||||
return is_monospaced;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct decompose_context {
|
struct decompose_context {
|
||||||
IDWriteGeometrySink *sink;
|
IDWriteGeometrySink *sink;
|
||||||
D2D1_POINT_2F offset;
|
D2D1_POINT_2F offset;
|
||||||
|
@ -925,11 +912,6 @@ HRESULT freetype_get_design_glyph_metrics(struct dwrite_fontface *fontface, UINT
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL freetype_is_monospaced(IDWriteFontFace5 *fontface)
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT freetype_get_glyphrun_outline(IDWriteFontFace5 *fontface, float emSize, UINT16 const *glyphs,
|
HRESULT freetype_get_glyphrun_outline(IDWriteFontFace5 *fontface, float emSize, UINT16 const *glyphs,
|
||||||
float const *advances, DWRITE_GLYPH_OFFSET const *offsets, unsigned int count, BOOL is_rtl,
|
float const *advances, DWRITE_GLYPH_OFFSET const *offsets, unsigned int count, BOOL is_rtl,
|
||||||
IDWriteGeometrySink *sink)
|
IDWriteGeometrySink *sink)
|
||||||
|
|
|
@ -1716,9 +1716,9 @@ void opentype_get_font_metrics(struct file_stream_desc *stream_desc, DWRITE_FONT
|
||||||
void opentype_get_font_properties(struct file_stream_desc *stream_desc, struct dwrite_font_props *props)
|
void opentype_get_font_properties(struct file_stream_desc *stream_desc, struct dwrite_font_props *props)
|
||||||
{
|
{
|
||||||
struct dwrite_fonttable os2, head;
|
struct dwrite_fonttable os2, head;
|
||||||
|
BOOL is_symbol, is_monospaced;
|
||||||
const TT_OS2_V2 *tt_os2;
|
const TT_OS2_V2 *tt_os2;
|
||||||
const TT_HEAD *tt_head;
|
const TT_HEAD *tt_head;
|
||||||
BOOL is_symbol;
|
|
||||||
|
|
||||||
opentype_get_font_table(stream_desc, MS_OS2_TAG, &os2);
|
opentype_get_font_table(stream_desc, MS_OS2_TAG, &os2);
|
||||||
opentype_get_font_table(stream_desc, MS_HEAD_TAG, &head);
|
opentype_get_font_table(stream_desc, MS_HEAD_TAG, &head);
|
||||||
|
@ -1733,6 +1733,7 @@ void opentype_get_font_properties(struct file_stream_desc *stream_desc, struct d
|
||||||
memset(&props->panose, 0, sizeof(props->panose));
|
memset(&props->panose, 0, sizeof(props->panose));
|
||||||
memset(&props->fontsig, 0, sizeof(props->fontsig));
|
memset(&props->fontsig, 0, sizeof(props->fontsig));
|
||||||
memset(&props->lf, 0, sizeof(props->lf));
|
memset(&props->lf, 0, sizeof(props->lf));
|
||||||
|
props->flags = 0;
|
||||||
|
|
||||||
/* DWRITE_FONT_STRETCH enumeration values directly match font data values */
|
/* DWRITE_FONT_STRETCH enumeration values directly match font data values */
|
||||||
if (tt_os2)
|
if (tt_os2)
|
||||||
|
@ -1823,6 +1824,22 @@ void opentype_get_font_properties(struct file_stream_desc *stream_desc, struct d
|
||||||
if (is_symbol)
|
if (is_symbol)
|
||||||
props->flags |= FONT_IS_SYMBOL;
|
props->flags |= FONT_IS_SYMBOL;
|
||||||
|
|
||||||
|
if (!(is_monospaced = props->panose.text.proportion == DWRITE_PANOSE_PROPORTION_MONOSPACED))
|
||||||
|
{
|
||||||
|
struct dwrite_fonttable post;
|
||||||
|
|
||||||
|
opentype_get_font_table(stream_desc, MS_POST_TAG, &post);
|
||||||
|
|
||||||
|
if (post.data)
|
||||||
|
{
|
||||||
|
is_monospaced = !!table_read_dword(&post, FIELD_OFFSET(TT_POST, fixed_pitch));
|
||||||
|
|
||||||
|
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, post.context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (is_monospaced)
|
||||||
|
props->flags |= FONT_IS_MONOSPACED;
|
||||||
|
|
||||||
TRACE("stretch=%d, weight=%d, style %d\n", props->stretch, props->weight, props->style);
|
TRACE("stretch=%d, weight=%d, style %d\n", props->stretch, props->weight, props->style);
|
||||||
|
|
||||||
if (os2.data)
|
if (os2.data)
|
||||||
|
|
|
@ -4990,9 +4990,7 @@ static void test_IsMonospacedFont(void)
|
||||||
|
|
||||||
IDWriteFont1_GetPanose(font1, &panose);
|
IDWriteFont1_GetPanose(font1, &panose);
|
||||||
|
|
||||||
/* FIXME: failures disabled on Wine for now */
|
|
||||||
is_monospaced_expected = get_expected_is_monospaced(fontface1, &panose);
|
is_monospaced_expected = get_expected_is_monospaced(fontface1, &panose);
|
||||||
todo_wine_if(is_monospaced_expected != is_monospaced_face)
|
|
||||||
ok(is_monospaced_expected == is_monospaced_face, "Unexpected is_monospaced flag %d for %s, font %d.\n",
|
ok(is_monospaced_expected == is_monospaced_face, "Unexpected is_monospaced flag %d for %s, font %d.\n",
|
||||||
is_monospaced_face, wine_dbgstr_w(nameW), j);
|
is_monospaced_face, wine_dbgstr_w(nameW), j);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue