glyph_info map[COLNO][ROWNO];
glyph_info bkmap[COLNO][ROWNO];
- boolean mapDirty[COLNO][ROWNO]; /* dirty flag for map */
+ boolean locDirty[COLNO][ROWNO]; /* dirty flag for map location */
+ boolean mapDirty; /* one or more map locations are dirty */
int mapMode; /* current map mode */
boolean bAsciiMode; /* switch ASCII/tiled mode */
boolean bFitToScreenMode; /* switch Fit map to screen mode on/off */
}
void
-mswin_map_stretch(HWND hWnd, LPSIZE map_size, BOOL redraw)
+mswin_map_layout(HWND hWnd, LPSIZE map_size)
{
/* check arguments */
if (!IsWindow(hWnd) || !map_size || map_size->cx <= 0
mswin_cliparound(data->xCur, data->yCur);
- if (redraw) {
- dirtyAll(data);
- InvalidateRect(hWnd, NULL, TRUE);
- }
+ // redraw all map locations
+ dirtyAll(data);
+
+ // invalidate entire map window
+ InvalidateRect(hWnd, NULL, TRUE);
}
/* set map mode */
mapSize.cx = data->tileWidth * COLNO;
mapSize.cy = data->tileHeight * ROWNO;
- mswin_map_stretch(hWnd, &mapSize, TRUE);
+ mswin_map_layout(hWnd, &mapSize);
mswin_update_inventory(); /* for perm_invent to hide/show tiles */
return oldMode;
}
+void mswin_map_update(HWND hWnd)
+{
+ PNHMapWindow data = (PNHMapWindow)GetWindowLongPtr(hWnd, GWLP_USERDATA);
+
+ if (data->mapDirty)
+ {
+ /* update back buffer */
+ HBITMAP savedBitmap = SelectObject(data->tileDC, GetNHApp()->bmpMapTiles);
+
+ for (int i = 0; i < COLNO; i++)
+ for (int j = 0; j < ROWNO; j++)
+ if (data->locDirty[i][j])
+ {
+ paint(data, i, j);
+ RECT rect;
+ nhcoord2display(data, i, j, &rect);
+ InvalidateRect(data->hWnd, &rect, FALSE);
+ }
+
+ SelectObject(data->tileDC, savedBitmap);
+ data->mapDirty = FALSE;
+ }
+
+}
+
/* register window class for map window */
void
register_map_window_class()
size.cx = data->xFrontTile * COLNO;
size.cy = data->yFrontTile * ROWNO;
}
- mswin_map_stretch(hWnd, &size, TRUE);
+ mswin_map_layout(hWnd, &size);
/* update window placement */
GetWindowRect(hWnd, &rt);
|| data->map[i][j].glyphflags != fg->glyphflags) {
data->map[i][j] = *fg;
data->bkmap[i][j] = *bg;
- data->mapDirty[i][j] = TRUE;
- RECT rect;
- nhcoord2display(data, i, j, &rect);
- InvalidateRect(data->hWnd, &rect, FALSE);
+ data->locDirty[i][j] = TRUE;
+ data->mapDirty = TRUE;
}
}
for (int y = 0; y < ROWNO; y++) {
data->map[x][y] = nul_glyphinfo;
data->bkmap[x][y] = nul_glyphinfo;
- data->mapDirty[x][y] = TRUE;
+ data->locDirty[x][y] = TRUE;
}
- InvalidateRect(data->hWnd, NULL, FALSE);
+ data->mapDirty = TRUE;
}
static void dirtyAll(PNHMapWindow data)
{
for (int i = 0; i < COLNO; i++)
for (int j = 0; j < ROWNO; j++)
- data->mapDirty[i][j] = TRUE;
-
- InvalidateRect(data->hWnd, NULL, FALSE);
+ data->locDirty[i][j] = TRUE;
+ data->mapDirty = TRUE;
}
static void dirty(PNHMapWindow data, int x, int y)
{
- data->mapDirty[x][y] = TRUE;
-
- RECT rt;
- nhcoord2display(data, x, y, &rt);
-
- InvalidateRect(data->hWnd, &rt, FALSE);
+ data->locDirty[x][y] = TRUE;
+ data->mapDirty = TRUE;
}
static void
paintTile(data, i, j, &rect);
}
- data->mapDirty[i][j] = FALSE;
+ data->locDirty[i][j] = FALSE;
}
{
PNHMapWindow data = (PNHMapWindow) GetWindowLongPtr(hWnd, GWLP_USERDATA);
- /* update back buffer */
- HBITMAP savedBitmap = SelectObject(data->tileDC, GetNHApp()->bmpMapTiles);
-
- for (int i = 0; i < COLNO; i++)
- for (int j = 0; j < ROWNO; j++)
- if (data->mapDirty[i][j])
- paint(data, i, j);
-
- SelectObject(data->tileDC, savedBitmap);
-
PAINTSTRUCT ps;
HDC hFrontBufferDC = BeginPaint(hWnd, &ps);