dwrite: Implement IsSymbolFont().
This commit is contained in:
parent
7540fa5a1a
commit
ab7c65ae43
@ -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 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_bbox(IDWriteFontFace2*,FLOAT,UINT16,BOOL,RECT*) DECLSPEC_HIDDEN;
|
||||||
extern void freetype_get_glyph_bitmap(IDWriteFontFace2*,FLOAT,UINT16,const RECT*,BYTE*) 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 */
|
/* Glyph shaping */
|
||||||
enum SCRIPT_JUSTIFY
|
enum SCRIPT_JUSTIFY
|
||||||
|
@ -148,6 +148,8 @@ struct dwrite_fontface {
|
|||||||
DWRITE_FONT_FACE_TYPE type;
|
DWRITE_FONT_FACE_TYPE type;
|
||||||
DWRITE_FONT_METRICS1 metrics;
|
DWRITE_FONT_METRICS1 metrics;
|
||||||
DWRITE_CARET_METRICS caret;
|
DWRITE_CARET_METRICS caret;
|
||||||
|
INT charmap;
|
||||||
|
BOOL is_symbol;
|
||||||
|
|
||||||
struct dwrite_fonttable cmap;
|
struct dwrite_fonttable cmap;
|
||||||
struct dwrite_fonttable vdmx;
|
struct dwrite_fonttable vdmx;
|
||||||
@ -401,8 +403,8 @@ static DWRITE_FONT_SIMULATIONS WINAPI dwritefontface_GetSimulations(IDWriteFontF
|
|||||||
static BOOL WINAPI dwritefontface_IsSymbolFont(IDWriteFontFace2 *iface)
|
static BOOL WINAPI dwritefontface_IsSymbolFont(IDWriteFontFace2 *iface)
|
||||||
{
|
{
|
||||||
struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface);
|
struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface);
|
||||||
FIXME("(%p): stub\n", This);
|
TRACE("(%p)\n", This);
|
||||||
return FALSE;
|
return This->is_symbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void WINAPI dwritefontface_GetMetrics(IDWriteFontFace2 *iface, DWRITE_FONT_METRICS *metrics)
|
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->caret.slopeRun = fontface->caret.slopeRise / 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fontface->charmap = freetype_get_charmap_index(&fontface->IDWriteFontFace2_iface, &fontface->is_symbol);
|
||||||
|
|
||||||
*ret = &fontface->IDWriteFontFace2_iface;
|
*ret = &fontface->IDWriteFontFace2_iface;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include FT_CACHE_H
|
#include FT_CACHE_H
|
||||||
#include FT_FREETYPE_H
|
#include FT_FREETYPE_H
|
||||||
#include FT_OUTLINE_H
|
#include FT_OUTLINE_H
|
||||||
|
#include FT_TRUETYPE_TABLES_H
|
||||||
#endif /* HAVE_FT2BUILD_H */
|
#endif /* HAVE_FT2BUILD_H */
|
||||||
|
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
@ -64,7 +65,9 @@ typedef struct
|
|||||||
|
|
||||||
#define MAKE_FUNCPTR(f) static typeof(f) * p##f = NULL
|
#define MAKE_FUNCPTR(f) static typeof(f) * p##f = NULL
|
||||||
MAKE_FUNCPTR(FT_Done_FreeType);
|
MAKE_FUNCPTR(FT_Done_FreeType);
|
||||||
|
MAKE_FUNCPTR(FT_Get_First_Char);
|
||||||
MAKE_FUNCPTR(FT_Get_Kerning);
|
MAKE_FUNCPTR(FT_Get_Kerning);
|
||||||
|
MAKE_FUNCPTR(FT_Get_Sfnt_Table);
|
||||||
MAKE_FUNCPTR(FT_Glyph_Get_CBox);
|
MAKE_FUNCPTR(FT_Glyph_Get_CBox);
|
||||||
MAKE_FUNCPTR(FT_Init_FreeType);
|
MAKE_FUNCPTR(FT_Init_FreeType);
|
||||||
MAKE_FUNCPTR(FT_Library_Version);
|
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;}
|
#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_Done_FreeType)
|
||||||
|
LOAD_FUNCPTR(FT_Get_First_Char)
|
||||||
LOAD_FUNCPTR(FT_Get_Kerning)
|
LOAD_FUNCPTR(FT_Get_Kerning)
|
||||||
|
LOAD_FUNCPTR(FT_Get_Sfnt_Table)
|
||||||
LOAD_FUNCPTR(FT_Glyph_Get_CBox)
|
LOAD_FUNCPTR(FT_Glyph_Get_CBox)
|
||||||
LOAD_FUNCPTR(FT_Init_FreeType)
|
LOAD_FUNCPTR(FT_Init_FreeType)
|
||||||
LOAD_FUNCPTR(FT_Library_Version)
|
LOAD_FUNCPTR(FT_Library_Version)
|
||||||
@ -554,6 +559,38 @@ void freetype_get_glyph_bitmap(IDWriteFontFace2 *fontface, FLOAT emSize, UINT16
|
|||||||
LeaveCriticalSection(&freetype_cs);
|
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 */
|
#else /* HAVE_FREETYPE */
|
||||||
|
|
||||||
BOOL init_freetype(void)
|
BOOL init_freetype(void)
|
||||||
@ -616,4 +653,10 @@ void freetype_get_glyph_bitmap(IDWriteFontFace2 *fontface, FLOAT emSize, UINT16
|
|||||||
memset(buf, 0, size);
|
memset(buf, 0, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INT freetype_get_charmap_index(IDWriteFontFace2 *fontface, BOOL *is_symbol)
|
||||||
|
{
|
||||||
|
*is_symbol = FALSE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* HAVE_FREETYPE */
|
#endif /* HAVE_FREETYPE */
|
||||||
|
@ -4710,6 +4710,50 @@ static void test_CreateAlphaTexture(void)
|
|||||||
IDWriteFactory_Release(factory);
|
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)
|
START_TEST(font)
|
||||||
{
|
{
|
||||||
IDWriteFactory *factory;
|
IDWriteFactory *factory;
|
||||||
@ -4759,6 +4803,7 @@ START_TEST(font)
|
|||||||
test_GetRecommendedRenderingMode();
|
test_GetRecommendedRenderingMode();
|
||||||
test_GetAlphaBlendParams();
|
test_GetAlphaBlendParams();
|
||||||
test_CreateAlphaTexture();
|
test_CreateAlphaTexture();
|
||||||
|
test_IsSymbolFont();
|
||||||
|
|
||||||
IDWriteFactory_Release(factory);
|
IDWriteFactory_Release(factory);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user