-/* File: main-x11.c */
+/* File: main-x11.c */
/*
* Copyright (c) 1997 Ben Harrison, and others
#ifdef USE_JP_FONTSTRUCT
/*
- * ÆüËܸì(EUC-JAPAN)Âбþ (-DJP)
- * ¡¦´Á»ú¥Õ¥©¥ó¥È¤Î°·¤¤¤òÄɲÃ
- * ¡¦ÆüËܸì¤ò´Þ¤àʸ»úÎó¤Îɽ¼¨¥ë¡¼¥Á¥ó XDrawMultiString() ¤ÎÄɲÃ
- * ¡¦ÆüËܸì¤Îɽ¼¨Éý¤Ï¡¤¥Õ¥©¥ó¥È¤Î¾ðÊó¤Ë¤è¤é¤¹ASCII¥Õ¥©¥ó¥È¤Î2Çܤ˸ÇÄê
+ * 日本語(EUC-JAPAN)対応 (-DJP)
+ * ・漢字フォントの扱いを追加
+ * ・日本語を含む文字列の表示ルーチン XDrawMultiString() の追加
+ * ・日本語の表示幅は,フォントの情報によらすASCIIフォントの2倍に固定
*
- * ̤Âбþ
- * EUCȾ³Ñ¤Î°·¤¤
+ * 未対応
+ * EUC半角の扱い
*
- * 1996/6/7 Íû ¹¸¿ (ri@kuis.kyoto-u.ac.jp)
+ * 1996/6/7 李 晃伸 (ri@kuis.kyoto-u.ac.jp)
*/
#endif
/*
#include <X11/Xatom.h>
#endif /* __MAKEDEPEND__ */
-
+#include <iconv.h>
/*
* Include some helpful X11 code.
*/
if(ascent < (*fontinfo)->ascent) ascent = (*fontinfo)->ascent;
if(descent < (*fontinfo)->descent) descent = (*fontinfo)->descent;
if(((*fontinfo)->max_byte1) > 0){
- /* ¿¥Ð¥¤¥Èʸ»ú¤Î¾ì¹ç¤ÏÉýȾʬ(ü¿ôÀÚ¤ê¾å¤²)¤Çɾ²Á¤¹¤ë */
+ /* 多バイト文字の場合は幅半分(端数切り上げ)で評価する */
if(width < (cs->width+1)/2) width = (cs->width+1)/2;
}else{
if(width < cs->width) width = cs->width;
#ifdef USE_JP_FONTSTRUCT
/*
- * EUCÆüËܸ쥳¡¼¥É¤ò´Þ¤àʸ»úÎó¤òɽ¼¨¤¹¤ë (Xlib)
+ * EUC日本語コードを含む文字列を表示する (Xlib)
*/
static void
XDrawMultiString(display,d,gc, x, y, string, len, afont,
#ifdef TOFU
if ( (*str) == 0x7f ) {
- /* 0x7F¤Ï¢£¤Ç·è¤áÂǤÁ */
+ /* 0x7Fは■で決め打ち */
- /* Ϣ³¤¹¤ë0x7F¤ÎŤµ¤ò¸¡½Ð */
+ /* 連続する0x7Fの長さを検出 */
slen = 0;
while ( str < endp && (*str) == 0x7f ) {
slen++;
str++;
}
- /* ÉÁ²è */
+ /* 描画 */
XFillRectangle( display, d, gc, x, y-afont_ascent,
slen * afont_width, afont_height);
- /* ¥Ý¥¤¥ó¥¿¤ò¿Ê¤á¤ë */
+ /* ポインタを進める */
x += afont_width * slen;
}
else
#endif
if ( iskanji(*str) ) {
- /* UJIS¤Î»Ï¤Þ¤ê */
+ /* UJISの始まり */
- /* Ϣ³¤¹¤ëUJISʸ»ú¤ÎŤµ¤ò¸¡½Ð */
+ /* 連続するUJIS文字の長さを検出 */
slen = 0;
while ( str < endp && *str && iskanji(*str) ) {
kanji[slen].byte1 = *str++ & 0x7f;
kanji[slen++].byte2 = *str++ & 0x7f;
}
- /* ÉÁ²è */
+ /* 描画 */
XSetFont( display, gc, kfont->fid );
XDrawImageString16( display, d, gc, x, y, kanji, slen );
- /* ¥Ý¥¤¥ó¥¿¤ò¿Ê¤á¤ë */
+ /* ポインタを進める */
x += kfont_width * slen;
} else {
- /* Èó´Á»ú(=ASCII¤È²¾Äê)¤Î»Ï¤Þ¤ê */
+ /* 非漢字(=ASCIIと仮定)の始まり */
- /* Ϣ³¤¹¤ëASCIIʸ»ú¤ò¸¡½Ð */
+ /* 連続するASCII文字を検出 */
p = str;
slen = 0;
while ( str < endp && *str && !iskanji(*str) ) {
slen++;
}
- /* ÉÁ²è */
+ /* 描画 */
XSetFont( display, gc, afont->fid );
XDrawImageString( display, d, gc, x, y, p, slen );
- /* ¥Ý¥¤¥ó¥¿¤ò¿Ê¤á¤ë */
+ /* ポインタを進める */
x += afont_width * slen;
}
}
{
/* Note that the Infoclr is set up to contain the Infofnt */
#ifdef USE_JP_FONTSTRUCT
- /* ´Á»ú¥Õ¥©¥ó¥È¤Îɽ¼¨Éý¤Ï ASCII¥Õ¥©¥ó¥È¤Î2Çܤ˸ÇÄê */
+ /* 漢字フォントの表示幅は ASCIIフォントの2倍に固定 */
XDrawMultiString(Metadpy->dpy, Infowin->win, Infoclr->gc,
x, y, str, len,
Infofnt->info, Infofnt->wid, Infofnt->hgt,
Infokfnt->info, Infofnt->wid * 2);
#else
#ifdef USE_FONTSET
+
+ iconv_t cd = iconv_open("UTF-8", "EUC-JP");
+ size_t inlen = len;
+ size_t outlen = len * 2;
+ char *kanji = malloc(outlen);
+ char *sp = str; char *kp = kanji;
+ size_t n = iconv(cd, &sp, &inlen, &kp, &outlen);
+ iconv_close(cd);
+
XmbDrawImageString(Metadpy->dpy, Infowin->win, Infofnt->info,
- Infoclr->gc, x, y, str, len);
+ Infoclr->gc, x, y, kanji, kp-kanji);
+ free(kanji);
#else
XDrawImageString(Metadpy->dpy, Infowin->win, Infoclr->gc,
x, y, str, len);