gdi32: Copy TranslateCharsetInfo to text.c.
And use a separated copy in ntgdi functions. Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Huw Davies <huw@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
7da78fd269
commit
00359ebfa0
|
@ -196,11 +196,8 @@ typedef struct
|
||||||
LOGFONTW logfont;
|
LOGFONTW logfont;
|
||||||
} FONTOBJ;
|
} FONTOBJ;
|
||||||
|
|
||||||
/*
|
/* for translate_charset_info */
|
||||||
* For TranslateCharsetInfo
|
static const CHARSETINFO charset_info[] = {
|
||||||
*/
|
|
||||||
#define MAXTCIINDEX 32
|
|
||||||
static const CHARSETINFO FONT_tci[MAXTCIINDEX] = {
|
|
||||||
/* ANSI */
|
/* ANSI */
|
||||||
{ ANSI_CHARSET, 1252, {{0,0,0,0},{FS_LATIN1,0}} },
|
{ ANSI_CHARSET, 1252, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
{ EASTEUROPE_CHARSET, 1250, {{0,0,0,0},{FS_LATIN2,0}} },
|
{ EASTEUROPE_CHARSET, 1250, {{0,0,0,0},{FS_LATIN2,0}} },
|
||||||
|
@ -1432,6 +1429,34 @@ static void load_system_links(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* see TranslateCharsetInfo */
|
||||||
|
BOOL translate_charset_info( DWORD *src, CHARSETINFO *cs, DWORD flags )
|
||||||
|
{
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
switch (flags)
|
||||||
|
{
|
||||||
|
case TCI_SRCFONTSIG:
|
||||||
|
while (index < ARRAY_SIZE(charset_info) && !(*src>>index & 0x0001)) index++;
|
||||||
|
break;
|
||||||
|
case TCI_SRCCODEPAGE:
|
||||||
|
while (index < ARRAY_SIZE(charset_info) && PtrToUlong(src) != charset_info[index].ciACP)
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
case TCI_SRCCHARSET:
|
||||||
|
while (index < ARRAY_SIZE(charset_info) &&
|
||||||
|
PtrToUlong(src) != charset_info[index].ciCharset)
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index >= ARRAY_SIZE(charset_info) || charset_info[index].ciCharset == DEFAULT_CHARSET) return FALSE;
|
||||||
|
*cs = charset_info[index];
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* font matching */
|
/* font matching */
|
||||||
|
|
||||||
static BOOL can_select_face( const struct gdi_font_face *face, FONTSIGNATURE fs, BOOL can_use_bitmap )
|
static BOOL can_select_face( const struct gdi_font_face *face, FONTSIGNATURE fs, BOOL can_use_bitmap )
|
||||||
|
@ -1562,7 +1587,7 @@ static struct gdi_font_face *find_matching_face( const LOGFONTW *lf, CHARSETINFO
|
||||||
BOOL want_vertical = (lf->lfFaceName[0] == '@');
|
BOOL want_vertical = (lf->lfFaceName[0] == '@');
|
||||||
struct gdi_font_face *face;
|
struct gdi_font_face *face;
|
||||||
|
|
||||||
if (!TranslateCharsetInfo( (DWORD *)(INT_PTR)lf->lfCharSet, csi, TCI_SRCCHARSET ))
|
if (!translate_charset_info( (DWORD *)(INT_PTR)lf->lfCharSet, csi, TCI_SRCCHARSET ))
|
||||||
{
|
{
|
||||||
if (lf->lfCharSet != DEFAULT_CHARSET) FIXME( "Untranslated charset %d\n", lf->lfCharSet );
|
if (lf->lfCharSet != DEFAULT_CHARSET) FIXME( "Untranslated charset %d\n", lf->lfCharSet );
|
||||||
csi->fs.fsCsb[0] = 0;
|
csi->fs.fsCsb[0] = 0;
|
||||||
|
@ -1578,7 +1603,7 @@ static struct gdi_font_face *find_matching_face( const LOGFONTW *lf, CHARSETINFO
|
||||||
TRACE( "substituting %s,%d -> %s,%d\n", debugstr_w(lf->lfFaceName), lf->lfCharSet,
|
TRACE( "substituting %s,%d -> %s,%d\n", debugstr_w(lf->lfFaceName), lf->lfCharSet,
|
||||||
debugstr_w(subst), (subst_charset != -1) ? subst_charset : lf->lfCharSet );
|
debugstr_w(subst), (subst_charset != -1) ? subst_charset : lf->lfCharSet );
|
||||||
if (subst_charset != -1)
|
if (subst_charset != -1)
|
||||||
TranslateCharsetInfo( (DWORD *)(INT_PTR)subst_charset, csi, TCI_SRCCHARSET );
|
translate_charset_info( (DWORD *)(INT_PTR)subst_charset, csi, TCI_SRCCHARSET );
|
||||||
*orig_name = lf->lfFaceName;
|
*orig_name = lf->lfFaceName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1592,7 +1617,7 @@ static struct gdi_font_face *find_matching_face( const LOGFONTW *lf, CHARSETINFO
|
||||||
if (!csi->fs.fsCsb[0])
|
if (!csi->fs.fsCsb[0])
|
||||||
{
|
{
|
||||||
INT acp = GetACP();
|
INT acp = GetACP();
|
||||||
if (!TranslateCharsetInfo( (DWORD *)(INT_PTR)acp, csi, TCI_SRCCODEPAGE ))
|
if (!translate_charset_info( (DWORD *)(INT_PTR)acp, csi, TCI_SRCCODEPAGE ))
|
||||||
{
|
{
|
||||||
FIXME( "TCI failed on codepage %d\n", acp );
|
FIXME( "TCI failed on codepage %d\n", acp );
|
||||||
csi->fs.fsCsb[0] = 0;
|
csi->fs.fsCsb[0] = 0;
|
||||||
|
@ -2609,7 +2634,7 @@ static DWORD create_enum_charset_list(DWORD charset, struct enum_charset *list)
|
||||||
CHARSETINFO csi;
|
CHARSETINFO csi;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (TranslateCharsetInfo( ULongToPtr(charset), &csi, TCI_SRCCHARSET ) && csi.fs.fsCsb[0] != 0)
|
if (translate_charset_info( ULongToPtr(charset), &csi, TCI_SRCCHARSET ) && csi.fs.fsCsb[0] != 0)
|
||||||
{
|
{
|
||||||
list->mask = csi.fs.fsCsb[0];
|
list->mask = csi.fs.fsCsb[0];
|
||||||
list->charset = csi.ciCharset;
|
list->charset = csi.ciCharset;
|
||||||
|
@ -2623,7 +2648,7 @@ static DWORD create_enum_charset_list(DWORD charset, struct enum_charset *list)
|
||||||
|
|
||||||
/* Set the current codepage's charset as the first element. */
|
/* Set the current codepage's charset as the first element. */
|
||||||
if (!is_complex_script_ansi_cp(acp) &&
|
if (!is_complex_script_ansi_cp(acp) &&
|
||||||
TranslateCharsetInfo( (DWORD *)(INT_PTR)acp, &csi, TCI_SRCCODEPAGE ) &&
|
translate_charset_info( (DWORD *)(INT_PTR)acp, &csi, TCI_SRCCODEPAGE ) &&
|
||||||
csi.fs.fsCsb[0] != 0)
|
csi.fs.fsCsb[0] != 0)
|
||||||
{
|
{
|
||||||
list->mask = csi.fs.fsCsb[0];
|
list->mask = csi.fs.fsCsb[0];
|
||||||
|
@ -2640,7 +2665,7 @@ static DWORD create_enum_charset_list(DWORD charset, struct enum_charset *list)
|
||||||
fs.fsCsb[0] = 1u << i;
|
fs.fsCsb[0] = 1u << i;
|
||||||
fs.fsCsb[1] = 0;
|
fs.fsCsb[1] = 0;
|
||||||
if (fs.fsCsb[0] & mask) continue; /* skip, already added. */
|
if (fs.fsCsb[0] & mask) continue; /* skip, already added. */
|
||||||
if (!TranslateCharsetInfo( fs.fsCsb, &csi, TCI_SRCFONTSIG ))
|
if (!translate_charset_info( fs.fsCsb, &csi, TCI_SRCFONTSIG ))
|
||||||
continue; /* skip, this is an invalid fsCsb bit. */
|
continue; /* skip, this is an invalid fsCsb bit. */
|
||||||
list->mask = fs.fsCsb[0];
|
list->mask = fs.fsCsb[0];
|
||||||
list->charset = csi.ciCharset;
|
list->charset = csi.ciCharset;
|
||||||
|
@ -3605,7 +3630,7 @@ static void get_nearest_charset( const WCHAR *family_name, struct gdi_font_face
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (TranslateCharsetInfo( (DWORD*)(INT_PTR)GetACP(), csi, TCI_SRCCODEPAGE ))
|
if (translate_charset_info( (DWORD*)(INT_PTR)GetACP(), csi, TCI_SRCCODEPAGE ))
|
||||||
{
|
{
|
||||||
const struct gdi_font_link *font_link;
|
const struct gdi_font_link *font_link;
|
||||||
|
|
||||||
|
@ -3618,7 +3643,7 @@ static void get_nearest_charset( const WCHAR *family_name, struct gdi_font_face
|
||||||
DWORD fs0 = 1u << i;
|
DWORD fs0 = 1u << i;
|
||||||
if (face->fs.fsCsb[0] & fs0)
|
if (face->fs.fsCsb[0] & fs0)
|
||||||
{
|
{
|
||||||
if (TranslateCharsetInfo(&fs0, csi, TCI_SRCFONTSIG)) return;
|
if (translate_charset_info(&fs0, csi, TCI_SRCFONTSIG)) return;
|
||||||
FIXME("TCI failing on %x\n", fs0);
|
FIXME("TCI failing on %x\n", fs0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4200,7 +4225,7 @@ static void update_font_code_page( DC *dc, HANDLE font )
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hmm, nicely designed api this one! */
|
/* Hmm, nicely designed api this one! */
|
||||||
if (TranslateCharsetInfo( ULongToPtr(charset), &csi, TCI_SRCCHARSET) )
|
if (translate_charset_info( ULongToPtr(charset), &csi, TCI_SRCCHARSET) )
|
||||||
dc->attr->font_code_page = csi.ciACP;
|
dc->attr->font_code_page = csi.ciACP;
|
||||||
else {
|
else {
|
||||||
switch(charset) {
|
switch(charset) {
|
||||||
|
@ -5733,49 +5758,6 @@ DWORD WINAPI NtGdiGetKerningPairsW( HDC hdc, DWORD count, KERNINGPAIR *kern_pair
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* TranslateCharsetInfo [GDI32.@]
|
|
||||||
*
|
|
||||||
* Fills a CHARSETINFO structure for a character set, code page, or
|
|
||||||
* font. This allows making the correspondence between different labels
|
|
||||||
* (character set, Windows, ANSI, and OEM codepages, and Unicode ranges)
|
|
||||||
* of the same encoding.
|
|
||||||
*
|
|
||||||
* Only one codepage will be set in lpCs->fs. If TCI_SRCFONTSIG is used,
|
|
||||||
* only one codepage should be set in *lpSrc.
|
|
||||||
*
|
|
||||||
* RETURNS
|
|
||||||
* TRUE on success, FALSE on failure.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
BOOL WINAPI TranslateCharsetInfo(
|
|
||||||
LPDWORD lpSrc, /* [in]
|
|
||||||
if flags == TCI_SRCFONTSIG: pointer to fsCsb of a FONTSIGNATURE
|
|
||||||
if flags == TCI_SRCCHARSET: a character set value
|
|
||||||
if flags == TCI_SRCCODEPAGE: a code page value
|
|
||||||
*/
|
|
||||||
LPCHARSETINFO lpCs, /* [out] structure to receive charset information */
|
|
||||||
DWORD flags /* [in] determines interpretation of lpSrc */)
|
|
||||||
{
|
|
||||||
int index = 0;
|
|
||||||
switch (flags) {
|
|
||||||
case TCI_SRCFONTSIG:
|
|
||||||
while (index < MAXTCIINDEX && !(*lpSrc>>index & 0x0001)) index++;
|
|
||||||
break;
|
|
||||||
case TCI_SRCCODEPAGE:
|
|
||||||
while (index < MAXTCIINDEX && PtrToUlong(lpSrc) != FONT_tci[index].ciACP) index++;
|
|
||||||
break;
|
|
||||||
case TCI_SRCCHARSET:
|
|
||||||
while (index < MAXTCIINDEX && PtrToUlong(lpSrc) != FONT_tci[index].ciCharset) index++;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (index >= MAXTCIINDEX || FONT_tci[index].ciCharset == DEFAULT_CHARSET) return FALSE;
|
|
||||||
*lpCs = FONT_tci[index];
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* NtGdiGetFontData (win32u.@)
|
* NtGdiGetFontData (win32u.@)
|
||||||
*
|
*
|
||||||
|
|
|
@ -452,7 +452,7 @@ static UINT get_default_charset( void )
|
||||||
|
|
||||||
uACP = GetACP();
|
uACP = GetACP();
|
||||||
csi.ciCharset = ANSI_CHARSET;
|
csi.ciCharset = ANSI_CHARSET;
|
||||||
if ( !TranslateCharsetInfo( ULongToPtr(uACP), &csi, TCI_SRCCODEPAGE ) )
|
if ( !translate_charset_info( ULongToPtr(uACP), &csi, TCI_SRCCODEPAGE ) )
|
||||||
{
|
{
|
||||||
FIXME( "unhandled codepage %u - use ANSI_CHARSET for default stock objects\n", uACP );
|
FIXME( "unhandled codepage %u - use ANSI_CHARSET for default stock objects\n", uACP );
|
||||||
return ANSI_CHARSET;
|
return ANSI_CHARSET;
|
||||||
|
|
|
@ -388,6 +388,7 @@ extern BOOL opentype_enum_full_names( const struct tt_name_v0 *tt_name_v0,
|
||||||
|
|
||||||
extern BOOL opentype_get_properties( const void *data, size_t size, const struct ttc_sfnt_v1 *ttc_sfnt_v1,
|
extern BOOL opentype_get_properties( const void *data, size_t size, const struct ttc_sfnt_v1 *ttc_sfnt_v1,
|
||||||
DWORD *version, FONTSIGNATURE *fs, DWORD *ntm_flags ) DECLSPEC_HIDDEN;
|
DWORD *version, FONTSIGNATURE *fs, DWORD *ntm_flags ) DECLSPEC_HIDDEN;
|
||||||
|
extern BOOL translate_charset_info( DWORD *src, CHARSETINFO *cs, DWORD flags ) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
/* gdiobj.c */
|
/* gdiobj.c */
|
||||||
extern HGDIOBJ alloc_gdi_handle( struct gdi_obj_header *obj, WORD type,
|
extern HGDIOBJ alloc_gdi_handle( struct gdi_obj_header *obj, WORD type,
|
||||||
|
|
|
@ -2307,3 +2307,85 @@ HANDLE WINAPI AddFontMemResourceEx( void *ptr, DWORD size, void *dv, DWORD *coun
|
||||||
{
|
{
|
||||||
return NtGdiAddFontMemResourceEx( ptr, size, dv, 0, count );
|
return NtGdiAddFontMemResourceEx( ptr, size, dv, 0, count );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const CHARSETINFO charset_info[] = {
|
||||||
|
/* ANSI */
|
||||||
|
{ ANSI_CHARSET, 1252, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ EASTEUROPE_CHARSET, 1250, {{0,0,0,0},{FS_LATIN2,0}} },
|
||||||
|
{ RUSSIAN_CHARSET, 1251, {{0,0,0,0},{FS_CYRILLIC,0}} },
|
||||||
|
{ GREEK_CHARSET, 1253, {{0,0,0,0},{FS_GREEK,0}} },
|
||||||
|
{ TURKISH_CHARSET, 1254, {{0,0,0,0},{FS_TURKISH,0}} },
|
||||||
|
{ HEBREW_CHARSET, 1255, {{0,0,0,0},{FS_HEBREW,0}} },
|
||||||
|
{ ARABIC_CHARSET, 1256, {{0,0,0,0},{FS_ARABIC,0}} },
|
||||||
|
{ BALTIC_CHARSET, 1257, {{0,0,0,0},{FS_BALTIC,0}} },
|
||||||
|
{ VIETNAMESE_CHARSET, 1258, {{0,0,0,0},{FS_VIETNAMESE,0}} },
|
||||||
|
/* reserved by ANSI */
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
/* ANSI and OEM */
|
||||||
|
{ THAI_CHARSET, 874, {{0,0,0,0},{FS_THAI,0}} },
|
||||||
|
{ SHIFTJIS_CHARSET, 932, {{0,0,0,0},{FS_JISJAPAN,0}} },
|
||||||
|
{ GB2312_CHARSET, 936, {{0,0,0,0},{FS_CHINESESIMP,0}} },
|
||||||
|
{ HANGEUL_CHARSET, 949, {{0,0,0,0},{FS_WANSUNG,0}} },
|
||||||
|
{ CHINESEBIG5_CHARSET, 950, {{0,0,0,0},{FS_CHINESETRAD,0}} },
|
||||||
|
{ JOHAB_CHARSET, 1361, {{0,0,0,0},{FS_JOHAB,0}} },
|
||||||
|
/* reserved for alternate ANSI and OEM */
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
/* reserved for system */
|
||||||
|
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
|
||||||
|
{ SYMBOL_CHARSET, CP_SYMBOL, {{0,0,0,0},{FS_SYMBOL,0}} }
|
||||||
|
};
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* TranslateCharsetInfo (GDI32.@)
|
||||||
|
*
|
||||||
|
* Fills a CHARSETINFO structure for a character set, code page, or
|
||||||
|
* font. This allows making the correspondence between different labels
|
||||||
|
* (character set, Windows, ANSI, and OEM codepages, and Unicode ranges)
|
||||||
|
* of the same encoding.
|
||||||
|
*
|
||||||
|
* Only one codepage will be set in cs->fs. If TCI_SRCFONTSIG is used,
|
||||||
|
* only one codepage should be set in *src.
|
||||||
|
*
|
||||||
|
* if flags == TCI_SRCFONTSIG: src is a pointer to fsCsb of a FONTSIGNATURE
|
||||||
|
* if flags == TCI_SRCCHARSET: src is a character set value
|
||||||
|
* if flags == TCI_SRCCODEPAGE: src is a code page value
|
||||||
|
*/
|
||||||
|
BOOL WINAPI TranslateCharsetInfo( DWORD *src, CHARSETINFO *cs, DWORD flags )
|
||||||
|
{
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
switch (flags)
|
||||||
|
{
|
||||||
|
case TCI_SRCFONTSIG:
|
||||||
|
while (index < ARRAY_SIZE(charset_info) && !(*src>>index & 0x0001)) index++;
|
||||||
|
break;
|
||||||
|
case TCI_SRCCODEPAGE:
|
||||||
|
while (index < ARRAY_SIZE(charset_info) && PtrToUlong(src) != charset_info[index].ciACP)
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
case TCI_SRCCHARSET:
|
||||||
|
while (index < ARRAY_SIZE(charset_info) &&
|
||||||
|
PtrToUlong(src) != charset_info[index].ciCharset)
|
||||||
|
index++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index >= ARRAY_SIZE(charset_info) || charset_info[index].ciCharset == DEFAULT_CHARSET) return FALSE;
|
||||||
|
*cs = charset_info[index];
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue