Module: wine Branch: master Commit: ab7c65ae436fa5027846184c5b4fb6b56aee9ab8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ab7c65ae436fa5027846184c5b...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Aug 6 18:02:43 2015 +0300
dwrite: Implement IsSymbolFont().
---
dlls/dwrite/dwrite_private.h | 1 + dlls/dwrite/font.c | 7 +++++-- dlls/dwrite/freetype.c | 43 ++++++++++++++++++++++++++++++++++++++++++ dlls/dwrite/tests/font.c | 45 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+), 2 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 75098cf..cee49df 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -195,6 +195,7 @@ extern BOOL freetype_has_kerning_pairs(IDWriteFontFace2*) DECLSPEC_HIDDEN; extern INT32 freetype_get_kerning_pair_adjustment(IDWriteFontFace2*,UINT16,UINT16) DECLSPEC_HIDDEN; extern void freetype_get_glyph_bbox(IDWriteFontFace2*,FLOAT,UINT16,BOOL,RECT*) DECLSPEC_HIDDEN; extern void freetype_get_glyph_bitmap(IDWriteFontFace2*,FLOAT,UINT16,const RECT*,BYTE*) DECLSPEC_HIDDEN; +extern INT freetype_get_charmap_index(IDWriteFontFace2*,BOOL*) DECLSPEC_HIDDEN;
/* Glyph shaping */ enum SCRIPT_JUSTIFY diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index aaa0f42..a4ed575 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -148,6 +148,8 @@ struct dwrite_fontface { DWRITE_FONT_FACE_TYPE type; DWRITE_FONT_METRICS1 metrics; DWRITE_CARET_METRICS caret; + INT charmap; + BOOL is_symbol;
struct dwrite_fonttable cmap; struct dwrite_fonttable vdmx; @@ -401,8 +403,8 @@ static DWRITE_FONT_SIMULATIONS WINAPI dwritefontface_GetSimulations(IDWriteFontF static BOOL WINAPI dwritefontface_IsSymbolFont(IDWriteFontFace2 *iface) { struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface); - FIXME("(%p): stub\n", This); - return FALSE; + TRACE("(%p)\n", This); + return This->is_symbol; }
static void WINAPI dwritefontface_GetMetrics(IDWriteFontFace2 *iface, DWRITE_FONT_METRICS *metrics) @@ -2500,6 +2502,7 @@ HRESULT create_fontface(DWRITE_FONT_FACE_TYPE facetype, UINT32 files_number, IDW fontface->caret.slopeRun = fontface->caret.slopeRise / 3; } } + fontface->charmap = freetype_get_charmap_index(&fontface->IDWriteFontFace2_iface, &fontface->is_symbol);
*ret = &fontface->IDWriteFontFace2_iface; return S_OK; diff --git a/dlls/dwrite/freetype.c b/dlls/dwrite/freetype.c index 2c02b26..e693f9a 100644 --- a/dlls/dwrite/freetype.c +++ b/dlls/dwrite/freetype.c @@ -28,6 +28,7 @@ #include FT_CACHE_H #include FT_FREETYPE_H #include FT_OUTLINE_H +#include FT_TRUETYPE_TABLES_H #endif /* HAVE_FT2BUILD_H */
#include "windef.h" @@ -64,7 +65,9 @@ typedef struct
#define MAKE_FUNCPTR(f) static typeof(f) * p##f = NULL MAKE_FUNCPTR(FT_Done_FreeType); +MAKE_FUNCPTR(FT_Get_First_Char); MAKE_FUNCPTR(FT_Get_Kerning); +MAKE_FUNCPTR(FT_Get_Sfnt_Table); MAKE_FUNCPTR(FT_Glyph_Get_CBox); MAKE_FUNCPTR(FT_Init_FreeType); MAKE_FUNCPTR(FT_Library_Version); @@ -145,7 +148,9 @@ BOOL init_freetype(void)
#define LOAD_FUNCPTR(f) if((p##f = wine_dlsym(ft_handle, #f, NULL, 0)) == NULL){WARN("Can't find symbol %s\n", #f); goto sym_not_found;} LOAD_FUNCPTR(FT_Done_FreeType) + LOAD_FUNCPTR(FT_Get_First_Char) LOAD_FUNCPTR(FT_Get_Kerning) + LOAD_FUNCPTR(FT_Get_Sfnt_Table) LOAD_FUNCPTR(FT_Glyph_Get_CBox) LOAD_FUNCPTR(FT_Init_FreeType) LOAD_FUNCPTR(FT_Library_Version) @@ -554,6 +559,38 @@ void freetype_get_glyph_bitmap(IDWriteFontFace2 *fontface, FLOAT emSize, UINT16 LeaveCriticalSection(&freetype_cs); }
+INT freetype_get_charmap_index(IDWriteFontFace2 *fontface, BOOL *is_symbol) +{ + INT charmap_index = -1; + FT_Face face; + + *is_symbol = FALSE; + + EnterCriticalSection(&freetype_cs); + if (pFTC_Manager_LookupFace(cache_manager, fontface, &face) == 0) { + TT_OS2 *os2 = pFT_Get_Sfnt_Table(face, ft_sfnt_os2); + FT_Int i; + + if (os2) { + FT_UInt dummy; + if (os2->version == 0) + *is_symbol = pFT_Get_First_Char(face, &dummy) >= 0x100; + else + *is_symbol = os2->ulCodePageRange1 & FS_SYMBOL; + } + + for (i = 0; i < face->num_charmaps; i++) + if (face->charmaps[i]->encoding == FT_ENCODING_MS_SYMBOL) { + *is_symbol = TRUE; + charmap_index = i; + break; + } + } + LeaveCriticalSection(&freetype_cs); + + return charmap_index; +} + #else /* HAVE_FREETYPE */
BOOL init_freetype(void) @@ -616,4 +653,10 @@ void freetype_get_glyph_bitmap(IDWriteFontFace2 *fontface, FLOAT emSize, UINT16 memset(buf, 0, size); }
+INT freetype_get_charmap_index(IDWriteFontFace2 *fontface, BOOL *is_symbol) +{ + *is_symbol = FALSE; + return -1; +} + #endif /* HAVE_FREETYPE */ diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index 327a29f..9a75abc 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -4710,6 +4710,50 @@ static void test_CreateAlphaTexture(void) IDWriteFactory_Release(factory); }
+static void test_IsSymbolFont(void) +{ + static const WCHAR symbolW[] = {'S','y','m','b','o','l',0}; + IDWriteFontCollection *collection; + IDWriteFontFace *fontface; + IDWriteFactory *factory; + IDWriteFont *font; + HRESULT hr; + BOOL ret; + + factory = create_factory(); + + /* Tahoma */ + fontface = create_fontface(factory); + ret = IDWriteFontFace_IsSymbolFont(fontface); + ok(!ret, "got %d\n", ret); + + hr = IDWriteFactory_GetSystemFontCollection(factory, &collection, FALSE); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IDWriteFontCollection_GetFontFromFontFace(collection, fontface, &font); + ok(hr == S_OK, "got 0x%08x\n", hr); + + ret = IDWriteFont_IsSymbolFont(font); + ok(!ret, "got %d\n", ret); + + IDWriteFontCollection_Release(collection); + IDWriteFont_Release(font); + IDWriteFontFace_Release(fontface); + + /* Symbol */ + font = get_font(factory, symbolW, DWRITE_FONT_STYLE_NORMAL); + ret = IDWriteFont_IsSymbolFont(font); + ok(ret, "got %d\n", ret); + + hr = IDWriteFont_CreateFontFace(font, &fontface); + ok(hr == S_OK, "got 0x%08x\n", hr); + ret = IDWriteFontFace_IsSymbolFont(fontface); + ok(ret, "got %d\n", ret); + IDWriteFont_Release(font); + + IDWriteFactory_Release(factory); +} + START_TEST(font) { IDWriteFactory *factory; @@ -4759,6 +4803,7 @@ START_TEST(font) test_GetRecommendedRenderingMode(); test_GetAlphaBlendParams(); test_CreateAlphaTexture(); + test_IsSymbolFont();
IDWriteFactory_Release(factory); }