fix #H4237 - color ignored for X11 text map

Color was only being tracked for locations that had the pile of
objects flag set.  And hilite_pile made a monster on a pile take
on the color of the top object of the pile.

This restores the tracking of color for the whole map, and makes
highlighted piles be drawn in inverse like highligted pets.  The
drawing routine doesn't know the difference (but could tell, if
necessary, by testing whether the glyph is an object or a monster).

Also, variables 'inbuf', 'inptr', and 'incount' were global; limit
their scope to winmap.c.
This commit is contained in:
PatR
2016-02-08 19:01:26 -08:00
parent 67c8971253
commit a41382d308
2 changed files with 41 additions and 39 deletions

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 winmap.c $NHDT-Date: 1454977918 2016/02/09 00:31:58 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.27 $ */
/* NetHack 3.6 winmap.c $NHDT-Date: 1454986883 2016/02/09 03:01:23 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.28 $ */
/* Copyright (c) Dean Luick, 1992 */
/* NetHack may be freely redistributed. See license for details. */
@@ -102,6 +102,7 @@ int bkglyph UNUSED;
int color, och;
unsigned special;
#ifdef TEXTCOLOR
int colordif;
register unsigned char *co_ptr;
#endif
@@ -116,24 +117,22 @@ int bkglyph UNUSED;
/* Only update if we need to. */
ch_ptr = &map_info->text_map.text[y][x];
#ifdef TEXTCOLOR
co_ptr = &map_info->text_map.colors[y][x];
if (*ch_ptr != ch || *co_ptr != color)
#else
if (*ch_ptr != ch)
#endif
{
if (*ch_ptr != ch) {
*ch_ptr = ch;
#ifdef TEXTCOLOR
if ((special & MG_PET) && iflags.hilite_pet)
color += CLR_MAX;
if ((special & MG_OBJPILE) && iflags.hilite_pile)
*co_ptr = color;
#endif
if (!map_info->is_tile)
update_bbox = TRUE;
}
#ifdef TEXTCOLOR
co_ptr = &map_info->text_map.colors[y][x];
colordif = (((special & MG_PET) && iflags.hilite_pet)
|| ((special & MG_OBJPILE) && iflags.hilite_pile))
? CLR_MAX : 0;
if (*co_ptr != (uchar) (color + colordif)) {
*co_ptr = (uchar) (color + colordif);
if (!map_info->is_tile)
update_bbox = TRUE;
}
#endif
}
if (update_bbox) { /* update row bbox */
@@ -844,7 +843,8 @@ Font font;
set_color_gc(CLR_BRIGHT_CYAN, XtNbright_cyan);
set_color_gc(CLR_WHITE, XtNwhite);
#else
set_gc(wp->w, font, XtNforeground, bgpixel, &map_info->text_map.copy_gc,
set_gc(wp->w, font, XtNforeground, bgpixel,
&map_info->text_map.copy_gc,
&map_info->text_map.inv_copy_gc);
#endif
}
@@ -943,17 +943,17 @@ struct xwindow *wp;
map_all_stone(map_info);
(void) memset((genericptr_t) map_info->text_map.text, ' ',
sizeof(map_info->text_map.text));
sizeof map_info->text_map.text);
#ifdef TEXTCOLOR
(void) memset((genericptr_t) map_info->text_map.colors, NO_COLOR,
sizeof(map_info->text_map.colors));
sizeof map_info->text_map.colors);
#endif
/* force a full update */
(void) memset((genericptr_t) map_info->t_start, (char) 0,
sizeof(map_info->t_start));
sizeof map_info->t_start);
(void) memset((genericptr_t) map_info->t_stop, (char) COLNO - 1,
sizeof(map_info->t_stop));
sizeof map_info->t_stop);
display_map_window(wp);
}
@@ -978,8 +978,8 @@ struct xwindow *wp;
#ifdef VERBOSE
printf("Font information:\n");
printf("fid = %ld, direction = %d\n", fs->fid, fs->direction);
printf("first = %d, last = %d\n", fs->min_char_or_byte2,
fs->max_char_or_byte2);
printf("first = %d, last = %d\n",
fs->min_char_or_byte2, fs->max_char_or_byte2);
printf("all chars exist? %s\n", fs->all_chars_exist ? "yes" : "no");
printf("min_bounds:lb=%d rb=%d width=%d asc=%d des=%d attr=%d\n",
fs->min_bounds.lbearing, fs->min_bounds.rbearing,
@@ -990,8 +990,8 @@ struct xwindow *wp;
fs->max_bounds.width, fs->max_bounds.ascent,
fs->max_bounds.descent, fs->max_bounds.attributes);
printf("per_char = 0x%lx\n", (unsigned long) fs->per_char);
printf("Text: (max) width = %d, height = %d\n", text_map->square_width,
text_map->square_height);
printf("Text: (max) width = %d, height = %d\n",
text_map->square_width, text_map->square_height);
#endif
if (fs->min_bounds.width != fs->max_bounds.width)
@@ -1002,9 +1002,9 @@ struct xwindow *wp;
* keyhit buffer
*/
#define INBUF_SIZE 64
int inbuf[INBUF_SIZE];
int incount = 0;
int inptr = 0; /* points to valid data */
static int inbuf[INBUF_SIZE];
static int incount = 0;
static int inptr = 0; /* points to valid data */
/*
* Keyboard and button event handler for map window.
@@ -1249,8 +1249,8 @@ boolean inverted;
}
#ifdef VERBOSE_UPDATE
printf("update: [0x%x] %d %d %d %d\n", (int) wp->w, start_row, stop_row,
start_col, stop_col);
printf("update: [0x%x] %d %d %d %d\n",
(int) wp->w, start_row, stop_row, start_col, stop_col);
#endif
win_start_row = start_row;
win_start_col = start_col;
@@ -1273,8 +1273,8 @@ boolean inverted;
src_y = (tile / TILES_PER_ROW) * tile_height;
XCopyArea(dpy, tile_pixmap, XtWindow(wp->w),
tile_map->black_gc, /* no grapics_expose */
src_x, src_y, tile_width, tile_height, dest_x,
dest_y);
src_x, src_y, tile_width, tile_height,
dest_x, dest_y);
if (glyph_is_pet(glyph) && iflags.hilite_pet) {
/* draw pet annotation (a heart) */
@@ -1412,10 +1412,8 @@ Dimension cols, rows;
}
num_args = 0;
XtSetArg(args[num_args], XtNwidth, wp->pixel_width);
num_args++;
XtSetArg(args[num_args], XtNheight, wp->pixel_height);
num_args++;
XtSetArg(args[num_args], XtNwidth, wp->pixel_width); num_args++;
XtSetArg(args[num_args], XtNheight, wp->pixel_height); num_args++;
XtSetValues(wp->w, args, num_args);
}
@@ -1426,10 +1424,10 @@ struct xwindow *wp;
struct map_info_t *map_info = wp->map_information;
struct text_map_info_t *text_map = &map_info->text_map;
(void) memset((genericptr_t) text_map->text, ' ', sizeof(text_map->text));
(void) memset((genericptr_t) text_map->text, ' ', sizeof text_map->text);
#ifdef TEXTCOLOR
(void) memset((genericptr_t) text_map->colors, NO_COLOR,
sizeof(text_map->colors));
sizeof text_map->colors);
#endif
get_char_info(wp);