mirror of
https://gitlab.winehq.org/wine/wine.git
synced 2024-11-19 17:06:04 -07:00
Merge branch 'master4' into 'master'
gdi32: Fix the text's charset error in obtaining from meta dc. See merge request wine/wine!6385
This commit is contained in:
commit
e9413db424
3 changed files with 83 additions and 0 deletions
|
@ -94,6 +94,7 @@ BOOL METADC_ExtTextOut( HDC hdc, INT x, INT y, UINT flags, const RECT *rect,
|
|||
BOOL METADC_FillRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush );
|
||||
BOOL METADC_FrameRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush, INT x, INT y );
|
||||
INT METADC_GetDeviceCaps( HDC hdc, INT cap );
|
||||
UINT METADC_GetTextCharset( HDC hdc );
|
||||
BOOL METADC_IntersectClipRect( HDC hdc, INT left, INT top, INT right, INT bottom );
|
||||
BOOL METADC_InvertRgn( HDC hdc, HRGN hrgn );
|
||||
BOOL METADC_LineTo( HDC hdc, INT x, INT y );
|
||||
|
|
|
@ -1269,6 +1269,43 @@ BOOL METADC_ExtEscape( HDC hdc, INT escape, INT input_size, const void *input,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static inline WCHAR facename_tolower( WCHAR c )
|
||||
{
|
||||
if (c >= 'A' && c <= 'Z') return c - 'A' + 'a';
|
||||
else if (c > 127) return RtlDowncaseUnicodeChar( c );
|
||||
else return c;
|
||||
}
|
||||
|
||||
static inline int facename_compare( const WCHAR *str1, const WCHAR *str2, SIZE_T len )
|
||||
{
|
||||
while (len--)
|
||||
{
|
||||
WCHAR c1 = facename_tolower( *str1++ ), c2 = facename_tolower( *str2++ );
|
||||
if (c1 != c2) return c1 - c2;
|
||||
else if (!c1) return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
UINT METADC_GetTextCharset( HDC hdc )
|
||||
{
|
||||
UINT ret = DEFAULT_CHARSET;
|
||||
struct metadc *metadc;
|
||||
static const WCHAR symbolW[] = {'S','y','m','b','o','l',0};
|
||||
|
||||
if(!(metadc = get_metadc_ptr( hdc ))) return ret;
|
||||
if(metadc->font)
|
||||
{
|
||||
LOGFONTW lf;
|
||||
NtGdiExtGetObjectW( metadc->font, sizeof(lf), &lf );
|
||||
if (!facename_compare( lf.lfFaceName, symbolW, -1 ))
|
||||
lf.lfCharSet = SYMBOL_CHARSET;
|
||||
return lf.lfCharSet;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
INT METADC_GetDeviceCaps( HDC hdc, INT cap )
|
||||
{
|
||||
if (!get_metadc_ptr( hdc )) return 0;
|
||||
|
|
|
@ -830,7 +830,51 @@ static void logfontex_WtoA( const ENUMLOGFONTEXW *fontW, LPENUMLOGFONTEXA fontA
|
|||
*/
|
||||
DWORD WINAPI GdiGetCodePage( HDC hdc )
|
||||
{
|
||||
CHARSETINFO csi;
|
||||
DC_ATTR *dc_attr = get_dc_attr( hdc );
|
||||
|
||||
if(is_meta_dc(hdc))
|
||||
{
|
||||
UINT charset = METADC_GetTextCharset(hdc);
|
||||
UINT cp = CP_ACP;
|
||||
if (TranslateCharsetInfo( ULongToPtr(charset), &csi, TCI_SRCCHARSET ))
|
||||
cp = csi.ciACP;
|
||||
else
|
||||
{
|
||||
switch(charset)
|
||||
{
|
||||
case OEM_CHARSET:
|
||||
cp = GetOEMCP();
|
||||
break;
|
||||
case DEFAULT_CHARSET:
|
||||
cp = GetACP();
|
||||
break;
|
||||
|
||||
case VISCII_CHARSET:
|
||||
case TCVN_CHARSET:
|
||||
case KOI8_CHARSET:
|
||||
case ISO3_CHARSET:
|
||||
case ISO4_CHARSET:
|
||||
case ISO10_CHARSET:
|
||||
case CELTIC_CHARSET:
|
||||
/* FIXME: These have no place here, but because x11drv
|
||||
enumerates fonts with these (made up) charsets some apps
|
||||
might use them and then the FIXME below would become
|
||||
annoying. Now we could pick the intended codepage for
|
||||
each of these, but since it's broken anyway we'll just
|
||||
use CP_ACP and hope it'll go away...
|
||||
*/
|
||||
cp = CP_ACP;
|
||||
break;
|
||||
|
||||
default:
|
||||
FIXME("Can't find codepage for charset %d\n", charset);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return cp;
|
||||
}
|
||||
|
||||
return dc_attr ? dc_attr->font_code_page : CP_ACP;
|
||||
}
|
||||
|
||||
|
@ -2086,6 +2130,7 @@ BOOL WINAPI GetAspectRatioFilterEx( HDC hdc, SIZE *aspect_ratio )
|
|||
*/
|
||||
UINT WINAPI GetTextCharset( HDC hdc )
|
||||
{
|
||||
if(is_meta_dc(hdc)) return METADC_GetTextCharset(hdc);
|
||||
/* MSDN docs say this is equivalent */
|
||||
return NtGdiGetTextCharsetInfo( hdc, NULL, 0 );
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue