Tíquete #24043

X11版で、使用するフォントによってカーソルの一部が消去しきれずに残る

: 2011-01-08 20:09 Última Atualização: 2020-12-20 22:03

Relator:
(Anônimo)
Dono:
Tipo:
Estado:
Fechado
Componente:
(Nenhum)
Prioridade:
3
Gravidade:
5 - Medium
Resolução:
Fixed
Arquivo:
Nenhum

Details

リビジョン3083、X11版。 周りを調べる (l/x) コマンドや、ターゲットを指定する (*) コマンドで、反転色のカーソルが表示されます。 フォントによって、カーソルが移動するときに消し切れていない部分があります。 スクリーンショットhttp://www1.axfc.net/uploader/Img/so/104931.png


原因

問題は少なくとも、

  -Misc-Fixed-Medium-R-Normal--15-140-75-75-C-90-ISO8859-1
  -jis-fixed-medium-r-normal--15-145-75-75-c-160-jisx0208.1983-0
のフォントの組み合わせで確認できました。 原因は、カーソル移動後に描画し直される元の文字の描画範囲が、カーソルの描画範囲よりも小さいためだと思われます。 「カーソルを消去するとき」と「X11版で文字を描画するとき」の二つの視点から、それぞれの修正案を書いてみました。


修正案1

カーソルを消去するときの問題とみなして、カーソルがあった場所を、元の文字を描画し直す前に背景色で塗りつぶします。

z-term.c の Term_fresh() 1614行目で、元の文字を描画する処理 text_hook (X11版は main-x11.c Term_text_x11() へのポインタ) があります。 その前に text_wipe (main-x11.c Term_wipe_x11() へのポインタ) を呼び出します。 ただし、全プラットフォーム共通の部分を修正するので、問題のない環境では二度手間になってしまいます。

diff -urN hengband.orig/src/z-term.c hengband/src/z-term.c
--- hengband.orig/src/z-term.c	2009-11-05 17:22:22.000000000 +0900
+++ hengband/src/z-term.c	2011-01-02 22:46:31.452390126 +0900
@@ -1608,9 +1608,15 @@
 				(void)((*Term->pict_hook)(tx, ty, 1, &old_aa[tx], &old_cc[tx], &ota, &otc));
 			}
 
-			/* Hack -- restore the actual character */
+			/*
+			 * 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]));
 			}
 


修正案2

X11版の描画の問題とみなして、新しい文字を描画する前に古い文字を消去します。

main-x11.c の Term_text_x11() 3088行目に、この処理を入れます。 他のプラットフォームに影響はありませんが、X11版でのみ、全ての文字を描画する度に古い文字を消去することになります。 そのため、カーソルを消去する以外の用途でもこの手順を踏んでしまいます。

diff -urN hengband.orig/src/main-x11.c hengband/src/main-x11.c
--- hengband.orig/src/main-x11.c	2009-11-05 17:22:22.000000000 +0900
+++ hengband/src/main-x11.c	2011-01-06 23:25:54.020764002 +0900
@@ -3085,10 +3085,18 @@
  */
 static errr Term_text_x11(int x, int y, int n, byte a, cptr s)
 {
-	/* Draw the text */
-	Infoclr_set(clr[a]);
+	/*
+	 * 古い文字を消去して、新しい文字を描画する。
+	 * 新しい描画範囲が古い描画範囲より小さい場合に、
+	 * 上書きされなかった部分がゴミとして残るのを防ぐ。
+	 */
+
+	/* 色を色番号0(黒)に設定して、バイト数分の長さを塗りつぶす。 */
+	Infoclr_set(clr[TERM_DARK]);
+	Infofnt_text_non(x, y, "", n);
 
-	/* Draw the text */
+	/* 引数をもとに色を設定して、文字を描画する。 */
+	Infoclr_set(clr[a]);
 	Infofnt_text_std(x, y, s, n);
 
 	/* Redraw the selection if any, as it may have been obscured. (later) */

Ticket History (3/7 Histories)

2011-01-08 20:09 Updated by: None
  • New Ticket "X11版で、使用するフォントによってカーソルの一部が消去しきれずに残る" created
2011-01-11 22:10 Updated by: deskull
  • Dono Update from (Nenhum) to deskull
Comentário

報告ありがとうございます。しばらく時間が取れませんが開き次第、対策案を参考に対処してみます。

2011-03-09 00:13 Updated by: deskull
  • Resolução Update from Nenhum to Later
  • Prioridade Update from 5 - Medium to 3
Comentário

これについてもチケット http://sourceforge.jp/ticket/browse.php?group_id=541&tid=24042 と同時に解決すべき問題として扱いしばし優先度を落として保留とさせて頂きます。

2011-03-12 15:31 Updated by: None
Comentário

チケット報告者です。 簡潔ではございますが、#24042 と同様、duskell 様を含めた開発者様の方々に一任したいと思います。 ご対応に感謝申し上げます。

2013-01-03 20:17 Updated by: dis-
  • Dono Update from deskull to dis-
2013-01-03 20:17 Updated by: dis-
  • Estado Update from Aberto to Fechado
  • Ticket Close date is changed to 2013-01-03 20:17
2020-12-20 22:03 Updated by: deskull
Comentário

この件dis-氏に改めて感謝します。

Attachment File List

No attachments

Editar

Please login to add comment to this ticket » Login