X11: Fix map display for hypothetical huge map

memsets don't work very well when xchar isn't char sized.
This commit is contained in:
Pasi Kallinen
2022-01-23 01:14:20 +02:00
parent d92d5f2268
commit 7b87f7b495
2 changed files with 22 additions and 18 deletions

View File

@@ -81,7 +81,7 @@ struct tile_map_info_t {
struct map_info_t { struct map_info_t {
Dimension viewport_width, /* Saved viewport size, so we can */ Dimension viewport_width, /* Saved viewport size, so we can */
viewport_height; /* clip to cursor on a resize. */ viewport_height; /* clip to cursor on a resize. */
unsigned char t_start[ROWNO], /* Starting column for new info. */ xchar t_start[ROWNO], /* Starting column for new info. */
t_stop[ROWNO]; /* Ending column for new info. */ t_stop[ROWNO]; /* Ending column for new info. */
boolean is_tile; /* true if currently using tiles */ boolean is_tile; /* true if currently using tiles */

View File

@@ -143,10 +143,10 @@ X11_print_glyph(winid window, xchar x, xchar y, const glyph_info *glyphinfo,
} }
if (update_bbox) { /* update row bbox */ if (update_bbox) { /* update row bbox */
if ((uchar) x < map_info->t_start[y]) if (x < map_info->t_start[y])
map_info->t_start[y] = (uchar) x; map_info->t_start[y] = x;
if ((uchar) x > map_info->t_stop[y]) if (x > map_info->t_stop[y])
map_info->t_stop[y] = (uchar) x; map_info->t_stop[y] = x;
} }
} }
@@ -875,18 +875,20 @@ display_map_window(struct xwindow *wp)
if ((Is_rogue_level(&u.uz) ? map_info->is_tile if ((Is_rogue_level(&u.uz) ? map_info->is_tile
: (map_info->is_tile != iflags.wc_tiled_map)) : (map_info->is_tile != iflags.wc_tiled_map))
&& map_info->tile_map.image_width) { && map_info->tile_map.image_width) {
int i;
/* changed map display mode, re-display the full map */ /* changed map display mode, re-display the full map */
(void) memset((genericptr_t) map_info->t_start, (char) 0, for (i = 0; i < ROWNO; i++) {
sizeof(map_info->t_start)); map_info->t_start[i] = 0;
(void) memset((genericptr_t) map_info->t_stop, (char) (COLNO - 1), map_info->t_stop[i] = COLNO-1;
sizeof(map_info->t_stop)); }
map_info->is_tile = iflags.wc_tiled_map && !Is_rogue_level(&u.uz); map_info->is_tile = iflags.wc_tiled_map && !Is_rogue_level(&u.uz);
XClearWindow(XtDisplay(wp->w), XtWindow(wp->w)); XClearWindow(XtDisplay(wp->w), XtWindow(wp->w));
set_map_size(wp, COLNO, ROWNO); set_map_size(wp, COLNO, ROWNO);
check_cursor_visibility(wp); check_cursor_visibility(wp);
highlight_yn(TRUE); /* change fg/bg to match map */ highlight_yn(TRUE); /* change fg/bg to match map */
} else if (wp->prevx != wp->cursx || wp->prevy != wp->cursy) { } else if (wp->prevx != wp->cursx || wp->prevy != wp->cursy) {
register unsigned int x = wp->prevx, y = wp->prevy; register xchar x = wp->prevx, y = wp->prevy;
/* /*
* Previous cursor position is not the same as the current * Previous cursor position is not the same as the current
@@ -954,15 +956,16 @@ void
clear_map_window(struct xwindow *wp) clear_map_window(struct xwindow *wp)
{ {
struct map_info_t *map_info = wp->map_information; struct map_info_t *map_info = wp->map_information;
int i;
/* update both tile and text backing store, then update */ /* update both tile and text backing store, then update */
map_all_unexplored(map_info); map_all_unexplored(map_info);
/* force a full update */ /* force a full update */
(void) memset((genericptr_t) map_info->t_start, (char) 0, for (i = 0; i < ROWNO; i++) {
sizeof map_info->t_start); map_info->t_start[i] = 0;
(void) memset((genericptr_t) map_info->t_stop, (char) COLNO - 1, map_info->t_stop[i] = COLNO-1;
sizeof map_info->t_stop); }
display_map_window(wp); display_map_window(wp);
} }
@@ -1470,6 +1473,7 @@ create_map_window(struct xwindow *wp,
#if 0 #if 0
int screen_width, screen_height; int screen_width, screen_height;
#endif #endif
int i;
wp->type = NHW_MAP; wp->type = NHW_MAP;
@@ -1539,10 +1543,10 @@ create_map_window(struct xwindow *wp,
map_info->viewport_width = map_info->viewport_height = 0; map_info->viewport_width = map_info->viewport_height = 0;
/* reset the "new entry" indicators */ /* reset the "new entry" indicators */
(void) memset((genericptr_t) map_info->t_start, (char) COLNO, for (i = 0; i < ROWNO; i++) {
sizeof (map_info->t_start)); map_info->t_start[i] = COLNO;
(void) memset((genericptr_t) map_info->t_stop, (char) 0, map_info->t_stop[i] = 0;
sizeof (map_info->t_stop)); }
/* we probably want to restrict this to the 1st map window only */ /* we probably want to restrict this to the 1st map window only */
map_info->is_tile = (init_tiles(wp) && iflags.wc_tiled_map); map_info->is_tile = (init_tiles(wp) && iflags.wc_tiled_map);