-/* File: z-term.c */
+/* File: z-term.c */
/*
* Copyright (c) 1997 Ben Harrison
#define AF_KANJI2 0x20
#define AF_KANJIC 0x0f
/*
- * Á´³Ñʸ»úÂбþ¡£
- * °À¤ËÁ´³Ñʸ»ú¤Î£±¥Ð¥¤¥ÈÌÜ¡¢£²¥Ð¥¤¥ÈÌܤ⵲±¡£
+ * 全角文字対応。
+ * 属性に全角文字の1バイト目、2バイト目も記憶。
* By FIRST
*/
#endif
*scr_tcc = tc;
/* Check for new min/max row info */
- if (y < Term->y1) Term->y1 = y;
- if (y > Term->y2) Term->y2 = y;
+ if (y < Term->y1) Term->y1 = (byte_hack)y;
+ if (y > Term->y2) Term->y2 = (byte_hack)y;
/* Check for new min/max col info for this row */
- if (x < Term->x1[y]) Term->x1[y] = x;
- if (x > Term->x2[y]) Term->x2[y] = x;
+ if (x < Term->x1[y]) Term->x1[y] = (byte_hack)x;
+ if (x > Term->x2[y]) Term->x2[y] = (byte_hack)x;
+#ifdef JP
if (((scrn->a[y][x] & AF_BIGTILE2) == AF_BIGTILE2) ||
(scrn->a[y][x] & AF_KANJI2))
+#else
+ if ((scrn->a[y][x] & AF_BIGTILE2) == AF_BIGTILE2)
+#endif
if ((x - 1) < Term->x1[y]) Term->x1[y]--;
}
* A table which relates each ascii character to a multibyte
* character.
*
- * ¡Ö¢£¡×¤ÏÆóÇÜÉýƦÉå¤ÎÆâÉô¥³¡¼¥É¤Ë»ÈÍÑ¡£
+ * 「■」は二倍幅豆腐の内部コードに使用。
*/
static char ascii_to_zenkaku[] =
- "¡¡¡ª¡É¡ô¡ð¡ó¡õ¡Ç¡Ê¡Ë¡ö¡Ü¡¤¡Ý¡¥¡¿"
- "£°£±£²£³£´£µ£¶£·£¸£¹¡§¡¨¡ã¡á¡ä¡©"
- "¡÷£Á£Â£Ã£Ä£Å£Æ£Ç£È£É£Ê£Ë£Ì£Í£Î£Ï"
- "£Ð£Ñ£Ò£Ó£Ô£Õ£Ö£×£Ø£Ù£Ú¡Î¡À¡Ï¡°¡²"
- "¡Æ£á£â£ã£ä£å£æ£ç£è£é£ê£ë£ì£í£î£ï"
- "£ð£ñ£ò£ó£ô£õ£ö£÷£ø£ù£ú¡Ð¡Ã¡Ñ¡Á¢£";
+ " !”#$%&’()*+,-./"
+ "0123456789:;<=>?"
+ "@ABCDEFGHIJKLMNO"
+ "PQRSTUVWXYZ[\]^_"
+ "‘abcdefghijklmno"
+ "pqrstuvwxyz{|}~■";
#endif
byte a2;
if (x1 >= 0)
{
/* Check for new min/max row info */
- if (y < Term->y1) Term->y1 = y;
- if (y > Term->y2) Term->y2 = y;
+ if (y < Term->y1) Term->y1 = (byte_hack)y;
+ if (y > Term->y2) Term->y2 = (byte_hack)y;
/* Check for new min/max col info in this row */
- if (x1 < Term->x1[y]) Term->x1[y] = x1;
- if (x2 > Term->x2[y]) Term->x2[y] = x2;
+ if (x1 < Term->x1[y]) Term->x1[y] = (byte_hack)x1;
+ if (x2 > Term->x2[y]) Term->x2[y] = (byte_hack)x2;
}
}
#ifdef JP
- /* ɽ¼¨Ê¸»ú¤Ê¤· */
+ /* 表示文字なし */
if (n == 0 || *s == 0) return;
/*
- * Á´³Ñʸ»ú¤Î±¦È¾Ê¬¤«¤éʸ»ú¤òɽ¼¨¤¹¤ë¾ì¹ç¡¢
- * ½Å¤Ê¤Ã¤¿Ê¸»ú¤Îº¸Éôʬ¤ò¾Ãµî¡£
- * ɽ¼¨³«»Ï°ÌÃÖ¤¬º¸Ã¼¤Ç¤Ê¤¤¤È²¾Äê¡£
+ * 全角文字の右半分から文字を表示する場合、
+ * 重なった文字の左部分を消去。
+ * 表示開始位置が左端でないと仮定。
*/
if ((scr_aa[x] & AF_KANJI2) && (scr_aa[x] & AF_BIGTILE2) != AF_BIGTILE2)
{
for ( ; n; x++, s++, n--)
{
#ifdef JP
- /* Æüìʸ»ú¤È¤·¤ÆMSB¤¬Î©¤Ã¤Æ¤¤¤ë²ÄǽÀ¤¬¤¢¤ë */
- /* ¤½¤Î¾ì¹çattr¤ÎMSB¤âΩ¤Ã¤Æ¤¤¤ë¤Î¤Ç¤³¤ì¤Ç¼±Ê̤¹¤ë */
+ /* 特殊文字としてMSBが立っている可能性がある */
+ /* その場合attrのMSBも立っているのでこれで識別する */
/* check */
if (!(a & AF_TILE1) && iskanji(*s))
{
#ifdef JP
/*
- * Á´³Ñʸ»ú¤Îº¸È¾Ê¬¤Çɽ¼¨¤ò½ªÎ»¤¹¤ë¾ì¹ç¡¢
- * ½Å¤Ê¤Ã¤¿Ê¸»ú¤Î±¦Éôʬ¤ò¾Ãµî¡£
- * (¾ò·ïÄɲ᧥¿¥¤¥ë¤Î1ʸ»úÌܤǤʤ¤»ö¤ò³Î¤«¤á¤ë¤è¤¦¤Ë¡£)
+ * 全角文字の左半分で表示を終了する場合、
+ * 重なった文字の右部分を消去。
+ * (条件追加:タイルの1文字目でない事を確かめるように。)
*/
{
if (x1 >= 0)
{
/* Check for new min/max row info */
- if (y < Term->y1) Term->y1 = y;
- if (y > Term->y2) Term->y2 = y;
+ if (y < Term->y1) Term->y1 = (byte_hack)y;
+ if (y > Term->y2) Term->y2 = (byte_hack)y;
/* Check for new min/max col info in this row */
- if (x1 < Term->x1[y]) Term->x1[y] = x1;
- if (x2 > Term->x2[y]) Term->x2[y] = x2;
+ if (x1 < Term->x1[y]) Term->x1[y] = (byte_hack)x1;
+ if (x2 > Term->x2[y]) Term->x2[y] = (byte_hack)x2;
}
}
char nc;
#ifdef JP
- /* Á´³Ñʸ»ú¤Î£²¥Ð¥¤¥ÈÌܤ«¤É¤¦¤« */
+ /* 全角文字の2バイト目かどうか */
int kanji = 0;
#endif
/* Scan "modified" columns */
#ifdef JP
if (kanji)
{
- /* Á´³Ñʸ»ú£²¥Ð¥¤¥ÈÌÜ */
+ /* 全角文字2バイト目 */
kanji = 0;
old_aa[x] = na;
old_cc[x] = nc;
fn++;
continue;
}
- /* Æüìʸ»ú¤È¤·¤ÆMSB¤¬Î©¤Ã¤Æ¤¤¤ë²ÄǽÀ¤¬¤¢¤ë */
- /* ¤½¤Î¾ì¹çattr¤ÎMSB¤âΩ¤Ã¤Æ¤¤¤ë¤Î¤Ç¤³¤ì¤Ç¼±Ê̤¹¤ë */
+ /* 特殊文字としてMSBが立っている可能性がある */
+ /* その場合attrのMSBも立っているのでこれで識別する */
/* check */
kanji = (iskanji(nc) && !(na & AF_TILE1));
#endif
}
#ifdef JP
- /* Á´³Ñʸ»ú¤Î»þ¤ÏºÆ³«°ÌÃ֤ϡܣ± */
+ /* 全角文字の時は再開位置は+1 */
if(kanji)
{
x++;
char nc;
#ifdef JP
- /* Á´³Ñʸ»ú¤Î£²¥Ð¥¤¥ÈÌܤ«¤É¤¦¤« */
+ /* 全角文字の2バイト目かどうか */
int kanji = 0;
#endif
/* Scan "modified" columns */
#ifdef JP
if (kanji)
{
- /* Á´³Ñʸ»ú£²¥Ð¥¤¥ÈÌÜ */
+ /* 全角文字2バイト目 */
kanji = 0;
old_aa[x] = na;
old_cc[x] = nc;
fn++;
continue;
}
- /* Æüìʸ»ú¤È¤·¤ÆMSB¤¬Î©¤Ã¤Æ¤¤¤ë²ÄǽÀ¤¬¤¢¤ë */
- /* ¤½¤Î¾ì¹çattr¤ÎMSB¤âΩ¤Ã¤Æ¤¤¤ë¤Î¤Ç¤³¤ì¤Ç¼±Ê̤¹¤ë */
+ /* 特殊文字としてMSBが立っている可能性がある */
+ /* その場合attrのMSBも立っているのでこれで識別する */
/* check */
/* kanji = (iskanji(nc)); */
kanji = (iskanji(nc) && !(na & AF_TILE1));
}
#ifdef JP
- /* Á´³Ñʸ»ú¤Î»þ¤ÏºÆ³«°ÌÃ֤ϡܣ± */
+ /* 全角文字の時は再開位置は+1 */
if(kanji)
{
x++;
char nc;
#ifdef JP
- /* Á´³Ñʸ»ú¤Î£²¥Ð¥¤¥ÈÌܤ«¤É¤¦¤« */
+ /* 全角文字の2バイト目かどうか */
int kanji = 0;
for (x = 0; x < x1; x++)
#ifdef JP
if (kanji)
{
- /* Á´³Ñʸ»ú£²¥Ð¥¤¥ÈÌÜ */
+ /* 全角文字2バイト目 */
kanji = 0;
old_aa[x] = na;
old_cc[x] = nc;
fn++;
continue;
}
- /* Æüìʸ»ú¤È¤·¤ÆMSB¤¬Î©¤Ã¤Æ¤¤¤ë²ÄǽÀ¤¬¤¢¤ë */
- /* ¤½¤Î¾ì¹çattr¤ÎMSB¤âΩ¤Ã¤Æ¤¤¤ë¤Î¤Ç¤³¤ì¤Ç¼±Ê̤¹¤ë */
+ /* 特殊文字としてMSBが立っている可能性がある */
+ /* その場合attrのMSBも立っているのでこれで識別する */
/* check */
kanji = (iskanji(nc) && !(na & AF_TILE1));
#endif
}
#ifdef JP
- /* Á´³Ñʸ»ú¤Î»þ¤ÏºÆ³«°ÌÃ֤ϡܣ± */
+ /* 全角文字の時は再開位置は+1 */
if(kanji)
{
x++;
term_win *old = Term->old;
term_win *scr = Term->scr;
-
+
+ /* Before initialize (Advice from Mr.shimitei)*/
+ if (!old || !scr) return (1);
/* Do nothing unless "mapped" */
if (!Term->mapped_flag) return (1);
{
(void)((*Term->pict_hook)(tx, ty, 1, &old_aa[tx], &old_cc[tx], &ota, &otc));
}
-
- /* Hack -- restore the actual character */
- else if (old_aa[tx] || Term->always_text)
- {
- (void)((*Term->text_hook)(tx, ty, csize, (unsigned char) (old_aa[tx] & 0xf), &old_cc[tx]));
+
+ /*
+ * Hack -- restore the actual character
+ * 元の文字の描画範囲がカーソルより小さいと、
+ * 上書きされなかった部分がゴミとして残る。
+ * wipe_hook でカーソルを消去して text_hook で書き直す。
+ */
+ else if (old_aa[tx] || Term->always_text)
+ {
+ (void)((*Term->wipe_hook)(tx, ty, 1));
+ (void)((*Term->text_hook)(tx, ty, csize, (unsigned char) (old_aa[tx] & 0xf), &old_cc[tx]));
}
/* Hack -- erase the grid */
}
/* This row is all done */
- Term->x1[y] = w;
+ Term->x1[y] = (byte_hack)w;
Term->x2[y] = 0;
/* Hack -- Flush that row (if allowed) */
}
/* No rows are invalid */
- Term->y1 = h;
+ Term->y1 = (byte_hack)h;
Term->y2 = 0;
}
if (Term->scr->cv == v) return (1);
/* Change */
- Term->scr->cv = v;
+ Term->scr->cv = (bool_hack)v;
/* Success */
return (0);
if ((y < 0) || (y >= h)) return (-1);
/* Remember the cursor */
- Term->scr->cx = x;
- Term->scr->cy = y;
+ Term->scr->cx = (byte_hack)x;
+ Term->scr->cy = (byte_hack)y;
/* The cursor is not useless */
Term->scr->cu = 0;
Term_queue_chars(Term->scr->cx, Term->scr->cy, n, a, s);
/* Advance the cursor */
- Term->scr->cx += n;
+ Term->scr->cx += (byte_hack)n;
/* Hack -- Notice "Useless" cursor */
if (res) Term->scr->cu = 1;
#ifdef JP
/*
- * Á´³Ñʸ»ú¤Î±¦È¾Ê¬¤«¤éʸ»ú¤òɽ¼¨¤¹¤ë¾ì¹ç¡¢
- * ½Å¤Ê¤Ã¤¿Ê¸»ú¤Îº¸Éôʬ¤ò¾Ãµî¡£
+ * 全角文字の右半分から文字を表示する場合、
+ * 重なった文字の左部分を消去。
*/
if (n > 0 && (((scr_aa[x] & AF_KANJI2) && !(scr_aa[x] & AF_TILE1))
|| (scr_aa[x] & AF_BIGTILE2) == AF_BIGTILE2))
#ifdef JP
/*
- * Á´³Ñʸ»ú¤Îº¸È¾Ê¬¤Çɽ¼¨¤ò½ªÎ»¤¹¤ë¾ì¹ç¡¢
- * ½Å¤Ê¤Ã¤¿Ê¸»ú¤Î±¦Éôʬ¤ò¾Ãµî¡£
+ * 全角文字の左半分で表示を終了する場合、
+ * 重なった文字の右部分を消去。
*
* 2001/04/29 -- Habu
- * ¹Ô¤Î±¦Ã¼¤Î¾ì¹ç¤Ï¤³¤Î½èÍý¤ò¤·¤Ê¤¤¤è¤¦¤Ë½¤Àµ¡£
+ * 行の右端の場合はこの処理をしないように修正。
*/
if ((oa & AF_KANJI1) && (i + 1) == n && x != w - 1)
n++;
#endif
/* Save the "literal" information */
- scr_aa[x] = na;
- scr_cc[x] = nc;
+ scr_aa[x] = (byte_hack)na;
+ scr_cc[x] = (char)nc;
scr_taa[x] = 0;
scr_tcc[x] = 0;
if (x1 >= 0)
{
/* Check for new min/max row info */
- if (y < Term->y1) Term->y1 = y;
- if (y > Term->y2) Term->y2 = y;
+ if (y < Term->y1) Term->y1 = (byte_hack)y;
+ if (y > Term->y2) Term->y2 = (byte_hack)y;
/* Check for new min/max col info in this row */
- if (x1 < Term->x1[y]) Term->x1[y] = x1;
- if (x2 > Term->x2[y]) Term->x2[y] = x2;
+ if (x1 < Term->x1[y]) Term->x1[y] = (byte_hack)x1;
+ if (x2 > Term->x2[y]) Term->x2[y] = (byte_hack)x2;
}
/* Success */
if (x1 < 0) x1 = 0;
/* Set y limits */
- Term->y1 = y1;
- Term->y2 = y2;
+ Term->y1 = (byte_hack)y1;
+ Term->y2 = (byte_hack)y2;
/* Set the x limits */
for (i = Term->y1; i <= Term->y2; i++)
if (Term->scr->a[i][x2j] & AF_KANJI1) x2j++;
}
- Term->x1[i] = x1j;
- Term->x2[i] = x2j;
+ Term->x1[i] = (byte_hack)x1j;
+ Term->x2[i] = (byte_hack)x2j;
c_ptr = Term->old->c[i];
/*
* Extract the current window size
*/
-errr Term_get_size(int *w, int *h)
+errr Term_get_size(TERM_POSITION *w, TERM_POSITION *h)
{
/* Access the cursor */
(*w) = Term->wid;
if (!k) return (-1);
/* Store the char, advance the queue */
- Term->key_queue[Term->key_head++] = k;
+ Term->key_queue[Term->key_head++] = (char)k;
/* Circular queue, handle wrap */
if (Term->key_head == Term->key_size) Term->key_head = 0;
if (Term->key_tail == 0) Term->key_tail = Term->key_size;
/* Back up, Store the char */
- Term->key_queue[--Term->key_tail] = k;
+ Term->key_queue[--Term->key_tail] = (char)k;
/* Success (unless overflow) */
if (Term->key_head != Term->key_tail) return (0);
}
/* Save new size */
- Term->wid = w;
- Term->hgt = h;
+ Term->wid = (byte_hack)w;
+ Term->hgt = (byte_hack)h;
/* Force "total erase" */
Term->total_erase = TRUE;
t->key_head = t->key_tail = 0;
/* Determine the input queue size */
- t->key_size = k;
+ t->key_size = (u16b)k;
/* Allocate the input queue */
C_MAKE(t->key_queue, t->key_size, char);
/* Save the size */
- t->wid = w;
- t->hgt = h;
+ t->wid = (byte_hack)w;
+ t->hgt = (byte_hack)h;
/* Allocate change arrays */
C_MAKE(t->x1, h, byte);