Added support for cp936.

This commit is contained in:
Hidenori Takeshima 2000-10-12 23:05:21 +00:00 committed by Alexandre Julliard
parent 3f2b2d5ef4
commit beca6ada2a

View File

@ -19,7 +19,7 @@
DEFAULT_DEBUG_CHANNEL(text); DEFAULT_DEBUG_CHANNEL(text);
/*********************************************************************** /***********************************************************************
* IsLegalDBCSChar for cp932/936/949/950 * IsLegalDBCSChar for cp932/936/949/950/euc
*/ */
static inline static inline
int IsLegalDBCSChar_cp932( BYTE lead, BYTE trail ) int IsLegalDBCSChar_cp932( BYTE lead, BYTE trail )
@ -44,13 +44,6 @@ int IsLegalDBCSChar_cp949( BYTE lead, BYTE trail )
( trail >= (BYTE)0x41 && trail <= (BYTE)0xfe ) ); ( trail >= (BYTE)0x41 && trail <= (BYTE)0xfe ) );
} }
static inline
int IsLegalDBCSChar_euckr( BYTE lead, BYTE trail )
{
return ( ( lead >= (BYTE)0xa1 && lead <= (BYTE)0xfe ) &&
( trail >= (BYTE)0xa1 && trail <= (BYTE)0xfe ) );
}
static inline static inline
int IsLegalDBCSChar_cp950( BYTE lead, BYTE trail ) int IsLegalDBCSChar_cp950( BYTE lead, BYTE trail )
{ {
@ -59,8 +52,16 @@ int IsLegalDBCSChar_cp950( BYTE lead, BYTE trail )
( trail >= (BYTE)0xa1 && trail <= (BYTE)0xfe ) ) ); ( trail >= (BYTE)0xa1 && trail <= (BYTE)0xfe ) ) );
} }
static inline
int IsLegalDBCSChar_euc( BYTE lead, BYTE trail )
{
return ( ( lead >= (BYTE)0xa1 && lead <= (BYTE)0xfe ) &&
( trail >= (BYTE)0xa1 && trail <= (BYTE)0xfe ) );
}
/*********************************************************************** /***********************************************************************
* DBCSCharToXChar2b for cp932/949 * DBCSCharToXChar2b for cp932/euc
*/ */
static inline static inline
@ -93,7 +94,7 @@ void DBCSCharToXChar2b_cp932( XChar2b* pch, BYTE lead, BYTE trail )
} }
static inline static inline
void DBCSCharToXChar2b_euckr( XChar2b* pch, BYTE lead, BYTE trail ) void DBCSCharToXChar2b_euc( XChar2b* pch, BYTE lead, BYTE trail )
{ {
pch->byte1 = lead & (BYTE)0x7f; pch->byte1 = lead & (BYTE)0x7f;
pch->byte2 = trail & (BYTE)0x7f; pch->byte2 = trail & (BYTE)0x7f;
@ -120,7 +121,11 @@ static WORD X11DRV_enum_subfont_charset_cp932( UINT index )
static WORD X11DRV_enum_subfont_charset_cp936( UINT index ) static WORD X11DRV_enum_subfont_charset_cp936( UINT index )
{ {
FIXME( "please implement X11DRV_enum_subfont_charset_cp936!\n" ); switch ( index )
{
case 0: return ANSI_CHARSET;
}
return DEFAULT_CHARSET; return DEFAULT_CHARSET;
} }
@ -235,8 +240,50 @@ static XChar2b* X11DRV_unicode_to_char2b_cp932( fontObject* pfo,
static XChar2b* X11DRV_unicode_to_char2b_cp936( fontObject* pfo, static XChar2b* X11DRV_unicode_to_char2b_cp936( fontObject* pfo,
LPCWSTR lpwstr, UINT count ) LPCWSTR lpwstr, UINT count )
{ {
FIXME( "please implement X11DRV_unicode_to_char2b_cp936!\n" ); XChar2b *str2b;
XChar2b *str2b_dst;
BYTE *str;
BYTE *str_src;
UINT i;
char ch = pfo->fs->default_char;
if (!(str2b = HeapAlloc( GetProcessHeap(), 0, count * sizeof(XChar2b) )))
return NULL; return NULL;
if (!(str = HeapAlloc( GetProcessHeap(), 0, count*2 )))
{
HeapFree( GetProcessHeap(), 0, str2b );
return NULL;
}
WideCharToMultiByte( 936, 0, lpwstr, count, str, count*2, &ch, NULL );
str_src = str;
str2b_dst = str2b;
for (i = 0; i < count; i++, str_src++, str2b_dst++)
{
if ( IsLegalDBCSChar_cp936( *str_src, *(str_src+1) ) )
{
if ( IsLegalDBCSChar_euc( *str_src, *(str_src+1) ) )
{
DBCSCharToXChar2b_euc( str2b_dst, *str_src, *(str_src+1) );
}
else
{
/* FIXME */
str2b_dst->byte1 = 0;
str2b_dst->byte2 = 0;
}
str_src++;
}
else
{
str2b_dst->byte1 = 0;
str2b_dst->byte2 = *str_src;
}
}
HeapFree( GetProcessHeap(), 0, str );
return str2b;
} }
static XChar2b* X11DRV_unicode_to_char2b_cp949( fontObject* pfo, static XChar2b* X11DRV_unicode_to_char2b_cp949( fontObject* pfo,
@ -264,9 +311,9 @@ static XChar2b* X11DRV_unicode_to_char2b_cp949( fontObject* pfo,
{ {
if ( IsLegalDBCSChar_cp949( *str_src, *(str_src+1) ) ) if ( IsLegalDBCSChar_cp949( *str_src, *(str_src+1) ) )
{ {
if ( IsLegalDBCSChar_euckr( *str_src, *(str_src+1) ) ) if ( IsLegalDBCSChar_euc( *str_src, *(str_src+1) ) )
{ {
DBCSCharToXChar2b_euckr( str2b_dst, *str_src, *(str_src+1) ); DBCSCharToXChar2b_euc( str2b_dst, *str_src, *(str_src+1) );
} }
else else
{ {
@ -608,10 +655,10 @@ const X11DRV_CP X11DRV_cptable[X11DRV_CPTABLE_COUNT] =
{ /* CP936 */ { /* CP936 */
X11DRV_enum_subfont_charset_cp936, X11DRV_enum_subfont_charset_cp936,
X11DRV_unicode_to_char2b_cp936, X11DRV_unicode_to_char2b_cp936,
X11DRV_DrawString_normal, /* FIXME */ X11DRV_DrawString_dbcs,
X11DRV_TextWidth_normal, /* FIXME */ X11DRV_TextWidth_dbcs_2fonts,
X11DRV_DrawText_normal, /* FIXME */ X11DRV_DrawText_dbcs_2fonts,
X11DRV_TextExtents_normal, /* FIXME */ X11DRV_TextExtents_dbcs_2fonts,
X11DRV_GetTextMetricsA_normal, /* FIXME */ X11DRV_GetTextMetricsA_normal, /* FIXME */
}, },
{ /* CP949 */ { /* CP949 */