x11drv: Renamed the x11drv directory to winex11.drv.
[wine/multimedia.git] / dlls / winex11.drv / codepage.c
blob86201dafc9b4374e127878d693264346f056cc1f
1 /*
2 * X11 codepage handling
4 * Copyright 2000 Hidenori Takeshima <hidenori@a2.ctktv.ne.jp>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "config.h"
23 #include <math.h>
24 #include <stdarg.h>
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winnls.h"
29 #include "x11font.h"
30 #include "wine/debug.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(text);
34 /***********************************************************************
35 * IsLegalDBCSChar for cp932/936/949/950/euc
37 static inline
38 int IsLegalDBCSChar_cp932( BYTE lead, BYTE trail )
40 return ( ( ( lead >= (BYTE)0x81 && lead <= (BYTE)0x9f ) ||
41 ( lead >= (BYTE)0xe0 && lead <= (BYTE)0xfc ) ) &&
42 ( ( trail >= (BYTE)0x40 && trail <= (BYTE)0x7e ) ||
43 ( trail >= (BYTE)0x80 && trail <= (BYTE)0xfc ) ) );
46 static inline
47 int IsLegalDBCSChar_cp936( BYTE lead, BYTE trail )
49 return ( ( lead >= (BYTE)0x81 && lead <= (BYTE)0xfe ) &&
50 ( trail >= (BYTE)0x40 && trail <= (BYTE)0xfe ) );
53 static inline
54 int IsLegalDBCSChar_cp949( BYTE lead, BYTE trail )
56 return ( ( lead >= (BYTE)0x81 && lead <= (BYTE)0xfe ) &&
57 ( trail >= (BYTE)0x41 && trail <= (BYTE)0xfe ) );
60 static inline
61 int IsLegalDBCSChar_cp950( BYTE lead, BYTE trail )
63 return ( ( lead >= (BYTE)0x81 && lead <= (BYTE)0xfe ) &&
64 ( ( trail >= (BYTE)0x40 && trail <= (BYTE)0x7e ) ||
65 ( trail >= (BYTE)0xa1 && trail <= (BYTE)0xfe ) ) );
68 static inline
69 int IsLegalDBCSChar_euc( BYTE lead, BYTE trail )
71 return ( ( lead >= (BYTE)0xa1 && lead <= (BYTE)0xfe ) &&
72 ( trail >= (BYTE)0xa1 && trail <= (BYTE)0xfe ) );
76 /***********************************************************************
77 * DBCSCharToXChar2b for cp932/euc
80 static inline
81 void DBCSCharToXChar2b_cp932( XChar2b* pch, BYTE lead, BYTE trail )
83 unsigned int high, low;
85 high = (unsigned int)lead;
86 low = (unsigned int)trail;
88 if ( high <= 0x9f )
89 high = (high<<1) - 0xe0;
90 else
91 high = (high<<1) - 0x160;
92 if ( low < 0x9f )
94 high --;
95 if ( low < 0x7f )
96 low -= 0x1f;
97 else
98 low -= 0x20;
100 else
102 low -= 0x7e;
105 pch->byte1 = (unsigned char)high;
106 pch->byte2 = (unsigned char)low;
109 static inline
110 void DBCSCharToXChar2b_euc( XChar2b* pch, BYTE lead, BYTE trail )
112 pch->byte1 = lead & (BYTE)0x7f;
113 pch->byte2 = trail & (BYTE)0x7f;
119 static WORD X11DRV_enum_subfont_charset_normal( UINT index )
121 return DEFAULT_CHARSET;
124 static WORD X11DRV_enum_subfont_charset_cp932( UINT index )
126 switch ( index )
128 case 0: return X11FONT_JISX0201_CHARSET;
129 case 1: return X11FONT_JISX0212_CHARSET;
132 return DEFAULT_CHARSET;
135 static WORD X11DRV_enum_subfont_charset_cp936( UINT index )
137 switch ( index )
139 case 0: return ANSI_CHARSET;
142 return DEFAULT_CHARSET;
145 static WORD X11DRV_enum_subfont_charset_cp949( UINT index )
147 switch ( index )
149 case 0: return ANSI_CHARSET;
152 return DEFAULT_CHARSET;
155 static WORD X11DRV_enum_subfont_charset_cp950( UINT index )
157 switch ( index )
159 case 0: return ANSI_CHARSET;
162 return DEFAULT_CHARSET;
166 static XChar2b* X11DRV_unicode_to_char2b_sbcs( fontObject* pfo,
167 LPCWSTR lpwstr, UINT count )
169 XChar2b *str2b;
170 UINT i;
171 char *str;
172 UINT codepage = pfo->fi->codepage;
173 char ch = pfo->fs->default_char;
175 if (!(str2b = HeapAlloc( GetProcessHeap(), 0, count * sizeof(XChar2b) )))
176 return NULL;
177 if (!(str = HeapAlloc( GetProcessHeap(), 0, count )))
179 HeapFree( GetProcessHeap(), 0, str2b );
180 return NULL;
183 WideCharToMultiByte( codepage, 0, lpwstr, count, str, count, &ch, NULL );
185 for (i = 0; i < count; i++)
187 str2b[i].byte1 = 0;
188 str2b[i].byte2 = str[i];
190 HeapFree( GetProcessHeap(), 0, str );
192 return str2b;
195 static XChar2b* X11DRV_unicode_to_char2b_unicode( fontObject* pfo,
196 LPCWSTR lpwstr, UINT count )
198 XChar2b *str2b;
199 UINT i;
201 if (!(str2b = HeapAlloc( GetProcessHeap(), 0, count * sizeof(XChar2b) )))
202 return NULL;
204 for (i = 0; i < count; i++)
206 str2b[i].byte1 = lpwstr[i] >> 8;
207 str2b[i].byte2 = lpwstr[i] & 0xff;
210 return str2b;
213 /* FIXME: handle jisx0212.1990... */
214 static XChar2b* X11DRV_unicode_to_char2b_cp932( fontObject* pfo,
215 LPCWSTR lpwstr, UINT count )
217 XChar2b *str2b;
218 XChar2b *str2b_dst;
219 char *str;
220 BYTE *str_src;
221 UINT i;
222 char ch = pfo->fs->default_char;
224 if (!(str2b = HeapAlloc( GetProcessHeap(), 0, count * sizeof(XChar2b) )))
225 return NULL;
226 if (!(str = HeapAlloc( GetProcessHeap(), 0, count*2 )))
228 HeapFree( GetProcessHeap(), 0, str2b );
229 return NULL;
232 /* handle jisx0212.1990... */
233 WideCharToMultiByte( 932, 0, lpwstr, count, str, count*2, &ch, NULL );
235 str_src = (BYTE*) str;
236 str2b_dst = str2b;
237 for (i = 0; i < count; i++, str_src++, str2b_dst++)
239 if ( IsLegalDBCSChar_cp932( *str_src, *(str_src+1) ) )
241 DBCSCharToXChar2b_cp932( str2b_dst, *str_src, *(str_src+1) );
242 str_src++;
244 else
246 str2b_dst->byte1 = 0;
247 str2b_dst->byte2 = *str_src;
251 HeapFree( GetProcessHeap(), 0, str );
253 return str2b;
257 static XChar2b* X11DRV_unicode_to_char2b_cp936( fontObject* pfo,
258 LPCWSTR lpwstr, UINT count )
260 XChar2b *str2b;
261 XChar2b *str2b_dst;
262 char *str;
263 BYTE *str_src;
264 UINT i;
265 char ch = pfo->fs->default_char;
267 if (!(str2b = HeapAlloc( GetProcessHeap(), 0, count * sizeof(XChar2b) )))
268 return NULL;
269 if (!(str = HeapAlloc( GetProcessHeap(), 0, count*2 )))
271 HeapFree( GetProcessHeap(), 0, str2b );
272 return NULL;
274 WideCharToMultiByte( 936, 0, lpwstr, count, str, count*2, &ch, NULL );
276 str_src = (BYTE*) str;
277 str2b_dst = str2b;
278 for (i = 0; i < count; i++, str_src++, str2b_dst++)
280 if ( IsLegalDBCSChar_cp936( *str_src, *(str_src+1) ) )
282 str2b_dst->byte1 = *str_src;
283 str2b_dst->byte2 = *(str_src+1);
284 str_src++;
286 else
288 str2b_dst->byte1 = 0;
289 str2b_dst->byte2 = *str_src;
293 HeapFree( GetProcessHeap(), 0, str );
295 return str2b;
298 static XChar2b* X11DRV_unicode_to_char2b_cp949( fontObject* pfo,
299 LPCWSTR lpwstr, UINT count )
301 XChar2b *str2b;
302 XChar2b *str2b_dst;
303 char *str;
304 BYTE *str_src;
305 UINT i;
306 char ch = pfo->fs->default_char;
308 if (!(str2b = HeapAlloc( GetProcessHeap(), 0, count * sizeof(XChar2b) )))
309 return NULL;
310 if (!(str = HeapAlloc( GetProcessHeap(), 0, count*2 )))
312 HeapFree( GetProcessHeap(), 0, str2b );
313 return NULL;
315 WideCharToMultiByte( 949, 0, lpwstr, count, str, count*2, &ch, NULL );
317 str_src = (BYTE*) str;
318 str2b_dst = str2b;
319 for (i = 0; i < count; i++, str_src++, str2b_dst++)
321 if ( IsLegalDBCSChar_cp949( *str_src, *(str_src+1) ) )
323 str2b_dst->byte1 = *str_src;
324 str2b_dst->byte2 = *(str_src+1);
325 str_src++;
327 else
329 str2b_dst->byte1 = 0;
330 str2b_dst->byte2 = *str_src;
334 HeapFree( GetProcessHeap(), 0, str );
336 return str2b;
340 static XChar2b* X11DRV_unicode_to_char2b_cp950( fontObject* pfo,
341 LPCWSTR lpwstr, UINT count )
343 XChar2b *str2b;
344 XChar2b *str2b_dst;
345 char *str;
346 BYTE *str_src;
347 UINT i;
348 char ch = pfo->fs->default_char;
350 if (!(str2b = HeapAlloc( GetProcessHeap(), 0, count * sizeof(XChar2b) )))
351 return NULL;
352 if (!(str = HeapAlloc( GetProcessHeap(), 0, count*2 )))
354 HeapFree( GetProcessHeap(), 0, str2b );
355 return NULL;
357 WideCharToMultiByte( 950, 0, lpwstr, count, str, count*2, &ch, NULL );
359 str_src = (BYTE*) str;
360 str2b_dst = str2b;
361 for (i = 0; i < count; i++, str_src++, str2b_dst++)
363 if ( IsLegalDBCSChar_cp950( *str_src, *(str_src+1) ) )
365 str2b_dst->byte1 = *str_src;
366 str2b_dst->byte2 = *(str_src+1);
367 str_src++;
369 else
371 str2b_dst->byte1 = 0;
372 str2b_dst->byte2 = *str_src;
376 HeapFree( GetProcessHeap(), 0, str );
378 return str2b;
381 static XChar2b* X11DRV_unicode_to_char2b_symbol( fontObject* pfo,
382 LPCWSTR lpwstr, UINT count )
384 XChar2b *str2b;
385 UINT i;
386 char ch = pfo->fs->default_char;
388 if (!(str2b = HeapAlloc( GetProcessHeap(), 0, count * sizeof(XChar2b) )))
389 return NULL;
391 for (i = 0; i < count; i++)
393 str2b[i].byte1 = 0;
394 if(lpwstr[i] >= 0xf000 && lpwstr[i] < 0xf100)
395 str2b[i].byte2 = lpwstr[i] - 0xf000;
396 else if(lpwstr[i] < 0x100)
397 str2b[i].byte2 = lpwstr[i];
398 else
399 str2b[i].byte2 = ch;
402 return str2b;
406 static void X11DRV_DrawString_normal( fontObject* pfo, Display* pdisp,
407 Drawable d, GC gc, int x, int y,
408 XChar2b* pstr, int count )
410 wine_tsx11_lock();
411 XDrawString16( pdisp, d, gc, x, y, pstr, count );
412 wine_tsx11_unlock();
415 static int X11DRV_TextWidth_normal( fontObject* pfo, XChar2b* pstr, int count )
417 int ret;
418 wine_tsx11_lock();
419 ret = XTextWidth16( pfo->fs, pstr, count );
420 wine_tsx11_unlock();
421 return ret;
424 static void X11DRV_DrawText_normal( fontObject* pfo, Display* pdisp, Drawable d,
425 GC gc, int x, int y, XTextItem16* pitems,
426 int count )
428 wine_tsx11_lock();
429 XDrawText16( pdisp, d, gc, x, y, pitems, count );
430 wine_tsx11_unlock();
433 static void X11DRV_TextExtents_normal( fontObject* pfo, XChar2b* pstr, int count,
434 int* pdir, int* pascent, int* pdescent,
435 int* pwidth )
437 XCharStruct info;
439 wine_tsx11_lock();
440 XTextExtents16( pfo->fs, pstr, count, pdir, pascent, pdescent, &info );
441 wine_tsx11_unlock();
442 *pwidth = info.width;
445 static void X11DRV_GetTextMetricsW_normal( fontObject* pfo, LPTEXTMETRICW pTM )
447 LPIFONTINFO16 pdf = &pfo->fi->df;
449 if( ! pfo->lpX11Trans ) {
450 pTM->tmAscent = pfo->fs->ascent;
451 pTM->tmDescent = pfo->fs->descent;
452 } else {
453 pTM->tmAscent = pfo->lpX11Trans->ascent;
454 pTM->tmDescent = pfo->lpX11Trans->descent;
457 pTM->tmAscent *= pfo->rescale;
458 pTM->tmDescent *= pfo->rescale;
460 pTM->tmHeight = pTM->tmAscent + pTM->tmDescent;
462 pTM->tmAveCharWidth = pfo->foAvgCharWidth * pfo->rescale;
463 pTM->tmMaxCharWidth = pfo->foMaxCharWidth * pfo->rescale;
465 pTM->tmInternalLeading = pfo->foInternalLeading * pfo->rescale;
466 pTM->tmExternalLeading = pdf->dfExternalLeading * pfo->rescale;
468 pTM->tmStruckOut = (pfo->fo_flags & FO_SYNTH_STRIKEOUT )
469 ? 1 : pdf->dfStrikeOut;
470 pTM->tmUnderlined = (pfo->fo_flags & FO_SYNTH_UNDERLINE )
471 ? 1 : pdf->dfUnderline;
473 pTM->tmOverhang = 0;
474 if( pfo->fo_flags & FO_SYNTH_ITALIC )
476 pTM->tmOverhang += pTM->tmHeight/3;
477 pTM->tmItalic = 1;
478 } else
479 pTM->tmItalic = pdf->dfItalic;
481 pTM->tmWeight = pdf->dfWeight;
482 if( pfo->fo_flags & FO_SYNTH_BOLD )
484 pTM->tmOverhang++;
485 pTM->tmWeight += 100;
488 pTM->tmFirstChar = pdf->dfFirstChar;
489 pTM->tmLastChar = pdf->dfLastChar;
490 pTM->tmDefaultChar = pdf->dfDefaultChar;
491 pTM->tmBreakChar = pdf->dfBreakChar;
493 pTM->tmCharSet = pdf->dfCharSet;
494 pTM->tmPitchAndFamily = pdf->dfPitchAndFamily;
496 pTM->tmDigitizedAspectX = pdf->dfHorizRes;
497 pTM->tmDigitizedAspectY = pdf->dfVertRes;
502 static
503 void X11DRV_DrawString_dbcs( fontObject* pfo, Display* pdisp,
504 Drawable d, GC gc, int x, int y,
505 XChar2b* pstr, int count )
507 XTextItem16 item;
509 item.chars = pstr;
510 item.delta = 0;
511 item.nchars = count;
512 item.font = None;
513 X11DRV_cptable[pfo->fi->cptable].pDrawText(
514 pfo, pdisp, d, gc, x, y, &item, 1 );
517 static
518 int X11DRV_TextWidth_dbcs_2fonts( fontObject* pfo, XChar2b* pstr, int count )
520 int i;
521 int width;
522 int curfont;
523 fontObject* pfos[X11FONT_REFOBJS_MAX+1];
525 pfos[0] = XFONT_GetFontObject( pfo->prefobjs[0] );
526 pfos[1] = pfo;
527 if ( pfos[0] == NULL ) pfos[0] = pfo;
529 width = 0;
530 wine_tsx11_lock();
531 for ( i = 0; i < count; i++ )
533 curfont = ( pstr->byte1 != 0 ) ? 1 : 0;
534 width += XTextWidth16( pfos[curfont]->fs, pstr, 1 );
535 pstr ++;
537 wine_tsx11_unlock();
538 return width;
541 static
542 void X11DRV_DrawText_dbcs_2fonts( fontObject* pfo, Display* pdisp, Drawable d,
543 GC gc, int x, int y, XTextItem16* pitems,
544 int count )
546 int i, nitems, prevfont = -1, curfont;
547 XChar2b* pstr;
548 XTextItem16* ptibuf;
549 XTextItem16* pti;
550 fontObject* pfos[X11FONT_REFOBJS_MAX+1];
552 pfos[0] = XFONT_GetFontObject( pfo->prefobjs[0] );
553 pfos[1] = pfo;
554 if ( pfos[0] == NULL ) pfos[0] = pfo;
556 nitems = 0;
557 for ( i = 0; i < count; i++ )
558 nitems += pitems->nchars;
559 ptibuf = HeapAlloc( GetProcessHeap(), 0, sizeof(XTextItem16) * nitems );
560 if ( ptibuf == NULL )
561 return; /* out of memory */
563 pti = ptibuf;
564 while ( count-- > 0 )
566 pti->chars = pstr = pitems->chars;
567 pti->delta = pitems->delta;
568 pti->font = None;
569 for ( i = 0; i < pitems->nchars; i++, pstr++ )
571 curfont = ( pstr->byte1 != 0 ) ? 1 : 0;
572 if ( curfont != prevfont )
574 if ( pstr != pti->chars )
576 pti->nchars = pstr - pti->chars;
577 pti ++;
578 pti->chars = pstr;
579 pti->delta = 0;
581 pti->font = pfos[curfont]->fs->fid;
582 prevfont = curfont;
585 pti->nchars = pstr - pti->chars;
586 pitems ++; pti ++;
588 wine_tsx11_lock();
589 XDrawText16( pdisp, d, gc, x, y, ptibuf, pti - ptibuf );
590 wine_tsx11_unlock();
591 HeapFree( GetProcessHeap(), 0, ptibuf );
594 static
595 void X11DRV_TextExtents_dbcs_2fonts( fontObject* pfo, XChar2b* pstr, int count,
596 int* pdir, int* pascent, int* pdescent,
597 int* pwidth )
599 XCharStruct info;
600 int ascent, descent, width;
601 int i;
602 int curfont;
603 fontObject* pfos[X11FONT_REFOBJS_MAX+1];
605 pfos[0] = XFONT_GetFontObject( pfo->prefobjs[0] );
606 pfos[1] = pfo;
607 if ( pfos[0] == NULL ) pfos[0] = pfo;
609 width = 0;
610 *pascent = 0;
611 *pdescent = 0;
612 wine_tsx11_lock();
613 for ( i = 0; i < count; i++ )
615 curfont = ( pstr->byte1 != 0 ) ? 1 : 0;
616 XTextExtents16( pfos[curfont]->fs, pstr, 1, pdir, &ascent, &descent, &info );
617 if ( *pascent < ascent ) *pascent = ascent;
618 if ( *pdescent < descent ) *pdescent = descent;
619 width += info.width;
621 pstr ++;
623 wine_tsx11_unlock();
624 *pwidth = width;
627 static void X11DRV_GetTextMetricsW_cp932( fontObject* pfo, LPTEXTMETRICW pTM )
629 fontObject* pfo_ansi = XFONT_GetFontObject( pfo->prefobjs[0] );
630 LPIFONTINFO16 pdf = &pfo->fi->df;
631 LPIFONTINFO16 pdf_ansi;
633 pdf_ansi = ( pfo_ansi != NULL ) ? (&pfo_ansi->fi->df) : pdf;
635 if( ! pfo->lpX11Trans ) {
636 pTM->tmAscent = pfo->fs->ascent;
637 pTM->tmDescent = pfo->fs->descent;
638 } else {
639 pTM->tmAscent = pfo->lpX11Trans->ascent;
640 pTM->tmDescent = pfo->lpX11Trans->descent;
643 pTM->tmAscent *= pfo->rescale;
644 pTM->tmDescent *= pfo->rescale;
646 pTM->tmHeight = pTM->tmAscent + pTM->tmDescent;
648 if ( pfo_ansi != NULL )
650 pTM->tmAveCharWidth = floor((pfo_ansi->foAvgCharWidth * 2.0 + pfo->foAvgCharWidth) / 3.0 * pfo->rescale + 0.5);
651 pTM->tmMaxCharWidth = max(pfo_ansi->foMaxCharWidth, pfo->foMaxCharWidth) * pfo->rescale;
653 else
655 pTM->tmAveCharWidth = floor((pfo->foAvgCharWidth * pfo->rescale + 1.0) / 2.0);
656 pTM->tmMaxCharWidth = pfo->foMaxCharWidth * pfo->rescale;
659 pTM->tmInternalLeading = pfo->foInternalLeading * pfo->rescale;
660 pTM->tmExternalLeading = pdf->dfExternalLeading * pfo->rescale;
662 pTM->tmStruckOut = (pfo->fo_flags & FO_SYNTH_STRIKEOUT )
663 ? 1 : pdf->dfStrikeOut;
664 pTM->tmUnderlined = (pfo->fo_flags & FO_SYNTH_UNDERLINE )
665 ? 1 : pdf->dfUnderline;
667 pTM->tmOverhang = 0;
668 if( pfo->fo_flags & FO_SYNTH_ITALIC )
670 pTM->tmOverhang += pTM->tmHeight/3;
671 pTM->tmItalic = 1;
672 } else
673 pTM->tmItalic = pdf->dfItalic;
675 pTM->tmWeight = pdf->dfWeight;
676 if( pfo->fo_flags & FO_SYNTH_BOLD )
678 pTM->tmOverhang++;
679 pTM->tmWeight += 100;
682 pTM->tmFirstChar = pdf_ansi->dfFirstChar;
683 pTM->tmLastChar = pdf_ansi->dfLastChar;
684 pTM->tmDefaultChar = pdf_ansi->dfDefaultChar;
685 pTM->tmBreakChar = pdf_ansi->dfBreakChar;
687 pTM->tmCharSet = pdf->dfCharSet;
688 pTM->tmPitchAndFamily = pdf->dfPitchAndFamily;
690 pTM->tmDigitizedAspectX = pdf->dfHorizRes;
691 pTM->tmDigitizedAspectY = pdf->dfVertRes;
698 const X11DRV_CP X11DRV_cptable[X11DRV_CPTABLE_COUNT] =
700 { /* SBCS */
701 X11DRV_enum_subfont_charset_normal,
702 X11DRV_unicode_to_char2b_sbcs,
703 X11DRV_DrawString_normal,
704 X11DRV_TextWidth_normal,
705 X11DRV_DrawText_normal,
706 X11DRV_TextExtents_normal,
707 X11DRV_GetTextMetricsW_normal,
709 { /* UNICODE */
710 X11DRV_enum_subfont_charset_normal,
711 X11DRV_unicode_to_char2b_unicode,
712 X11DRV_DrawString_normal,
713 X11DRV_TextWidth_normal,
714 X11DRV_DrawText_normal,
715 X11DRV_TextExtents_normal,
716 X11DRV_GetTextMetricsW_normal,
718 { /* CP932 */
719 X11DRV_enum_subfont_charset_cp932,
720 X11DRV_unicode_to_char2b_cp932,
721 X11DRV_DrawString_dbcs,
722 X11DRV_TextWidth_dbcs_2fonts,
723 X11DRV_DrawText_dbcs_2fonts,
724 X11DRV_TextExtents_dbcs_2fonts,
725 X11DRV_GetTextMetricsW_cp932,
727 { /* CP936 */
728 X11DRV_enum_subfont_charset_cp936,
729 X11DRV_unicode_to_char2b_cp936,
730 X11DRV_DrawString_dbcs,
731 X11DRV_TextWidth_dbcs_2fonts,
732 X11DRV_DrawText_dbcs_2fonts,
733 X11DRV_TextExtents_dbcs_2fonts,
734 X11DRV_GetTextMetricsW_normal, /* FIXME */
736 { /* CP949 */
737 X11DRV_enum_subfont_charset_cp949,
738 X11DRV_unicode_to_char2b_cp949,
739 X11DRV_DrawString_dbcs,
740 X11DRV_TextWidth_dbcs_2fonts,
741 X11DRV_DrawText_dbcs_2fonts,
742 X11DRV_TextExtents_dbcs_2fonts,
743 X11DRV_GetTextMetricsW_normal, /* FIXME */
745 { /* CP950 */
746 X11DRV_enum_subfont_charset_cp950,
747 X11DRV_unicode_to_char2b_cp950,
748 X11DRV_DrawString_dbcs,
749 X11DRV_TextWidth_dbcs_2fonts,
750 X11DRV_DrawText_dbcs_2fonts,
751 X11DRV_TextExtents_dbcs_2fonts,
752 X11DRV_GetTextMetricsW_cp932,
754 { /* SYMBOL */
755 X11DRV_enum_subfont_charset_normal,
756 X11DRV_unicode_to_char2b_symbol,
757 X11DRV_DrawString_normal,
758 X11DRV_TextWidth_normal,
759 X11DRV_DrawText_normal,
760 X11DRV_TextExtents_normal,
761 X11DRV_GetTextMetricsW_normal,