Commit 5bdc6e0f authored by Alexandre Julliard's avatar Alexandre Julliard

gdi32: Move the GetGlyphIndices() implementation out of freetype.c.

parent 2d15ea50
......@@ -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;
}
static FT_UInt get_default_char_index(GdiFont *font)
{
FT_UInt default_char;
if (!(*glyph = get_glyph_index_symbol( font, *glyph )))
{
WCHAR wc = *glyph;
char ch;
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;
if (flags & GGI_MARK_NONEXISTING_GLYPHS)
{
default_char = 0xffff; /* XP would use 0x1f for bitmap fonts */
got_default = TRUE;
}
GdiFont *font = get_font_ptr( gdi_font );
FT_WinFNT_HeaderRec winfnt;
TT_OS2 *pOS2;
for(i = 0; i < count; i++)
if ((pOS2 = pFT_Get_Sfnt_Table( font->ft_face, ft_sfnt_os2 )))
{
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]);
UINT glyph = pOS2->usDefaultChar;
freetype_get_glyph_index( gdi_font, &glyph );
return glyph;
}
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 );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment