gdi32: Move the GetGlyphIndices() implementation out of freetype.c.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
2d15ea5012
commit
5bdc6e0fe6
|
@ -1103,17 +1103,55 @@ static DWORD CDECL font_GetFontUnicodeRanges( PHYSDEV dev, GLYPHSET *glyphset )
|
|||
static DWORD CDECL font_GetGlyphIndices( PHYSDEV dev, const WCHAR *str, INT count, WORD *gi, DWORD flags )
|
||||
{
|
||||
struct font_physdev *physdev = get_font_dev( dev );
|
||||
DWORD ret;
|
||||
UINT default_char;
|
||||
char ch;
|
||||
BOOL used, got_default = FALSE;
|
||||
int i;
|
||||
|
||||
if (!physdev->font)
|
||||
{
|
||||
dev = GET_NEXT_PHYSDEV( dev, pGetGlyphIndices );
|
||||
return dev->funcs->pGetGlyphIndices( dev, str, count, gi, flags );
|
||||
}
|
||||
|
||||
if (flags & GGI_MARK_NONEXISTING_GLYPHS)
|
||||
{
|
||||
default_char = 0xffff; /* XP would use 0x1f for bitmap fonts */
|
||||
got_default = TRUE;
|
||||
}
|
||||
|
||||
EnterCriticalSection( &font_cs );
|
||||
ret = font_funcs->pGetGlyphIndices( physdev->font, str, count, gi, flags );
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
UINT glyph = str[i];
|
||||
|
||||
if (!font_funcs->get_glyph_index( physdev->font, &glyph ))
|
||||
{
|
||||
glyph = 0;
|
||||
if (physdev->font->codepage == CP_SYMBOL)
|
||||
{
|
||||
if (str[i] >= 0xf020 && str[i] <= 0xf100) glyph = str[i] - 0xf000;
|
||||
else if (str[i] < 0x100) glyph = str[i];
|
||||
}
|
||||
else if (WideCharToMultiByte( physdev->font->codepage, 0, &str[i], 1,
|
||||
&ch, 1, NULL, &used ) && !used)
|
||||
glyph = (unsigned char)ch;
|
||||
}
|
||||
if (!glyph)
|
||||
{
|
||||
if (!got_default)
|
||||
{
|
||||
default_char = font_funcs->get_default_glyph( physdev->font );
|
||||
got_default = TRUE;
|
||||
}
|
||||
glyph = default_char;
|
||||
}
|
||||
gi[i] = glyph;
|
||||
}
|
||||
|
||||
LeaveCriticalSection( &font_cs );
|
||||
return ret;
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -5661,89 +5661,54 @@ static FT_UInt get_glyph_index(const GdiFont *font, UINT glyph)
|
|||
return pFT_Get_Char_Index(font->ft_face, glyph);
|
||||
}
|
||||
|
||||
/* helper for freetype_GetGlyphIndices */
|
||||
static FT_UInt get_gdi_glyph_index(const GdiFont *font, UINT glyph)
|
||||
/*************************************************************
|
||||
* freetype_get_glyph_index
|
||||
*/
|
||||
static BOOL CDECL freetype_get_glyph_index( struct gdi_font *gdi_font, UINT *glyph )
|
||||
{
|
||||
struct gdi_font *gdi_font = font->gdi_font;
|
||||
WCHAR wc = (WCHAR)glyph;
|
||||
BOOL default_used = FALSE;
|
||||
BOOL *default_used_pointer = NULL;
|
||||
FT_UInt ret;
|
||||
char buf;
|
||||
GdiFont *font = get_font_ptr( gdi_font );
|
||||
|
||||
if(font->ft_face->charmap->encoding != FT_ENCODING_NONE)
|
||||
return get_glyph_index(font, glyph);
|
||||
if (font->ft_face->charmap->encoding == FT_ENCODING_NONE) return FALSE;
|
||||
|
||||
if (codepage_sets_default_used(gdi_font->codepage))
|
||||
default_used_pointer = &default_used;
|
||||
if(!WideCharToMultiByte(gdi_font->codepage, 0, &wc, 1, &buf, sizeof(buf), NULL, default_used_pointer)
|
||||
|| default_used)
|
||||
if (font->ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL)
|
||||
{
|
||||
if (gdi_font->codepage == CP_SYMBOL && wc < 0x100)
|
||||
ret = (unsigned char)wc;
|
||||
else
|
||||
ret = 0;
|
||||
}
|
||||
else
|
||||
ret = (unsigned char)buf;
|
||||
TRACE("%04x (%02x) -> ret %d def_used %d\n", glyph, (unsigned char)buf, ret, default_used);
|
||||
return ret;
|
||||
}
|
||||
if (!(*glyph = get_glyph_index_symbol( font, *glyph )))
|
||||
{
|
||||
WCHAR wc = *glyph;
|
||||
char ch;
|
||||
|
||||
static FT_UInt get_default_char_index(GdiFont *font)
|
||||
{
|
||||
FT_UInt default_char;
|
||||
|
||||
if (FT_IS_SFNT(font->ft_face))
|
||||
{
|
||||
TT_OS2 *pOS2 = pFT_Get_Sfnt_Table(font->ft_face, ft_sfnt_os2);
|
||||
default_char = (pOS2->usDefaultChar ? get_glyph_index(font, pOS2->usDefaultChar) : 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
TEXTMETRICW textm;
|
||||
get_text_metrics(font, &textm);
|
||||
default_char = textm.tmDefaultChar;
|
||||
if (WideCharToMultiByte( CP_ACP, 0, &wc, 1, &ch, 1, NULL, NULL ))
|
||||
*glyph = get_glyph_index_symbol( font, (unsigned char)ch );
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return default_char;
|
||||
if ((*glyph = pFT_Get_Char_Index( font->ft_face, *glyph )))
|
||||
*glyph = get_GSUB_vert_glyph( font, *glyph );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* freetype_GetGlyphIndices
|
||||
* freetype_get_default_glyph
|
||||
*/
|
||||
static DWORD CDECL freetype_GetGlyphIndices( struct gdi_font *gdi_font, LPCWSTR lpstr,
|
||||
INT count, LPWORD pgi, DWORD flags )
|
||||
static UINT CDECL freetype_get_default_glyph( struct gdi_font *gdi_font )
|
||||
{
|
||||
GdiFont *font = get_font_ptr(gdi_font);
|
||||
int i;
|
||||
WORD default_char;
|
||||
BOOL got_default = FALSE;
|
||||
GdiFont *font = get_font_ptr( gdi_font );
|
||||
FT_WinFNT_HeaderRec winfnt;
|
||||
TT_OS2 *pOS2;
|
||||
|
||||
if (flags & GGI_MARK_NONEXISTING_GLYPHS)
|
||||
if ((pOS2 = pFT_Get_Sfnt_Table( font->ft_face, ft_sfnt_os2 )))
|
||||
{
|
||||
default_char = 0xffff; /* XP would use 0x1f for bitmap fonts */
|
||||
got_default = TRUE;
|
||||
UINT glyph = pOS2->usDefaultChar;
|
||||
freetype_get_glyph_index( gdi_font, &glyph );
|
||||
return glyph;
|
||||
}
|
||||
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
pgi[i] = get_gdi_glyph_index(font, lpstr[i]);
|
||||
if (pgi[i] == 0)
|
||||
{
|
||||
if (!got_default)
|
||||
{
|
||||
default_char = get_default_char_index(font);
|
||||
got_default = TRUE;
|
||||
}
|
||||
pgi[i] = default_char;
|
||||
}
|
||||
else
|
||||
pgi[i] = get_GSUB_vert_glyph(font, pgi[i]);
|
||||
}
|
||||
return count;
|
||||
if (!pFT_Get_WinFNT_Header( font->ft_face, &winfnt )) return winfnt.default_char + winfnt.first_char;
|
||||
return 32;
|
||||
}
|
||||
|
||||
|
||||
static inline BOOL is_identity_FMAT2(const FMAT2 *matrix)
|
||||
{
|
||||
static const FMAT2 identity = { 1.0, 0.0, 0.0, 1.0 };
|
||||
|
@ -7838,7 +7803,6 @@ static const struct font_backend_funcs font_funcs =
|
|||
freetype_FontIsLinked,
|
||||
freetype_GetCharWidthInfo,
|
||||
freetype_GetFontUnicodeRanges,
|
||||
freetype_GetGlyphIndices,
|
||||
freetype_GetKerningPairs,
|
||||
freetype_GetOutlineTextMetrics,
|
||||
freetype_GetTextMetrics,
|
||||
|
@ -7849,6 +7813,8 @@ static const struct font_backend_funcs font_funcs =
|
|||
freetype_CreateScalableFontResource,
|
||||
freetype_alloc_font,
|
||||
freetype_get_font_data,
|
||||
freetype_get_glyph_index,
|
||||
freetype_get_default_glyph,
|
||||
freetype_get_glyph_outline,
|
||||
freetype_destroy_font
|
||||
};
|
||||
|
|
|
@ -356,7 +356,6 @@ struct font_backend_funcs
|
|||
BOOL (CDECL *pFontIsLinked)( struct gdi_font *font );
|
||||
BOOL (CDECL *pGetCharWidthInfo)( struct gdi_font *font, struct char_width_info *info );
|
||||
DWORD (CDECL *pGetFontUnicodeRanges)( struct gdi_font *font, GLYPHSET *glyphset );
|
||||
DWORD (CDECL *pGetGlyphIndices)( struct gdi_font *font, const WCHAR *str, INT count, WORD *gi, DWORD flags );
|
||||
DWORD (CDECL *pGetKerningPairs)( struct gdi_font *font, DWORD count, KERNINGPAIR *pairs );
|
||||
UINT (CDECL *pGetOutlineTextMetrics)( struct gdi_font *font, UINT size, OUTLINETEXTMETRICW *metrics );
|
||||
BOOL (CDECL *pGetTextMetrics)( struct gdi_font *font, TEXTMETRICW *metrics );
|
||||
|
@ -371,6 +370,8 @@ struct font_backend_funcs
|
|||
BOOL (CDECL *alloc_font)( struct gdi_font *font );
|
||||
DWORD (CDECL *get_font_data)( struct gdi_font *gdi_font, DWORD table, DWORD offset,
|
||||
void *buf, DWORD count );
|
||||
BOOL (CDECL *get_glyph_index)( struct gdi_font *gdi_font, UINT *glyph );
|
||||
UINT (CDECL *get_default_glyph)( struct gdi_font *gdi_font );
|
||||
DWORD (CDECL *get_glyph_outline)( struct gdi_font *font, UINT glyph, UINT format,
|
||||
GLYPHMETRICS *gm, ABC *abc, DWORD buflen, void *buf, const MAT2 *mat );
|
||||
void (CDECL *destroy_font)( struct gdi_font *font );
|
||||
|
|
Loading…
Reference in New Issue