-/* File: z-term.c */
+/* File: z-term.c */
/*
* Copyright (c) 1997 Ben Harrison
#include "z-virt.h"
+/* Special flags in the attr data */
+#define AF_BIGTILE2 0xf0
+#define AF_TILE1 0x80
#ifdef JP
-#define KANJI1 0x10
-#define KANJI2 0x20
-#define KANJIC 0x0f
+#define AF_KANJI1 0x10
+#define AF_KANJI2 0x20
+#define AF_KANJIC 0x0f
/*
- * Á´³Ñʸ»úÂбþ¡£
- * °À¤ËÁ´³Ñʸ»ú¤Î£±¥Ð¥¤¥ÈÌÜ¡¢£²¥Ð¥¤¥ÈÌܤ⵲±¡£
+ * 全角文字対応。
+ * 属性に全角文字の1バイト目、2バイト目も記憶。
* By FIRST
*/
#endif
* Term->user_hook = Perform user actions
* Term->xtra_hook = Perform extra actions
* Term->curs_hook = Draw (or Move) the cursor
+ * Term->bigcurs_hook = Draw (or Move) the big cursor (bigtile mode)
* Term->wipe_hook = Draw some blank spaces
* Term->text_hook = Draw some text in the window
* Term->pict_hook = Draw some attr/chars in the window
C_KILL(s->va, h * w, byte);
C_KILL(s->vc, h * w, char);
-#ifdef USE_TRANSPARENCY
-
/* Free the terrain access arrays */
C_KILL(s->ta, h, byte*);
C_KILL(s->tc, h, char*);
C_KILL(s->vta, h * w, byte);
C_KILL(s->vtc, h * w, char);
-#endif /* USE_TRANSPARENCY */
-
/* Success */
return (0);
}
C_MAKE(s->va, h * w, byte);
C_MAKE(s->vc, h * w, char);
-#ifdef USE_TRANSPARENCY
-
/* Make the terrain access arrays */
C_MAKE(s->ta, h, byte*);
C_MAKE(s->tc, h, char*);
C_MAKE(s->vta, h * w, byte);
C_MAKE(s->vtc, h * w, char);
-#endif /* USE_TRANSPARENCY */
-
/* Prepare the window access arrays */
for (y = 0; y < h; y++)
s->a[y] = s->va + w * y;
s->c[y] = s->vc + w * y;
-#ifdef USE_TRANSPARENCY
-
s->ta[y] = s->vta + w * y;
s->tc[y] = s->vtc + w * y;
-
-#endif /* USE_TRANSPARENCY */
-
}
/* Success */
byte *s_aa = s->a[y];
char *s_cc = s->c[y];
-#ifdef USE_TRANSPARENCY
-
byte *f_taa = f->ta[y];
char *f_tcc = f->tc[y];
byte *s_taa = s->ta[y];
char *s_tcc = s->tc[y];
-#endif /* USE_TRANSPARENCY */
-
for (x = 0; x < w; x++)
{
*s_aa++ = *f_aa++;
*s_cc++ = *f_cc++;
-#ifdef USE_TRANSPARENCY
*s_taa++ = *f_taa++;
*s_tcc++ = *f_tcc++;
-#endif /* USE_TRANSPARENCY */
}
}
/* 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));
}
*/
static errr Term_curs_hack(int x, int 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(int x, int 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)
{
- /* 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
-
{
- /* 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)
*/
-#ifdef USE_TRANSPARENCY
-static errr Term_pict_hack(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp)
-#else /* USE_TRANSPARENCY */
-static errr Term_pict_hack(int x, int y, int n, const byte *ap, const char *cp)
-#endif /* USE_TRANSPARENCY */
+static errr Term_pict_hack(int x, int y, int n, const byte *ap, cptr cp, const byte *tap, cptr tcp)
{
- /* Compiler silliness */
-#ifdef USE_TRANSPARENCY
- if (x || y || n || ap || cp || tap || tcp) return (-2);
-#else /* USE_TRANSPARENCY */
- if (x || y || n || ap || cp) return (-2);
-#endif /* USE_TRANSPARENCY */
+ /* Unused */
+ (void)x;
+ (void)y;
+ (void)n;
+ (void)ap;
+ (void)cp;
+ (void)tap;
+ (void)tcp;
/* Oops */
return (-1);
*
* Assumes given location and values are valid.
*/
-#ifdef USE_TRANSPARENCY
void Term_queue_char(int x, int y, byte a, char c, byte ta, char tc)
-#else /* USE_TRANSPARENCY */
-void Term_queue_char(int x, int y, byte a, char c)
-#endif /* USE_TRANSPARENCY */
{
term_win *scrn = Term->scr;
byte *scr_aa = &scrn->a[y][x];
char *scr_cc = &scrn->c[y][x];
-#ifdef USE_TRANSPARENCY
-
byte *scr_taa = &scrn->ta[y][x];
char *scr_tcc = &scrn->tc[y][x];
if ((*scr_aa == a) && (*scr_cc == c) &&
(*scr_taa == ta) && (*scr_tcc == tc)) return;
-#else /* USE_TRANSPARENCY */
-
- /* Hack -- Ignore non-changes */
- if ((*scr_aa == a) && (*scr_cc == c)) return;
-
-#endif /* USE_TRANSPARENCY */
-
/* Save the "literal" information */
*scr_aa = a;
*scr_cc = c;
-#ifdef USE_TRANSPARENCY
-
*scr_taa = ta;
*scr_tcc = tc;
-#endif /* USE_TRANSPARENCY */
-
/* Check for new min/max row info */
if (y < Term->y1) Term->y1 = y;
if (y > Term->y2) Term->y2 = 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;
+
+#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)
+{
+
+#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;
+ char c2;
+
+ /* If non bigtile mode, call orginal function */
+ if (!use_bigtile)
+ {
+ Term_queue_char(x, y, a, c, ta, tc);
+ return;
+ }
+
+ /* A tile becomes a Bigtile */
+ if ((a & AF_TILE1) && (c & 0x80))
+ {
+ /* Mark it as a Bigtile */
+ a2 = AF_BIGTILE2;
+
+ c2 = -1;
+
+ /* Ignore non-tile background */
+ if (!((ta & AF_TILE1) && (tc & 0x80)))
+ {
+ ta = 0;
+ tc = 0;
+ }
+ }
+
+#ifdef JP
+ /*
+ * Use a multibyte character instead of a dirty pair of ASCII
+ * characters.
+ */
+ else if (' ' <= c) /* isprint(c) */
+ {
+ c2 = ascii_to_zenkaku[2 * (c - ' ') + 1];
+ c = ascii_to_zenkaku[2 * (c - ' ')];
+
+ /* Mark it as a Kanji */
+ a2 = a | AF_KANJI2;
+ a |= AF_KANJI1;
+ }
+#endif
+
+ else
+ {
+ /* Dirty pair of ASCII characters */
+ a2 = TERM_WHITE;
+ c2 = ' ';
+ }
+
+ /* Display pair of attr/char */
+ Term_queue_char(x, y, a, c, ta, tc);
+ Term_queue_char(x + 1, y, a2, c2, 0, 0);
}
* This function is designed to be fast, with no consistancy checking.
* It is used to update the map in the game.
*/
-#ifdef USE_TRANSPARENCY
void Term_queue_line(int x, int y, int n, byte *a, char *c, byte *ta, char *tc)
-#else /* USE_TRANSPARENCY */
-void Term_queue_line(int x, int y, int n, byte *a, char *c)
-#endif /* USE_TRANSPARENCY */
{
term_win *scrn = Term->scr;
byte *scr_aa = &scrn->a[y][x];
char *scr_cc = &scrn->c[y][x];
-#ifdef USE_TRANSPARENCY
-
byte *scr_taa = &scrn->ta[y][x];
char *scr_tcc = &scrn->tc[y][x];
-#endif /* USE_TRANSPARENCY */
-
while (n--)
{
-
-#ifdef USE_TRANSPARENCY
-
/* Hack -- Ignore non-changes */
if ((*scr_aa == *a) && (*scr_cc == *c) &&
- (*scr_taa == *ta) && (*scr_tcc == *tc))
+ (*scr_taa == *ta) && (*scr_tcc == *tc))
{
x++;
a++;
*scr_taa++ = *ta++;
*scr_tcc++ = *tc++;
-#else /* USE_TRANSPARENCY */
-
- /* Hack -- Ignore non-changes */
- if ((*scr_aa == *a) && (*scr_cc == *c))
- {
- x++;
- a++;
- c++;
- scr_aa++;
- scr_cc++;
- continue;
- }
-
-#endif /* USE_TRANSPARENCY */
-
/* Save the "literal" information */
*scr_aa++ = *a++;
*scr_cc++ = *c++;
byte *scr_aa = Term->scr->a[y];
#ifdef JP
- unsigned char *scr_cc = (unsigned char *)Term->scr->c[y];
+ char *scr_cc = Term->scr->c[y];
-#ifdef USE_TRANSPARENCY
byte *scr_taa = Term->scr->ta[y];
- unsigned char *scr_tcc = Term->scr->tc[y];
-#endif /* USE_TRANSPARENCY */
-
+ char *scr_tcc = Term->scr->tc[y];
#else
char *scr_cc = Term->scr->c[y];
-#ifdef USE_TRANSPARENCY
-
byte *scr_taa = Term->scr->ta[y];
char *scr_tcc = Term->scr->tc[y];
-
-#endif /* USE_TRANSPARENCY */
#endif
#ifdef JP
- /* ɽ¼¨Ê¸»ú¤Ê¤· */
- if (n == 0 || *s == 0) return;
- /*
- * Á´³Ñʸ»ú¤Î±¦È¾Ê¬¤«¤éʸ»ú¤òɽ¼¨¤¹¤ë¾ì¹ç¡¢
- * ½Å¤Ê¤Ã¤¿Ê¸»ú¤Îº¸Éôʬ¤ò¾Ãµî¡£
- * ɽ¼¨³«»Ï°ÌÃÖ¤¬º¸Ã¼¤Ç¤Ê¤¤¤È²¾Äê¡£
- */
- if (scr_aa[x] & KANJI2)
- {
- scr_cc[x - 1] = ' ';
- scr_aa[x - 1] &= KANJIC;
- x1 = x2 = x - 1;
- }
+ /* 表示文字なし */
+ if (n == 0 || *s == 0) return;
+ /*
+ * 全角文字の右半分から文字を表示する場合、
+ * 重なった文字の左部分を消去。
+ * 表示開始位置が左端でないと仮定。
+ */
+ if ((scr_aa[x] & AF_KANJI2) && (scr_aa[x] & AF_BIGTILE2) != AF_BIGTILE2)
+ {
+ scr_cc[x - 1] = ' ';
+ scr_aa[x - 1] &= AF_KANJIC;
+ x1 = x2 = x - 1;
+ }
#endif
/* Queue the attr/chars */
for ( ; n; x++, s++, n--)
{
#ifdef JP
- /* Æüìʸ»ú¤È¤·¤ÆMSB¤¬Î©¤Ã¤Æ¤¤¤ë²ÄǽÀ¤¬¤¢¤ë */
- /* ¤½¤Î¾ì¹çattr¤ÎMSB¤âΩ¤Ã¤Æ¤¤¤ë¤Î¤Ç¤³¤ì¤Ç¼±Ê̤¹¤ë */
+ /* 特殊文字としてMSBが立っている可能性がある */
+ /* その場合attrのMSBも立っているのでこれで識別する */
/* check */
- if (iskanji(*s) && !(a & 0x80))
+ if (!(a & AF_TILE1) && iskanji(*s))
{
- int nc1 = *s++;
- int nc2 = *s;
+ char nc1 = *s++;
+ char nc2 = *s;
- int na1 = (a | KANJI1);
- int na2 = (a | KANJI2);
+ byte na1 = (a | AF_KANJI1);
+ byte na2 = (a | AF_KANJI2);
if((--n == 0) || !nc2) break;
-#ifdef USE_TRANSPARENCY
+
if(scr_aa[x++] == na1 && scr_aa[x] == na2 &&
scr_cc[x - 1] == nc1 && scr_cc[x] == nc2 &&
(scr_taa[x - 1] == 0) && (scr_taa[x]==0) &&
(scr_tcc[x - 1] == 0) && (scr_tcc[x]==0) )
continue;
-#else
- if(scr_aa[x++] == na1 && scr_aa[x] == na2 &&
- scr_cc[x - 1] == nc1 && scr_cc[x] == nc2) continue;
-#endif
+
scr_aa[x - 1] = na1;
scr_aa[x] = na2;
scr_cc[x - 1] = nc1;
else
{
#endif
- int oa = scr_aa[x];
- int oc = scr_cc[x];
-
-#ifdef USE_TRANSPARENCY
+ byte oa = scr_aa[x];
+ char oc = scr_cc[x];
- int ota = scr_taa[x];
- int otc = scr_tcc[x];
+ byte ota = scr_taa[x];
+ char otc = scr_tcc[x];
/* Hack -- Ignore non-changes */
if ((oa == a) && (oc == *s) && (ota == 0) && (otc == 0)) continue;
-#else /* USE_TRANSPARENCY */
-
- /* Hack -- Ignore non-changes */
- if ((oa == a) && (oc == *s)) continue;
-
-#endif /* USE_TRANSPARENCY */
-
/* Save the "literal" information */
scr_aa[x] = a;
scr_cc[x] = *s;
-#ifdef USE_TRANSPARENCY
-
scr_taa[x] = 0;
scr_tcc[x] = 0;
-#endif /* USE_TRANSPARENCY */
-
/* Note the "range" of window updates */
if (x1 < 0) x1 = x;
x2 = x;
#ifdef JP
/*
- * Á´³Ñʸ»ú¤Îº¸È¾Ê¬¤Çɽ¼¨¤ò½ªÎ»¤¹¤ë¾ì¹ç¡¢
- * ½Å¤Ê¤Ã¤¿Ê¸»ú¤Î±¦Éôʬ¤ò¾Ãµî¡£
- * (¾ò·ïÄɲ᧥¿¥¤¥ë¤Î1ʸ»úÌܤǤʤ¤»ö¤ò³Î¤«¤á¤ë¤è¤¦¤Ë¡£)
+ * 全角文字の左半分で表示を終了する場合、
+ * 重なった文字の右部分を消去。
+ * (条件追加:タイルの1文字目でない事を確かめるように。)
*/
{
int w, h;
Term_get_size(&w, &h);
- if (x != w && !(scr_aa[x] & 0x80) && (scr_aa[x] & KANJI2))
+ if (x != w && !(scr_aa[x] & AF_TILE1) && (scr_aa[x] & AF_KANJI2))
{
scr_cc[x] = ' ';
- scr_aa[x] &= KANJIC;
+ scr_aa[x] &= AF_KANJIC;
if (x1 < 0) x1 = x;
x2 = x;
}
byte *scr_aa = Term->scr->a[y];
char *scr_cc = Term->scr->c[y];
-#ifdef USE_TRANSPARENCY
-
byte *old_taa = Term->old->ta[y];
char *old_tcc = Term->old->tc[y];
byte nta;
char ntc;
-#endif /* USE_TRANSPARENCY */
-
/* Pending length */
int fn = 0;
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 & 0x80));
+ kanji = (iskanji(nc) && !(na & AF_TILE1));
#endif
-#ifdef USE_TRANSPARENCY
ota = old_taa[x];
otc = old_tcc[x];
#ifdef JP
if ((na == oa) && (nc == oc) && (nta == ota) && (ntc == otc)
&&(!kanji || (scr_aa[x + 1] == old_aa[x + 1] &&
- scr_cc[x + 1] == old_cc[x + 1] &&
- scr_taa[x + 1] == old_taa[x + 1] &&
- scr_tcc[x + 1] == old_tcc[x + 1])))
+ scr_cc[x + 1] == old_cc[x + 1] &&
+ scr_taa[x + 1] == old_taa[x + 1] &&
+ scr_tcc[x + 1] == old_tcc[x + 1])))
#else
if ((na == oa) && (nc == oc) && (nta == ota) && (ntc == otc))
#endif
-
-
-#else /* USE_TRANSPARENCY */
-
- /* Handle unchanged grids */
-#ifdef JP
- if ((na == oa) && (nc == oc) &&
- (!kanji || (scr_aa[x + 1] == old_aa[x + 1] &&
- scr_cc[x + 1] == old_cc[x + 1])))
-#else
- if ((na == oa) && (nc == oc))
-#endif
-
-
-#endif /* USE_TRANSPARENCY */
{
/* Flush */
if (fn)
{
/* Draw pending attr/char pairs */
-#ifdef USE_TRANSPARENCY
(void)((*Term->pict_hook)(fx, y, fn,
&scr_aa[fx], &scr_cc[fx],&scr_taa[fx], &scr_tcc[fx]));
-#else /* USE_TRANSPARENCY */
- (void)((*Term->pict_hook)(fx, y, fn, &scr_aa[fx], &scr_cc[fx]));
-#endif /* USE_TRANSPARENCY */
/* Forget */
fn = 0;
}
#ifdef JP
- /* Á´³Ñʸ»ú¤Î»þ¤ÏºÆ³«°ÌÃ֤ϡܣ± */
+ /* 全角文字の時は再開位置は+1 */
if(kanji)
{
x++;
old_aa[x] = na;
old_cc[x] = nc;
-#ifdef USE_TRANSPARENCY
old_taa[x] = nta;
old_tcc[x] = ntc;
-#endif /* USE_TRANSPARENCY */
/* Restart and Advance */
if (fn++ == 0) fx = x;
if (fn)
{
/* Draw pending attr/char pairs */
-#ifdef USE_TRANSPARENCY
(void)((*Term->pict_hook)(fx, y, fn,
&scr_aa[fx], &scr_cc[fx], &scr_taa[fx], &scr_tcc[fx]));
-#else /* USE_TRANSPARENCY */
- (void)((*Term->pict_hook)(fx, y, fn, &scr_aa[fx], &scr_cc[fx]));
-#endif /* USE_TRANSPARENCY */
}
}
byte *scr_aa = Term->scr->a[y];
char *scr_cc = Term->scr->c[y];
-#ifdef USE_TRANSPARENCY
byte *old_taa = Term->old->ta[y];
char *old_tcc = Term->old->tc[y];
byte *scr_taa = Term->scr->ta[y];
char otc;
byte nta;
char ntc;
-#endif /* USE_TRANSPARENCY */
/* The "always_text" flag */
int always_text = Term->always_text;
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 & 0x80));
+ kanji = (iskanji(nc) && !(na & AF_TILE1));
#endif
-#ifdef USE_TRANSPARENCY
ota = old_taa[x];
otc = old_tcc[x];
#ifdef JP
if ((na == oa) && (nc == oc) && (nta == ota) && (ntc == otc)&&
(!kanji || (scr_aa[x + 1] == old_aa[x + 1] &&
- scr_cc[x + 1] == old_cc[x + 1] &&
- scr_taa[x + 1] == old_taa[x + 1] &&
- scr_tcc[x + 1] == old_tcc[x + 1])))
+ scr_cc[x + 1] == old_cc[x + 1] &&
+ scr_taa[x + 1] == old_taa[x + 1] &&
+ scr_tcc[x + 1] == old_tcc[x + 1])))
#else
if ((na == oa) && (nc == oc) && (nta == ota) && (ntc == otc))
#endif
-
-
-#else /* USE_TRANSPARENCY */
-
- /* Handle unchanged grids */
-#ifdef JP
- if ((na == oa) && (nc == oc) &&
- (!kanji || (scr_aa[x + 1] == old_aa[x + 1] &&
- scr_cc[x + 1] == old_cc[x + 1])))
-#else
- if ((na == oa) && (nc == oc))
-#endif
-
-
-#endif /* USE_TRANSPARENCY */
-
{
/* Flush */
if (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));
}
}
#ifdef JP
- /* Á´³Ñʸ»ú¤Î»þ¤ÏºÆ³«°ÌÃ֤ϡܣ± */
+ /* 全角文字の時は再開位置は+1 */
if(kanji)
{
x++;
old_aa[x] = na;
old_cc[x] = nc;
-#ifdef USE_TRANSPARENCY
-
old_taa[x] = nta;
old_tcc[x] = ntc;
-#endif /* USE_TRANSPARENCY */
-
/* 2nd byte of bigtile */
- if (na == 255) continue;
+ if ((na & AF_BIGTILE2) == AF_BIGTILE2) continue;
/* Handle high-bit attr/chars */
- if ((na & 0x80) && (nc & 0x80))
+ if ((na & AF_TILE1) && (nc & 0x80))
{
/* Flush */
if (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));
}
fn = 0;
}
-#ifdef USE_TRANSPARENCY
-
/* Hack -- Draw the special attr/char pair */
(void)((*Term->pict_hook)(x, y, 1, &na, &nc, &nta, &ntc));
-#else /* USE_TRANSPARENCY */
-
- /* Hack -- Draw the special attr/char pair */
- (void)((*Term->pict_hook)(x, y, 1, &na, &nc));
-
-#endif /* USE_TRANSPARENCY */
-
/* Skip */
continue;
}
/* Notice new color */
#ifdef JP
- if (fa != (na & KANJIC))
+ if (fa != (na & AF_KANJIC))
#else
if (fa != na)
#endif
/* 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));
}
/* Save the new color */
#ifdef JP
- fa = (na & KANJIC);
+ fa = (na & AF_KANJIC);
#else
fa = na;
#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));
}
}
char nc;
#ifdef JP
- /* Á´³Ñʸ»ú¤Î£²¥Ð¥¤¥ÈÌܤ«¤É¤¦¤« */
+ /* 全角文字の2バイト目かどうか */
int kanji = 0;
for (x = 0; x < x1; x++)
- if (!(old_aa[x] & 0x80) && iskanji(old_cc[x]))
+ if (!(old_aa[x] & AF_TILE1) && iskanji(old_cc[x]))
{
if (x == x1 - 1)
{
#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 & 0x80));
+ kanji = (iskanji(nc) && !(na & AF_TILE1));
#endif
/* Handle unchanged grids */
#ifdef JP
if ((na == oa) && (nc == oc) &&
(!kanji || (scr_aa[x + 1] == old_aa[x + 1] &&
- scr_cc[x + 1] == old_cc[x + 1])))
+ scr_cc[x + 1] == old_cc[x + 1])))
#else
if ((na == oa) && (nc == oc))
#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++;
/* Notice new color */
#ifdef JP
- if (fa != (na & KANJIC))
+ if (fa != (na & AF_KANJIC))
#else
if (fa != na)
#endif
/* 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));
}
/* Save the new color */
#ifdef JP
- fa = (na & KANJIC);
+ fa = (na & AF_KANJIC);
#else
fa = na;
#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));
}
}
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->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)
{
byte *aa = old->a[y];
char *cc = old->c[y];
-#ifdef USE_TRANSPARENCY
-
byte *taa = old->ta[y];
char *tcc = old->tc[y];
-#endif /* USE_TRANSPARENCY */
-
/* Wipe each column */
for (x = 0; x < w; x++)
*aa++ = na;
*cc++ = nc;
-#ifdef USE_TRANSPARENCY
-
*taa++ = na;
*tcc++ = nc;
-
-#endif /* USE_TRANSPARENCY */
-
}
}
byte *old_aa = old->a[ty];
char *old_cc = old->c[ty];
-#ifdef USE_TRANSPARENCY
byte *old_taa = old->ta[ty];
char *old_tcc = old->tc[ty];
byte ota = old_taa[tx];
char otc = old_tcc[tx];
-#endif /* USE_TRANSPARENCY */
#ifdef JP
- if (tx + 1 < Term->wid && !(old_aa[tx] & 0x80)
+ if (tx + 1 < Term->wid && !(old_aa[tx] & AF_TILE1)
&& iskanji(old_cc[tx]))
csize = 2;
#endif
/* Hack -- use "Term_pict()" always */
if (Term->always_pict)
{
-#ifdef USE_TRANSPARENCY
(void)((*Term->pict_hook)(tx, ty, csize, &old_aa[tx], &old_cc[tx], &ota, &otc));
-#else /* USE_TRANSPARENCY */
- (void)((*Term->pict_hook)(tx, ty, csize, &old_aa[tx], &old_cc[tx]));
-#endif /* USE_TRANSPARENCY */
}
/* Hack -- use "Term_pict()" sometimes */
- else if (Term->higher_pict && (old_aa[tx] & 0x80) && (old_cc[tx] & 0x80))
+ else if (Term->higher_pict && (old_aa[tx] & AF_TILE1) && (old_cc[tx] & 0x80))
{
-#ifdef USE_TRANSPARENCY
(void)((*Term->pict_hook)(tx, ty, 1, &old_aa[tx], &old_cc[tx], &ota, &otc));
-#else /* USE_TRANSPARENCY */
- (void)((*Term->pict_hook)(tx, ty, 1, &old_aa[tx], &old_cc[tx]));
-#endif /* USE_TRANSPARENCY */
}
-
- /* 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, (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));
}
}
/* Draw the cursor */
if (!scr->cu && scr->cv)
{
-#ifdef CHUUKEI
- send_curs_to_chuukei_server(scr->cx, scr->cy);
+#ifdef JP
+ if ((scr->cx + 1 < w) &&
+ ((old->a[scr->cy][scr->cx + 1] & AF_BIGTILE2) == AF_BIGTILE2 ||
+ (!(old->a[scr->cy][scr->cx] & AF_TILE1) &&
+ iskanji(old->c[scr->cy][scr->cx]))))
+#else
+ if ((scr->cx + 1 < w) && (old->a[scr->cy][scr->cx + 1] & AF_BIGTILE2) == AF_BIGTILE2)
#endif
- /* Call the cursor display routine */
- (void)((*Term->curs_hook)(scr->cx, scr->cy));
+ {
+ /* Double width cursor for the Bigtile mode */
+ (void)((*Term->bigcurs_hook)(scr->cx, scr->cy));
+ }
+ else
+ {
+ /* Call the cursor display routine */
+ (void)((*Term->curs_hook)(scr->cx, scr->cy));
+ }
}
}
/* 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 (!c) return (-2);
/* Queue it for later */
-#ifdef USE_TRANSPARENCY
Term_queue_char(x, y, a, c, 0, 0);
-#else /* USE_TRANSPARENCY */
- Term_queue_char(x, y, a, c);
-#endif /* USE_TRANSPARENCY */
/* Success */
return (0);
if (!c) return (-2);
/* Queue the given character for display */
-#ifdef USE_TRANSPARENCY
Term_queue_char(Term->scr->cx, Term->scr->cy, a, c, 0, 0);
-#else /* USE_TRANSPARENCY */
- Term_queue_char(Term->scr->cx, Term->scr->cy, a, c);
-#endif /* USE_TRANSPARENCY */
/* Advance the cursor */
Term->scr->cx++;
/*
+ * Bigtile version of Term_addch().
+ *
+ * If use_bigtile is FALSE, simply call Term_addch() .
+ *
+ * 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)
+{
+ if (!use_bigtile) return Term_addch(a, c);
+
+ /* Handle "unusable" cursor */
+ if (Term->scr->cu) return (-1);
+
+ /* Paranoia -- no illegal chars */
+ if (!c) return (-2);
+
+ /* Queue the given character for display */
+ Term_queue_bigchar(Term->scr->cx, Term->scr->cy, a, c, 0, 0);
+
+ /* Advance the cursor */
+ Term->scr->cx += 2;
+
+ /* Success */
+ if (Term->scr->cx < Term->wid) return (0);
+
+ /* Note "Useless" cursor */
+ Term->scr->cu = 1;
+
+ /* Note "Useless" cursor */
+ return (1);
+}
+
+
+/*
* At the current location, using an attr, add a string
*
* We also take a length "n", using negative values to imply
byte *scr_aa;
char *scr_cc;
-#ifdef USE_TRANSPARENCY
byte *scr_taa;
char *scr_tcc;
-#endif /* USE_TRANSPARENCY */
/* Place cursor */
if (Term_gotoxy(x, y)) return (-1);
scr_aa = Term->scr->a[y];
scr_cc = Term->scr->c[y];
-#ifdef USE_TRANSPARENCY
scr_taa = Term->scr->ta[y];
scr_tcc = Term->scr->tc[y];
-#endif /* USE_TRANSPARENCY */
#ifdef JP
- /*
- * Á´³Ñʸ»ú¤Î±¦È¾Ê¬¤«¤éʸ»ú¤òɽ¼¨¤¹¤ë¾ì¹ç¡¢
- * ½Å¤Ê¤Ã¤¿Ê¸»ú¤Îº¸Éôʬ¤ò¾Ãµî¡£
- */
- if (n > 0 && (scr_aa[x] & KANJI2))
+ /*
+ * 全角文字の右半分から文字を表示する場合、
+ * 重なった文字の左部分を消去。
+ */
+ if (n > 0 && (((scr_aa[x] & AF_KANJI2) && !(scr_aa[x] & AF_TILE1))
+ || (scr_aa[x] & AF_BIGTILE2) == AF_BIGTILE2))
#else
- if (n > 0 && (byte)scr_cc[x] == 255 && scr_aa[x] == 255)
+ if (n > 0 && (scr_aa[x] & AF_BIGTILE2) == AF_BIGTILE2)
#endif
- {
- x--;
- n++;
- }
+ {
+ x--;
+ n++;
+ }
/* Scan every column */
for (i = 0; i < n; i++, x++)
if ((oa == na) && (oc == nc)) continue;
#ifdef JP
- /*
- * Á´³Ñʸ»ú¤Îº¸È¾Ê¬¤Çɽ¼¨¤ò½ªÎ»¤¹¤ë¾ì¹ç¡¢
- * ½Å¤Ê¤Ã¤¿Ê¸»ú¤Î±¦Éôʬ¤ò¾Ãµî¡£
+ /*
+ * 全角文字の左半分で表示を終了する場合、
+ * 重なった文字の右部分を消去。
*
* 2001/04/29 -- Habu
- * ¹Ô¤Î±¦Ã¼¤Î¾ì¹ç¤Ï¤³¤Î½èÍý¤ò¤·¤Ê¤¤¤è¤¦¤Ë½¤Àµ¡£
- */
- if ((oa & KANJI1) && (i + 1) == n && x != w - 1)
- n++;
+ * 行の右端の場合はこの処理をしないように修正。
+ */
+ if ((oa & AF_KANJI1) && (i + 1) == n && x != w - 1)
+ n++;
#endif
/* Save the "literal" information */
scr_aa[x] = na;
scr_cc[x] = nc;
-#ifdef USE_TRANSPARENCY
scr_taa[x] = 0;
scr_tcc[x] = 0;
-#endif /* USE_TRANSPARENCY */
/* Track minimum changed column */
if (x1 < 0) x1 = x;
byte *scr_aa = Term->scr->a[y];
char *scr_cc = Term->scr->c[y];
-#ifdef USE_TRANSPARENCY
byte *scr_taa = Term->scr->ta[y];
char *scr_tcc = Term->scr->tc[y];
-#endif /* USE_TRANSPARENCY */
/* Wipe each column */
for (x = 0; x < w; x++)
scr_aa[x] = na;
scr_cc[x] = nc;
-#ifdef USE_TRANSPARENCY
scr_taa[x] = 0;
scr_tcc[x] = 0;
-#endif /* USE_TRANSPARENCY */
-
}
/* This row has changed */
if (x1j > 0)
{
- if (Term->scr->a[i][x1j] & KANJI2) x1j--;
+ if (Term->scr->a[i][x1j] & AF_KANJI2) x1j--;
}
if (x2j < Term->wid - 1)
{
- if (Term->scr->a[i][x2j] & KANJI1) x2j++;
+ if (Term->scr->a[i][x2j] & AF_KANJI1) x2j++;
}
Term->x1[i] = x1j;
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);
}