Module: wine Branch: master Commit: b0f50e7e5bee10adaa0541a24a1d92ab493449be URL: http://source.winehq.org/git/wine.git/?a=commit;h=b0f50e7e5bee10adaa0541a24a...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Fri Apr 21 14:28:24 2017 +0300
dwrite: Partially implement GetGlyphImageFormats().
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/dwrite/dwrite_private.h | 1 + dlls/dwrite/font.c | 8 ++++++-- dlls/dwrite/opentype.c | 38 ++++++++++++++++++++++++++++++++++++++ dlls/dwrite/tests/font.c | 1 - 4 files changed, 45 insertions(+), 3 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 886beb7..7dca5fb 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -229,6 +229,7 @@ extern UINT32 opentype_get_cpal_paletteentrycount(const void*) DECLSPEC_HIDDEN; extern HRESULT opentype_get_cpal_entries(const void*,UINT32,UINT32,UINT32,DWRITE_COLOR_F*) DECLSPEC_HIDDEN; extern HRESULT opentype_get_font_signature(struct file_stream_desc*,FONTSIGNATURE*) DECLSPEC_HIDDEN; extern BOOL opentype_has_vertical_variants(IDWriteFontFace4*) DECLSPEC_HIDDEN; +extern UINT32 opentype_get_glyph_image_formats(IDWriteFontFace4*) DECLSPEC_HIDDEN;
struct dwrite_colorglyph { USHORT layer; /* [0, num_layers) index indicating current layer */ diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index c74b2bb..ca2d69a 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -242,6 +242,7 @@ struct dwrite_fontface { DWRITE_FONT_STRETCH stretch; DWRITE_FONT_WEIGHT weight; DWRITE_PANOSE panose; + UINT32 glyph_image_formats;
LOGFONTW lf; }; @@ -1278,8 +1279,10 @@ static HRESULT WINAPI dwritefontface4_GetGlyphImageFormats_(IDWriteFontFace4 *if static DWRITE_GLYPH_IMAGE_FORMATS WINAPI dwritefontface4_GetGlyphImageFormats(IDWriteFontFace4 *iface) { struct dwrite_fontface *This = impl_from_IDWriteFontFace4(iface); - FIXME("(%p): stub\n", This); - return DWRITE_GLYPH_IMAGE_FORMATS_NONE; + + TRACE("(%p)\n", This); + + return This->glyph_image_formats; }
static HRESULT WINAPI dwritefontface4_GetGlyphImageData(IDWriteFontFace4 *iface, UINT16 glyph, @@ -4345,6 +4348,7 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li fontface->flags |= FONTFACE_IS_MONOSPACED; if (opentype_has_vertical_variants(&fontface->IDWriteFontFace4_iface)) fontface->flags |= FONTFACE_HAS_VERTICAL_VARIANTS; + fontface->glyph_image_formats = opentype_get_glyph_image_formats(&fontface->IDWriteFontFace4_iface);
/* Font properties are reused from font object when 'normal' face creation path is used: collection -> family -> matching font -> fontface. diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c index 7a3e641..b7e9d87 100644 --- a/dlls/dwrite/opentype.c +++ b/dlls/dwrite/opentype.c @@ -34,6 +34,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(dwrite); #define MS_GPOS_TAG DWRITE_MAKE_OPENTYPE_TAG('G','P','O','S') #define MS_GSUB_TAG DWRITE_MAKE_OPENTYPE_TAG('G','S','U','B') #define MS_NAME_TAG DWRITE_MAKE_OPENTYPE_TAG('n','a','m','e') +#define MS_GLYF_TAG DWRITE_MAKE_OPENTYPE_TAG('g','l','y','f') +#define MS_CFF__TAG DWRITE_MAKE_OPENTYPE_TAG('C','F','F',' ') +#define MS_COLR_TAG DWRITE_MAKE_OPENTYPE_TAG('C','O','L','R')
#ifdef WORDS_BIGENDIAN #define GET_BE_WORD(x) (x) @@ -2034,3 +2037,38 @@ BOOL opentype_has_vertical_variants(IDWriteFontFace4 *fontface)
return ret; } + +static BOOL opentype_has_font_table(IDWriteFontFace4 *fontface, UINT32 tag) +{ + BOOL exists = FALSE; + const void *data; + void *context; + UINT32 size; + HRESULT hr; + + hr = IDWriteFontFace4_TryGetFontTable(fontface, tag, &data, &size, &context, &exists); + if (FAILED(hr)) + return FALSE; + + if (exists) + IDWriteFontFace4_ReleaseFontTable(fontface, context); + + return exists; +} + +UINT32 opentype_get_glyph_image_formats(IDWriteFontFace4 *fontface) +{ + UINT32 ret = DWRITE_GLYPH_IMAGE_FORMATS_NONE; + + if (opentype_has_font_table(fontface, MS_GLYF_TAG)) + ret |= DWRITE_GLYPH_IMAGE_FORMATS_TRUETYPE; + + if (opentype_has_font_table(fontface, MS_CFF__TAG)) + ret |= DWRITE_GLYPH_IMAGE_FORMATS_CFF; + + if (opentype_has_font_table(fontface, MS_COLR_TAG)) + ret |= DWRITE_GLYPH_IMAGE_FORMATS_COLR; + + /* TODO: handle SVG and bitmap data */ + return ret; +} diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index 2c874df..4d5780c 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -7504,7 +7504,6 @@ static void test_GetGlyphImageFormats(void) /* Mask describes font as a whole. */ formats = IDWriteFontFace4_GetGlyphImageFormats(fontface4); expected_formats = get_face_glyph_image_formats(fontface4); - todo_wine ok(formats == expected_formats, "%s - %s, expected formats %#x, got formats %#x.\n", wine_dbgstr_w(familynameW), wine_dbgstr_w(facenameW), expected_formats, formats);