-/* File: z-term.c */
+/* File: z-term.c */
/*
* Copyright (c) 1997 Ben Harrison
/* Special flags in the attr data */
#define AF_BIGTILE2 0xf0
+#define AF_TILE1 0x80
#ifdef JP
-#define AF_TILE1 0x80
#define AF_KANJI1 0x10
#define AF_KANJI2 0x20
#define AF_KANJIC 0x0f
/*
- * Á´³Ñʸ»úÂбþ¡£
- * °À¤ËÁ´³Ñʸ»ú¤Î£±¥Ð¥¤¥ÈÌÜ¡¢£²¥Ð¥¤¥ÈÌܤ⵲±¡£
+ * 全角文字対応。
+ * 属性に全角文字の1バイト目、2バイト目も記憶。
* By FIRST
*/
#endif
* computers, and to check for "keypresses" from the user. The major
* concerns were thus portability and efficiency, so Angband could be
* easily ported to many different systems, with minimal effort, and
- * yet would run quickly on each of these systems, no matter what kind
+ * yet would run quickly on each of these sys
+ tems, no matter what kind
* of underlying hardware/software support was being used.
*
* It is important to understand the differences between the older
/*
* Nuke a term_win (see below)
*/
-static errr term_win_nuke(term_win *s, int w, int h)
+static errr term_win_nuke(term_win *s, TERM_LEN w, TERM_LEN h)
{
/* Free the window access arrays */
- C_KILL(s->a, h, byte*);
+ C_KILL(s->a, h, TERM_COLOR*);
C_KILL(s->c, h, char*);
/* Free the window content arrays */
- C_KILL(s->va, h * w, byte);
+ C_KILL(s->va, h * w, TERM_COLOR);
C_KILL(s->vc, h * w, char);
/* Free the terrain access arrays */
- C_KILL(s->ta, h, byte*);
+ C_KILL(s->ta, h, TERM_COLOR*);
C_KILL(s->tc, h, char*);
/* Free the terrain content arrays */
- C_KILL(s->vta, h * w, byte);
+ C_KILL(s->vta, h * w, TERM_COLOR);
C_KILL(s->vtc, h * w, char);
/* Success */
/*
* Initialize a "term_win" (using the given window size)
*/
-static errr term_win_init(term_win *s, int w, int h)
+static errr term_win_init(term_win *s, TERM_LEN w, TERM_LEN h)
{
- int y;
+ TERM_LEN y;
/* Make the window access arrays */
- C_MAKE(s->a, h, byte*);
+ C_MAKE(s->a, h, TERM_COLOR*);
C_MAKE(s->c, h, char*);
/* Make the window content arrays */
- C_MAKE(s->va, h * w, byte);
+ C_MAKE(s->va, h * w, TERM_COLOR);
C_MAKE(s->vc, h * w, char);
/* Make the terrain access arrays */
- C_MAKE(s->ta, h, byte*);
+ C_MAKE(s->ta, h, TERM_COLOR*);
C_MAKE(s->tc, h, char*);
/* Make the terrain content arrays */
- C_MAKE(s->vta, h * w, byte);
+ C_MAKE(s->vta, h * w, TERM_COLOR);
C_MAKE(s->vtc, h * w, char);
/*
* Copy a "term_win" from another
*/
-static errr term_win_copy(term_win *s, term_win *f, int w, int h)
+static errr term_win_copy(term_win *s, term_win *f, TERM_LEN w, TERM_LEN h)
{
- int x, y;
+ TERM_LEN x, y;
/* Copy contents */
for (y = 0; y < h; y++)
{
- byte *f_aa = f->a[y];
+ TERM_COLOR *f_aa = f->a[y];
char *f_cc = f->c[y];
- byte *s_aa = s->a[y];
+ TERM_COLOR *s_aa = s->a[y];
char *s_cc = s->c[y];
- byte *f_taa = f->ta[y];
+ TERM_COLOR *f_taa = f->ta[y];
char *f_tcc = f->tc[y];
- byte *s_taa = s->ta[y];
+ TERM_COLOR *s_taa = s->ta[y];
char *s_tcc = s->tc[y];
for (x = 0; x < w; x++)
/* Verify the hook */
if (!Term->xtra_hook) return (-1);
-#ifdef CHUUKEI
- if( n == TERM_XTRA_CLEAR || n == TERM_XTRA_FRESH || n == TERM_XTRA_SHAPE )
- send_xtra_to_chuukei_server(n);
-#endif
/* Call the hook */
return ((*Term->xtra_hook)(n, v));
}
/*
* Hack -- fake hook for "Term_curs()" (see above)
*/
-static errr Term_curs_hack(int x, int y)
+static errr Term_curs_hack(TERM_LEN x, TERM_LEN y)
{
- /* Compiler silliness */
- if (x || y) return (-2);
+ /* Unused */
+ (void)x;
+ (void)y;
- /* Oops */
return (-1);
}
/*
+ * Hack -- fake hook for "Term_bigcurs()" (see above)
+ */
+static errr Term_bigcurs_hack(TERM_LEN x, TERM_LEN y)
+{
+ return (*Term->curs_hook)(x, y);
+}
+
+/*
* Hack -- fake hook for "Term_wipe()" (see above)
*/
-static errr Term_wipe_hack(int x, int y, int n)
+static errr Term_wipe_hack(TERM_LEN x, TERM_LEN y, int n)
{
- /* Compiler silliness */
- if (x || y || n) return (-2);
+ /* Unused */
+ (void)x;
+ (void)y;
+ (void)n;
- /* Oops */
return (-1);
}
/*
* Hack -- fake hook for "Term_text()" (see above)
*/
-#ifdef JP
-static errr Term_text_hack(int x, int y, int n, byte a, cptr cp)
-#else
-static errr Term_text_hack(int x, int y, int n, byte a, const char *cp)
-#endif
-
+static errr Term_text_hack(TERM_LEN x, TERM_LEN y, int n, TERM_COLOR a, concptr cp)
{
- /* Compiler silliness */
- if (x || y || n || a || cp) return (-2);
+ /* Unused */
+ (void)x;
+ (void)y;
+ (void)n;
+ (void)a;
+ (void)cp;
- /* Oops */
return (-1);
}
/*
* Hack -- fake hook for "Term_pict()" (see above)
*/
-static errr Term_pict_hack(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp)
+static errr Term_pict_hack(TERM_LEN x, TERM_LEN y, int n, const TERM_COLOR *ap, concptr cp, const TERM_COLOR *tap, concptr tcp)
{
- /* Compiler silliness */
- if (x || y || n || ap || cp || tap || tcp) return (-2);
+ /* Unused */
+ (void)x;
+ (void)y;
+ (void)n;
+ (void)ap;
+ (void)cp;
+ (void)tap;
+ (void)tcp;
- /* Oops */
return (-1);
}
/*
* Mentally draw an attr/char at a given location
- *
* Assumes given location and values are valid.
*/
-void Term_queue_char(int x, int y, byte a, char c, byte ta, char tc)
+void Term_queue_char(TERM_LEN x, TERM_LEN y, TERM_COLOR a, char c, TERM_COLOR ta, char tc)
{
term_win *scrn = Term->scr;
- byte *scr_aa = &scrn->a[y][x];
+ TERM_COLOR *scr_aa = &scrn->a[y][x];
char *scr_cc = &scrn->c[y][x];
- byte *scr_taa = &scrn->ta[y][x];
+ TERM_COLOR *scr_taa = &scrn->ta[y][x];
char *scr_tcc = &scrn->tc[y][x];
/* Hack -- Ignore non-changes */
*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]--;
}
/*
* Bigtile version of Term_queue_char().
- *
* If use_bigtile is FALSE, simply call Term_queue_char().
- *
* Otherwise, mentally draw a pair of attr/char at a given location.
- *
* Assumes given location and values are valid.
*/
-void Term_queue_bigchar(int x, int y, byte a, char c, byte ta, char tc)
+void Term_queue_bigchar(TERM_LEN x, TERM_LEN y, TERM_COLOR a, char c, TERM_COLOR ta, char tc)
{
#ifdef JP
* A table which relates each ascii character to a multibyte
* character.
*
- * ¡Ö¢£¡×¤ÏÆóÇÜÉýƦÉå¤ÎÆâÉô¥³¡¼¥É¤Ë»ÈÍÑ¡£
+ * 「■」は二倍幅豆腐の内部コードに使用。
*/
static char ascii_to_zenkaku[] =
- "¡¡¡ª¡É¡ô¡ð¡ó¡õ¡Ç¡Ê¡Ë¡ö¡Ü¡¤¡Ý¡¥¡¿"
- "£°£±£²£³£´£µ£¶£·£¸£¹¡§¡¨¡ã¡á¡ä¡©"
- "¡÷£Á£Â£Ã£Ä£Å£Æ£Ç£È£É£Ê£Ë£Ì£Í£Î£Ï"
- "£Ð£Ñ£Ò£Ó£Ô£Õ£Ö£×£Ø£Ù£Ú¡Î¡À¡Ï¡°¡²"
- "¡Æ£á£â£ã£ä£å£æ£ç£è£é£ê£ë£ì£í£î£ï"
- "£ð£ñ£ò£ó£ô£õ£ö£÷£ø£ù£ú¡Ð¡Ã¡Ñ¡Á¢£";
+ " !”#$%&’()*+,-./"
+ "0123456789:;<=>?"
+ "@ABCDEFGHIJKLMNO"
+ "PQRSTUVWXYZ[\]^_"
+ "‘abcdefghijklmno"
+ "pqrstuvwxyz{|}~■";
#endif
byte a2;
* This function is designed to be fast, with no consistancy checking.
* It is used to update the map in the game.
*/
-void Term_queue_line(int x, int y, int n, byte *a, char *c, byte *ta, char *tc)
+void Term_queue_line(TERM_LEN x, TERM_LEN y, int n, TERM_COLOR *a, char *c, TERM_COLOR *ta, char *tc)
{
term_win *scrn = Term->scr;
- int x1 = -1;
- int x2 = -1;
+ TERM_LEN x1 = -1;
+ TERM_LEN x2 = -1;
- byte *scr_aa = &scrn->a[y][x];
+ TERM_COLOR *scr_aa = &scrn->a[y][x];
char *scr_cc = &scrn->c[y][x];
- byte *scr_taa = &scrn->ta[y][x];
+ TERM_COLOR *scr_taa = &scrn->ta[y][x];
char *scr_tcc = &scrn->tc[y][x];
while (n--)
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;
}
}
* a valid location, so the first "n" characters of "s" can all be added
* starting at (x,y) without causing any illegal operations.
*/
-void Term_queue_chars(int x, int y, int n, byte a, cptr s)
+void Term_queue_chars(TERM_LEN x, TERM_LEN y, int n, TERM_COLOR a, concptr s)
{
- int x1 = -1, x2 = -1;
+ TERM_LEN x1 = -1, x2 = -1;
- byte *scr_aa = Term->scr->a[y];
+ TERM_COLOR *scr_aa = Term->scr->a[y];
#ifdef JP
char *scr_cc = Term->scr->c[y];
- byte *scr_taa = Term->scr->ta[y];
+ TERM_COLOR *scr_taa = Term->scr->ta[y];
char *scr_tcc = Term->scr->tc[y];
#else
char *scr_cc = Term->scr->c[y];
- byte *scr_taa = Term->scr->ta[y];
+ TERM_COLOR *scr_taa = Term->scr->ta[y];
char *scr_tcc = Term->scr->tc[y];
#endif
#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))
{
else
{
#endif
- byte oa = scr_aa[x];
+ TERM_COLOR oa = scr_aa[x];
char oc = scr_cc[x];
- byte ota = scr_taa[x];
+ TERM_COLOR ota = scr_taa[x];
char otc = scr_tcc[x];
/* Hack -- Ignore non-changes */
#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;
}
}
*
* Display text using "Term_pict()"
*/
-static void Term_fresh_row_pict(int y, int x1, int x2)
+static void Term_fresh_row_pict(TERM_LEN y, TERM_LEN x1, TERM_LEN x2)
{
- int x;
+ TERM_LEN x;
- byte *old_aa = Term->old->a[y];
+ TERM_COLOR *old_aa = Term->old->a[y];
char *old_cc = Term->old->c[y];
- byte *scr_aa = Term->scr->a[y];
+ TERM_COLOR *scr_aa = Term->scr->a[y];
char *scr_cc = Term->scr->c[y];
- byte *old_taa = Term->old->ta[y];
+ TERM_COLOR *old_taa = Term->old->ta[y];
char *old_tcc = Term->old->tc[y];
- byte *scr_taa = Term->scr->ta[y];
+ TERM_COLOR *scr_taa = Term->scr->ta[y];
char *scr_tcc = Term->scr->tc[y];
- byte ota;
+ TERM_COLOR ota;
char otc;
- byte nta;
+ TERM_COLOR nta;
char ntc;
/* Pending length */
- int fn = 0;
+ TERM_LEN fn = 0;
/* Pending start */
- int fx = 0;
+ TERM_LEN fx = 0;
- byte oa;
+ TERM_COLOR oa;
char oc;
- byte na;
+ TERM_COLOR na;
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
{
/* Draw pending attr/char pairs */
(void)((*Term->pict_hook)(fx, y, fn,
- &scr_aa[fx], &scr_cc[fx],&scr_taa[fx], &scr_tcc[fx]));
+ &scr_aa[fx], &scr_cc[fx], &scr_taa[fx], &scr_tcc[fx]));
/* Forget */
fn = 0;
}
#ifdef JP
- /* Á´³Ñʸ»ú¤Î»þ¤ÏºÆ³«°ÌÃ֤ϡܣ± */
+ /* 全角文字の時は再開位置は+1 */
if(kanji)
{
x++;
* Display text using "Term_text()" and "Term_wipe()",
* but use "Term_pict()" for high-bit attr/char pairs
*/
-static void Term_fresh_row_both(int y, int x1, int x2)
+static void Term_fresh_row_both(TERM_LEN y, int x1, int x2)
{
- int x;
+ TERM_LEN x;
- byte *old_aa = Term->old->a[y];
+ TERM_COLOR *old_aa = Term->old->a[y];
char *old_cc = Term->old->c[y];
- byte *scr_aa = Term->scr->a[y];
+ TERM_COLOR *scr_aa = Term->scr->a[y];
char *scr_cc = Term->scr->c[y];
- byte *old_taa = Term->old->ta[y];
+ TERM_COLOR *old_taa = Term->old->ta[y];
char *old_tcc = Term->old->tc[y];
- byte *scr_taa = Term->scr->ta[y];
+ TERM_COLOR *scr_taa = Term->scr->ta[y];
char *scr_tcc = Term->scr->tc[y];
- byte ota;
+ TERM_COLOR ota;
char otc;
- byte nta;
+ TERM_COLOR nta;
char ntc;
/* The "always_text" flag */
/* Pending attr */
byte fa = Term->attr_blank;
- byte oa;
+ TERM_COLOR oa;
char oc;
- byte na;
+ TERM_COLOR na;
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));
/* Draw pending chars (normal) */
if (fa || always_text)
{
-#ifdef CHUUKEI
- send_text_to_chuukei_server(fx, y, fn, fa, &scr_cc[fx]);
-#endif
(void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx]));
}
/* Draw pending chars (black) */
else
{
-#ifdef CHUUKEI
- send_wipe_to_chuukei_server(fx, y, fn);
-#endif
(void)((*Term->wipe_hook)(fx, y, fn));
}
}
#ifdef JP
- /* Á´³Ñʸ»ú¤Î»þ¤ÏºÆ³«°ÌÃ֤ϡܣ± */
+ /* 全角文字の時は再開位置は+1 */
if(kanji)
{
x++;
/* Draw pending chars (normal) */
if (fa || always_text)
{
-#ifdef CHUUKEI
- send_text_to_chuukei_server(fx, y, fn, fa, &scr_cc[fx]);
-#endif
(void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx]));
}
/* Draw pending chars (black) */
else
{
-#ifdef CHUUKEI
- send_wipe_to_chuukei_server(fx, y, fn);
-#endif
(void)((*Term->wipe_hook)(fx, y, fn));
}
/* Draw the pending chars */
if (fa || always_text)
{
-#ifdef CHUUKEI
- send_text_to_chuukei_server(fx, y, fn, fa, &scr_cc[fx]);
-#endif
(void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx]));
}
/* Hack -- Erase "leading" spaces */
else
{
-#ifdef CHUUKEI
- send_wipe_to_chuukei_server(fx, y, fn);
-#endif
(void)((*Term->wipe_hook)(fx, y, fn));
}
/* Draw pending chars (normal) */
if (fa || always_text)
{
-#ifdef CHUUKEI
- send_text_to_chuukei_server(fx, y, fn, fa, &scr_cc[fx]);
-#endif
(void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx]));
}
/* Draw pending chars (black) */
else
{
-#ifdef CHUUKEI
- send_wipe_to_chuukei_server(fx, y, fn);
-#endif
(void)((*Term->wipe_hook)(fx, y, fn));
}
}
*
* Display text using "Term_text()" and "Term_wipe()"
*/
-static void Term_fresh_row_text(int y, int x1, int x2)
+static void Term_fresh_row_text(TERM_LEN y, TERM_LEN x1, TERM_LEN x2)
{
- int x;
+ TERM_LEN x;
- byte *old_aa = Term->old->a[y];
+ TERM_COLOR *old_aa = Term->old->a[y];
char *old_cc = Term->old->c[y];
- byte *scr_aa = Term->scr->a[y];
+ TERM_COLOR *scr_aa = Term->scr->a[y];
char *scr_cc = Term->scr->c[y];
/* The "always_text" flag */
/* Pending attr */
byte fa = Term->attr_blank;
- byte oa;
+ TERM_COLOR oa;
char oc;
- byte na;
+ TERM_COLOR na;
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
/* Draw pending chars (normal) */
if (fa || always_text)
{
-#ifdef CHUUKEI
- send_text_to_chuukei_server(fx, y, fn, fa, &scr_cc[fx]);
-#endif
(void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx]));
}
/* Draw pending chars (black) */
else
{
-#ifdef CHUUKEI
- send_wipe_to_chuukei_server(fx, y, fn);
-#endif
(void)((*Term->wipe_hook)(fx, y, fn));
}
}
#ifdef JP
- /* Á´³Ñʸ»ú¤Î»þ¤ÏºÆ³«°ÌÃ֤ϡܣ± */
+ /* 全角文字の時は再開位置は+1 */
if(kanji)
{
x++;
/* Draw the pending chars */
if (fa || always_text)
{
-#ifdef CHUUKEI
- send_text_to_chuukei_server(fx, y, fn, fa, &scr_cc[fx]);
-#endif
(void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx]));
}
/* Hack -- Erase "leading" spaces */
else
{
-#ifdef CHUUKEI
- send_wipe_to_chuukei_server(fx, y, fn);
-#endif
(void)((*Term->wipe_hook)(fx, y, fn));
}
/* Draw pending chars (normal) */
if (fa || always_text)
{
-#ifdef CHUUKEI
- send_text_to_chuukei_server(fx, y, fn, fa, &scr_cc[fx]);
-#endif
(void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx]));
}
/* Draw pending chars (black) */
else
{
-#ifdef CHUUKEI
- send_wipe_to_chuukei_server(fx, y, fn);
-#endif
(void)((*Term->wipe_hook)(fx, y, fn));
}
}
* On systems with a "soft" cursor, we must explicitly erase the cursor
* before flushing the output, if needed, to prevent a "jumpy" refresh.
* The actual method for this is horrible, but there is very little that
- * we can do to simplify it efficiently. XXX XXX XXX
+ * we can do to simplify it efficiently.
*
* On systems with a "hard" cursor, we will "hide" the cursor before
* flushing the output, if needed, to avoid a "flickery" refresh. It
*/
errr Term_fresh(void)
{
- int x, y;
+ TERM_LEN x, y;
int w = Term->wid;
int h = Term->hgt;
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);
}
- /* Paranoia -- use "fake" hooks to prevent core dumps */
- if (!Term->curs_hook) Term->curs_hook = Term_curs_hack;
- if (!Term->bigcurs_hook) Term->bigcurs_hook = Term->curs_hook;
- if (!Term->wipe_hook) Term->wipe_hook = Term_wipe_hack;
- if (!Term->text_hook) Term->text_hook = Term_text_hack;
- if (!Term->pict_hook) Term->pict_hook = Term_pict_hack;
-
-
/* Handle "total erase" */
if (Term->total_erase)
{
/* Wipe each row */
for (y = 0; y < h; y++)
{
- byte *aa = old->a[y];
+ TERM_COLOR *aa = old->a[y];
char *cc = old->c[y];
- byte *taa = old->ta[y];
+ TERM_COLOR *taa = old->ta[y];
char *tcc = old->tc[y];
if (!old->cu && old->cv)
{
int csize = 1;
- int tx = old->cx;
- int ty = old->cy;
+ TERM_LEN tx = old->cx;
+ TERM_LEN ty = old->cy;
- byte *old_aa = old->a[ty];
+ TERM_COLOR *old_aa = old->a[ty];
char *old_cc = old->c[ty];
- byte *old_taa = old->ta[ty];
+ TERM_COLOR *old_taa = old->ta[ty];
char *old_tcc = old->tc[ty];
- byte ota = old_taa[tx];
+ TERM_COLOR ota = old_taa[tx];
char otc = old_tcc[tx];
#ifdef JP
{
(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)
- {
-
-#ifdef CHUUKEI
- send_text_to_chuukei_server(tx, ty, csize, (old_aa[tx] & 0xf), &old_cc[tx]);
-#endif
- (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 */
else
{
-#ifdef CHUUKEI
- send_wipe_to_chuukei_server(tx, ty, 1);
-#endif
(void)((*Term->wipe_hook)(tx, ty, 1));
}
}
/* Scan the "modified" rows */
for (y = y1; y <= y2; ++y)
{
- int x1 = Term->x1[y];
- int x2 = Term->x2[y];
+ TERM_LEN x1 = Term->x1[y];
+ TERM_LEN x2 = Term->x2[y];
/* Flush each "modified" row */
if (x1 <= x2)
}
/* 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;
}
/* Draw the cursor */
if (!scr->cu && scr->cv)
{
-#ifdef CHUUKEI
- send_curs_to_chuukei_server(scr->cx, scr->cy);
-#endif
-
#ifdef JP
if ((scr->cx + 1 < w) &&
((old->a[scr->cy][scr->cx + 1] & AF_BIGTILE2) == AF_BIGTILE2 ||
/* The cursor is useless, hide it */
if (scr->cu)
{
-#ifdef CHUUKEI
- send_curs_to_chuukei_server(w - 1, scr->cy);
-#endif
/* Paranoia -- Put the cursor NEAR where it belongs */
(void)((*Term->curs_hook)(w - 1, scr->cy));
/* The cursor is invisible, hide it */
else if (!scr->cv)
{
-#ifdef CHUUKEI
- send_curs_to_chuukei_server(scr->cx, scr->cy);
-#endif
/* Paranoia -- Put the cursor where it belongs */
(void)((*Term->curs_hook)(scr->cx, scr->cy));
/* The cursor is visible, display it correctly */
else
{
-#ifdef CHUUKEI
- send_curs_to_chuukei_server(scr->cx, scr->cy);
-#endif
/* Put the cursor where it belongs */
(void)((*Term->curs_hook)(scr->cx, scr->cy));
if (Term->scr->cv == v) return (1);
/* Change */
- Term->scr->cv = v;
+ Term->scr->cv = (bool_hack)v;
/* Success */
return (0);
*
* Note -- "illegal" requests do not move the cursor.
*/
-errr Term_gotoxy(int x, int y)
+errr Term_gotoxy(TERM_LEN x, TERM_LEN y)
{
int w = Term->wid;
int h = Term->hgt;
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;
* Do not change the cursor position
* No visual changes until "Term_fresh()".
*/
-errr Term_draw(int x, int y, byte a, char c)
+errr Term_draw(TERM_LEN x, TERM_LEN y, TERM_COLOR a, char c)
{
int w = Term->wid;
int h = Term->hgt;
* positive value, future calls to either function will
* return negative ones.
*/
-errr Term_addch(byte a, char c)
+errr Term_addch(TERM_COLOR a, char c)
{
- int w = Term->wid;
+ TERM_LEN w = Term->wid;
/* Handle "unusable" cursor */
if (Term->scr->cu) return (-1);
* Otherwise, queue a pair of attr/char for display at the current
* cursor location, and advance the cursor to the right by two.
*/
-errr Term_add_bigch(byte a, char c)
+errr Term_add_bigch(TERM_COLOR a, char c)
{
if (!use_bigtile) return Term_addch(a, c);
* positive value, future calls to either function will
* return negative ones.
*/
-errr Term_addstr(int n, byte a, cptr s)
+errr Term_addstr(int n, TERM_COLOR a, concptr s)
{
int k;
-
- int w = Term->wid;
-
+ TERM_LEN w = Term->wid;
errr res = 0;
/* Handle "unusable" cursor */
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;
/*
* Move to a location and, using an attr, add a char
*/
-errr Term_putch(int x, int y, byte a, char c)
+errr Term_putch(TERM_LEN x, TERM_LEN y, TERM_COLOR a, char c)
{
errr res;
/*
* Move to a location and, using an attr, add a string
*/
-errr Term_putstr(int x, int y, int n, byte a, cptr s)
+errr Term_putstr(TERM_LEN x, TERM_LEN y, int n, TERM_COLOR a, concptr s)
{
errr res;
/*
* Move to a location and, using an attr, add a string vertically
*/
-errr Term_putstr_v(int x, int y, int n, byte a, cptr s)
+errr Term_putstr_v(TERM_LEN x, TERM_LEN y, int n, byte a, concptr s)
{
errr res;
int i;
/*
* Place cursor at (x,y), and clear the next "n" chars
*/
-errr Term_erase(int x, int y, int n)
+errr Term_erase(TERM_LEN x, TERM_LEN y, int n)
{
int i;
- int w = Term->wid;
+ TERM_LEN w = Term->wid;
/* int h = Term->hgt; */
- int x1 = -1;
- int x2 = -1;
+ TERM_LEN x1 = -1;
+ TERM_LEN x2 = -1;
int na = Term->attr_blank;
int nc = Term->char_blank;
- byte *scr_aa;
+ TERM_COLOR *scr_aa;
char *scr_cc;
- byte *scr_taa;
+ TERM_COLOR *scr_taa;
char *scr_tcc;
/* Place cursor */
#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 */
*/
errr Term_clear(void)
{
- int x, y;
+ TERM_LEN x, y;
- int w = Term->wid;
- int h = Term->hgt;
+ TERM_LEN w = Term->wid;
+ TERM_LEN h = Term->hgt;
- byte na = Term->attr_blank;
+ TERM_COLOR na = Term->attr_blank;
char nc = Term->char_blank;
/* Cursor usable */
/* Wipe each row */
for (y = 0; y < h; y++)
{
- byte *scr_aa = Term->scr->a[y];
+ TERM_COLOR *scr_aa = Term->scr->a[y];
char *scr_cc = Term->scr->c[y];
- byte *scr_taa = Term->scr->ta[y];
+ TERM_COLOR *scr_taa = Term->scr->ta[y];
char *scr_tcc = Term->scr->tc[y];
/* Wipe each column */
/*
- * Redraw part of a widow.
+ * Redraw part of a window.
*/
-errr Term_redraw_section(int x1, int y1, int x2, int y2)
+errr Term_redraw_section(TERM_LEN x1, TERM_LEN y1, TERM_LEN x2, TERM_LEN y2)
{
int i, j;
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_LEN *w, TERM_LEN *h)
{
/* Access the cursor */
(*w) = Term->wid;
/*
* Extract the current cursor location
*/
-errr Term_locate(int *x, int *y)
+errr Term_locate(TERM_LEN *x, TERM_LEN *y)
{
/* Access the cursor */
(*x) = Term->scr->cx;
* Note that this refers to what will be on the window after the
* next call to "Term_fresh()". It may or may not already be there.
*/
-errr Term_what(int x, int y, byte *a, char *c)
+errr Term_what(TERM_LEN x, TERM_LEN y, TERM_COLOR *a, char *c)
{
- int w = Term->wid;
- int h = Term->hgt;
+ TERM_LEN w = Term->wid;
+ TERM_LEN h = Term->hgt;
/* Verify location */
if ((x < 0) || (x >= w)) return (-1);
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);
-#if 0
- /* Hack -- Forget the oldest key */
- if (++Term->key_tail == Term->key_size) Term->key_tail = 0;
-#endif
-
/* Problem */
return (1);
}
*/
errr Term_save(void)
{
- int w = Term->wid;
- int h = Term->hgt;
+ TERM_LEN w = Term->wid;
+ TERM_LEN h = Term->hgt;
/* Create */
if (!Term->mem)
*/
errr Term_load(void)
{
- int y;
+ TERM_LEN y;
- int w = Term->wid;
- int h = Term->hgt;
+ TERM_LEN w = Term->wid;
+ TERM_LEN h = Term->hgt;
/* Create */
if (!Term->mem)
*/
errr Term_exchange(void)
{
- int y;
+ TERM_LEN y;
- int w = Term->wid;
- int h = Term->hgt;
+ TERM_LEN w = Term->wid;
+ TERM_LEN h = Term->hgt;
term_win *exchanger;
/*
* React to a new physical window size.
*/
-errr Term_resize(int w, int h)
+errr Term_resize(TERM_LEN w, TERM_LEN h)
{
int i;
- int wid, hgt;
+ TERM_LEN wid, hgt;
- byte *hold_x1;
- byte *hold_x2;
+ TERM_LEN *hold_x1;
+ TERM_LEN *hold_x2;
term_win *hold_old;
term_win *hold_scr;
hold_tmp = Term->tmp;
/* Create new scanners */
- C_MAKE(Term->x1, h, byte);
- C_MAKE(Term->x2, h, byte);
+ C_MAKE(Term->x1, h, TERM_LEN);
+ C_MAKE(Term->x2, h, TERM_LEN);
/* Create new window */
MAKE(Term->old, term_win);
}
/* Free some arrays */
- C_KILL(hold_x1, Term->hgt, byte);
- C_KILL(hold_x2, Term->hgt, byte);
+ C_KILL(hold_x1, Term->hgt, TERM_LEN);
+ C_KILL(hold_x2, Term->hgt, TERM_LEN);
/* Nuke */
term_win_nuke(hold_old, Term->wid, Term->hgt);
*/
errr term_nuke(term *t)
{
- int w = t->wid;
- int h = t->hgt;
+ TERM_LEN w = t->wid;
+ TERM_LEN h = t->hgt;
/* Hack -- Call the special "nuke" hook */
}
/* Free some arrays */
- C_KILL(t->x1, h, byte);
- C_KILL(t->x2, h, byte);
+ C_KILL(t->x1, h, TERM_LEN);
+ C_KILL(t->x2, h, TERM_LEN);
/* Free the input queue */
C_KILL(t->key_queue, t->key_size, char);
* By default, the cursor starts out "invisible"
* By default, we "erase" using "black spaces"
*/
-errr term_init(term *t, int w, int h, int k)
+errr term_init(term *t, TERM_LEN w, TERM_LEN h, int k)
{
- int y;
+ TERM_LEN y;
/* Wipe it */
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);
t->hgt = h;
/* Allocate change arrays */
- C_MAKE(t->x1, h, byte);
- C_MAKE(t->x2, h, byte);
+ C_MAKE(t->x1, h, TERM_LEN);
+ C_MAKE(t->x2, h, TERM_LEN);
/* Allocate "displayed" */
t->char_blank = ' ';
+ /* Prepare "fake" hooks to prevent core dumps */
+ t->curs_hook = Term_curs_hack;
+ t->bigcurs_hook = Term_bigcurs_hack;
+ t->wipe_hook = Term_wipe_hack;
+ t->text_hook = Term_text_hack;
+ t->pict_hook = Term_pict_hack;
+
+
/* Success */
return (0);
}