--- a/src/viewport.cpp Wed Jun 13 11:17:30 2007 +0000
+++ b/src/viewport.cpp Wed Jun 13 11:45:14 2007 +0000
@@ -26,6 +26,8 @@
#define VIEWPORT_DRAW_MEM (65536 * 2)
+ZoomLevel _saved_scrollpos_zoom;
+
/* XXX - maximum viewports is maximum windows - 2 (main toolbar + status bar) */
static ViewPort _viewports[25 - 2];
static uint32 _active_viewports; ///< bitmasked variable where each bit signifies if a viewport is in use or not
@@ -143,7 +145,7 @@
}
void AssignWindowViewport(Window *w, int x, int y,
- int width, int height, uint32 follow_flags, byte zoom)
+ int width, int height, uint32 follow_flags, ZoomLevel zoom)
{
ViewPort *vp;
Point pt;
@@ -162,8 +164,8 @@
vp->zoom = zoom;
- vp->virtual_width = width << zoom;
- vp->virtual_height = height << zoom;
+ vp->virtual_width = ScaleByZoom(width, zoom);
+ vp->virtual_height = ScaleByZoom(height, zoom);
if (follow_flags & 0x80000000) {
const Vehicle *veh;
@@ -267,10 +269,10 @@
vp->virtual_left = x;
vp->virtual_top = y;
- old_left >>= vp->zoom;
- old_top >>= vp->zoom;
- x >>= vp->zoom;
- y >>= vp->zoom;
+ old_left = UnScaleByZoom(old_left, vp->zoom);
+ old_top = UnScaleByZoom(old_top, vp->zoom);
+ x = UnScaleByZoom(x, vp->zoom);
+ y = UnScaleByZoom(y, vp->zoom);
old_left -= x;
old_top -= y;
@@ -331,8 +333,8 @@
return pt;
}
- x = ((x << vp->zoom) + vp->virtual_left) >> 2;
- y = ((y << vp->zoom) + vp->virtual_top) >> 1;
+ x = (ScaleByZoom(x, vp->zoom) + vp->virtual_left) >> 2;
+ y = (ScaleByZoom(y, vp->zoom) + vp->virtual_top) >> 1;
a = y-x;
b = y+x;
@@ -404,10 +406,10 @@
* @param widget_zoom_out widget index for window with zoom-out button */
void HandleZoomMessage(Window *w, const ViewPort *vp, byte widget_zoom_in, byte widget_zoom_out)
{
- SetWindowWidgetDisabledState(w, widget_zoom_in, vp->zoom == 0);
+ SetWindowWidgetDisabledState(w, widget_zoom_in, vp->zoom == ZOOM_LVL_MIN);
InvalidateWidget(w, widget_zoom_in);
- SetWindowWidgetDisabledState(w, widget_zoom_out, vp->zoom == 2);
+ SetWindowWidgetDisabledState(w, widget_zoom_out, vp->zoom == ZOOM_LVL_MAX);
InvalidateWidget(w, widget_zoom_out);
}
@@ -669,7 +671,7 @@
z += TILE_HEIGHT;
if (ti->tileh == SLOPE_STEEP_N) z += TILE_HEIGHT;
}
- DrawGroundSpriteAt(_cur_dpi->zoom != 2 ? SPR_DOT : SPR_DOT_SMALL, PAL_NONE, ti->x, ti->y, z);
+ DrawGroundSpriteAt(_cur_dpi->zoom <= ZOOM_LVL_DETAIL ? SPR_DOT : SPR_DOT_SMALL, PAL_NONE, ti->x, ti->y, z);
} else if (_thd.drawstyle & HT_RAIL /*&& _thd.place_mode == VHM_RAIL*/) {
/* autorail highlight piece under cursor */
uint type = _thd.drawstyle & 0xF;
@@ -799,7 +801,7 @@
Town *t;
int left, top, right, bottom;
- if (!(_display_opt & DO_SHOW_TOWN_NAMES) || _game_mode == GM_MENU)
+ if (!HASBIT(_display_opt, DO_SHOW_TOWN_NAMES) || _game_mode == GM_MENU)
return;
left = dpi->left;
@@ -808,7 +810,7 @@
bottom = top + dpi->height;
switch (dpi->zoom) {
- case 0:
+ case ZOOM_LVL_NORMAL:
FOR_ALL_TOWNS(t) {
if (bottom > t->sign.top &&
top < t->sign.top + 12 &&
@@ -821,7 +823,7 @@
}
break;
- case 1:
+ case ZOOM_LVL_OUT_2X:
right += 2;
bottom += 2;
@@ -837,21 +839,26 @@
}
break;
- default: NOT_REACHED();
- case 2:
- right += 4;
- bottom += 5;
+ case ZOOM_LVL_OUT_4X:
+ case ZOOM_LVL_OUT_8X:
+ right += ScaleByZoom(1, dpi->zoom);
+ bottom += ScaleByZoom(1, dpi->zoom) + 1;
FOR_ALL_TOWNS(t) {
if (bottom > t->sign.top &&
- top < t->sign.top + 24 &&
+ top < t->sign.top + ScaleByZoom(12, dpi->zoom) &&
right > t->sign.left &&
- left < t->sign.left + t->sign.width_2*4) {
+ left < t->sign.left + ScaleByZoom(t->sign.width_2, dpi->zoom)) {
AddStringToDraw(t->sign.left + 5, t->sign.top + 1, STR_TOWN_LABEL_TINY_BLACK, t->index, 0);
AddStringToDraw(t->sign.left + 1, t->sign.top - 3, STR_TOWN_LABEL_TINY_WHITE, t->index, 0);
}
}
break;
+
+ case ZOOM_LVL_OUT_16X:
+ break;
+
+ default: NOT_REACHED();
}
}
@@ -873,7 +880,7 @@
int left, top, right, bottom;
const Station *st;
- if (!(_display_opt & DO_SHOW_STATION_NAMES) || _game_mode == GM_MENU)
+ if (!HASBIT(_display_opt, DO_SHOW_STATION_NAMES) || _game_mode == GM_MENU)
return;
left = dpi->left;
@@ -882,7 +889,7 @@
bottom = top + dpi->height;
switch (dpi->zoom) {
- case 0:
+ case ZOOM_LVL_NORMAL:
FOR_ALL_STATIONS(st) {
if (bottom > st->sign.top &&
top < st->sign.top + 12 &&
@@ -893,7 +900,7 @@
}
break;
- case 1:
+ case ZOOM_LVL_OUT_2X:
right += 2;
bottom += 2;
FOR_ALL_STATIONS(st) {
@@ -906,19 +913,25 @@
}
break;
- default: NOT_REACHED();
- case 2:
- right += 4;
- bottom += 5;
+ case ZOOM_LVL_OUT_4X:
+ case ZOOM_LVL_OUT_8X:
+ right += ScaleByZoom(1, dpi->zoom);
+ bottom += ScaleByZoom(1, dpi->zoom) + 1;
+
FOR_ALL_STATIONS(st) {
if (bottom > st->sign.top &&
- top < st->sign.top + 24 &&
+ top < st->sign.top + ScaleByZoom(12, dpi->zoom) &&
right > st->sign.left &&
- left < st->sign.left + st->sign.width_2*4) {
+ left < st->sign.left + ScaleByZoom(st->sign.width_2, dpi->zoom)) {
AddStation(st, STR_STATION_SIGN_TINY, st->sign.width_2 | 0x8000);
}
}
break;
+
+ case ZOOM_LVL_OUT_16X:
+ break;
+
+ default: NOT_REACHED();
}
}
@@ -940,7 +953,7 @@
const Sign *si;
int left, top, right, bottom;
- if (!(_display_opt & DO_SHOW_SIGNS))
+ if (!HASBIT(_display_opt, DO_SHOW_SIGNS))
return;
left = dpi->left;
@@ -949,7 +962,7 @@
bottom = top + dpi->height;
switch (dpi->zoom) {
- case 0:
+ case ZOOM_LVL_NORMAL:
FOR_ALL_SIGNS(si) {
if (bottom > si->sign.top &&
top < si->sign.top + 12 &&
@@ -960,7 +973,7 @@
}
break;
- case 1:
+ case ZOOM_LVL_OUT_2X:
right += 2;
bottom += 2;
FOR_ALL_SIGNS(si) {
@@ -973,19 +986,25 @@
}
break;
- default: NOT_REACHED();
- case 2:
- right += 4;
- bottom += 5;
+ case ZOOM_LVL_OUT_4X:
+ case ZOOM_LVL_OUT_8X:
+ right += ScaleByZoom(1, dpi->zoom);
+ bottom += ScaleByZoom(1, dpi->zoom) + 1;
+
FOR_ALL_SIGNS(si) {
if (bottom > si->sign.top &&
- top < si->sign.top + 24 &&
+ top < si->sign.top + ScaleByZoom(12, dpi->zoom) &&
right > si->sign.left &&
- left < si->sign.left + si->sign.width_2 * 4) {
+ left < si->sign.left + ScaleByZoom(si->sign.width_2, dpi->zoom)) {
AddSign(si, STR_2002, si->sign.width_2 | 0x8000);
}
}
break;
+
+ case ZOOM_LVL_OUT_16X:
+ break;
+
+ default: NOT_REACHED();
}
}
@@ -1007,7 +1026,7 @@
const Waypoint *wp;
int left, top, right, bottom;
- if (!(_display_opt & DO_WAYPOINTS))
+ if (!HASBIT(_display_opt, DO_WAYPOINTS))
return;
left = dpi->left;
@@ -1016,7 +1035,7 @@
bottom = top + dpi->height;
switch (dpi->zoom) {
- case 0:
+ case ZOOM_LVL_NORMAL:
FOR_ALL_WAYPOINTS(wp) {
if (bottom > wp->sign.top &&
top < wp->sign.top + 12 &&
@@ -1027,7 +1046,7 @@
}
break;
- case 1:
+ case ZOOM_LVL_OUT_2X:
right += 2;
bottom += 2;
FOR_ALL_WAYPOINTS(wp) {
@@ -1040,19 +1059,25 @@
}
break;
- default: NOT_REACHED();
- case 2:
- right += 4;
- bottom += 5;
+ case ZOOM_LVL_OUT_4X:
+ case ZOOM_LVL_OUT_8X:
+ right += ScaleByZoom(1, dpi->zoom);
+ bottom += ScaleByZoom(1, dpi->zoom) + 1;
+
FOR_ALL_WAYPOINTS(wp) {
if (bottom > wp->sign.top &&
- top < wp->sign.top + 24 &&
+ top < wp->sign.top + ScaleByZoom(12, dpi->zoom) &&
right > wp->sign.left &&
- left < wp->sign.left + wp->sign.width_2*4) {
+ left < wp->sign.left + ScaleByZoom(wp->sign.width_2, dpi->zoom)) {
AddWaypoint(wp, STR_WAYPOINT_VIEWPORT_TINY, wp->sign.width_2 | 0x8000);
}
}
break;
+
+ case ZOOM_LVL_OUT_16X:
+ break;
+
+ default: NOT_REACHED();
}
}
@@ -1163,25 +1188,25 @@
static void ViewportDrawStrings(DrawPixelInfo *dpi, const StringSpriteToDraw *ss)
{
DrawPixelInfo dp;
- byte zoom;
+ ZoomLevel zoom;
_cur_dpi = &dp;
dp = *dpi;
zoom = dp.zoom;
- dp.zoom = 0;
-
- dp.left >>= zoom;
- dp.top >>= zoom;
- dp.width >>= zoom;
- dp.height >>= zoom;
+ dp.zoom = ZOOM_LVL_NORMAL;
+
+ dp.left = UnScaleByZoom(dp.left, zoom);
+ dp.top = UnScaleByZoom(dp.top, zoom);
+ dp.width = UnScaleByZoom(dp.width, zoom);
+ dp.height = UnScaleByZoom(dp.height, zoom);
do {
uint16 colour;
if (ss->width != 0) {
- int x = (ss->x >> zoom) - 1;
- int y = (ss->y >> zoom) - 1;
+ int x = UnScaleByZoom(ss->x, zoom) - 1;
+ int y = UnScaleByZoom(ss->y, zoom) - 1;
int bottom = y + 11;
int w = ss->width;
@@ -1214,7 +1239,7 @@
colour = 16;
}
DrawString(
- ss->x >> zoom, (ss->y >> zoom) - (ss->width & 0x8000 ? 2 : 0),
+ UnScaleByZoom(ss->x, zoom), UnScaleByZoom(ss->y, zoom) - (ss->width & 0x8000 ? 2 : 0),
ss->string, colour
);
@@ -1239,7 +1264,7 @@
_cur_dpi = &vd.dpi;
vd.dpi.zoom = vp->zoom;
- mask = (-1) << vp->zoom;
+ mask = ScaleByZoom(-1, vp->zoom);
vd.combine_sprites = 0;
@@ -1249,8 +1274,8 @@
vd.dpi.top = top & mask;
vd.dpi.pitch = old_dpi->pitch;
- x = ((vd.dpi.left - (vp->virtual_left&mask)) >> vp->zoom) + vp->left;
- y = ((vd.dpi.top - (vp->virtual_top&mask)) >> vp->zoom) + vp->top;
+ x = UnScaleByZoom(vd.dpi.left - (vp->virtual_left & mask), vp->zoom) + vp->left;
+ y = UnScaleByZoom(vd.dpi.top - (vp->virtual_top & mask), vp->zoom) + vp->top;
vd.dpi.dst_ptr = old_dpi->dst_ptr + x - old_dpi->left + (y - old_dpi->top) * old_dpi->pitch;
@@ -1293,7 +1318,7 @@
* If we do, the sprite memory will overflow. */
static void ViewportDrawChk(const ViewPort *vp, int left, int top, int right, int bottom)
{
- if (((bottom - top) * (right - left) << (2 * vp->zoom)) > 180000) {
+ if (ScaleByZoom(bottom - top, vp->zoom) * ScaleByZoom(right - left, vp->zoom) > 180000) {
if ((bottom - top) > (right - left)) {
int t = (top + bottom) >> 1;
ViewportDrawChk(vp, left, top, right, t);
@@ -1305,10 +1330,10 @@
}
} else {
ViewportDoDraw(vp,
- ((left - vp->left) << vp->zoom) + vp->virtual_left,
- ((top - vp->top) << vp->zoom) + vp->virtual_top,
- ((right - vp->left) << vp->zoom) + vp->virtual_left,
- ((bottom - vp->top) << vp->zoom) + vp->virtual_top
+ ScaleByZoom(left - vp->left, vp->zoom) + vp->virtual_left,
+ ScaleByZoom(top - vp->top, vp->zoom) + vp->virtual_top,
+ ScaleByZoom(right - vp->left, vp->zoom) + vp->virtual_left,
+ ScaleByZoom(bottom - vp->top, vp->zoom) + vp->virtual_top
);
}
}
@@ -1396,10 +1421,10 @@
if (top >= vp->virtual_height) return;
SetDirtyBlocks(
- (left >> vp->zoom) + vp->left,
- (top >> vp->zoom) + vp->top,
- (right >> vp->zoom) + vp->left,
- (bottom >> vp->zoom) + vp->top
+ UnScaleByZoom(left, vp->zoom) + vp->left,
+ UnScaleByZoom(top, vp->zoom) + vp->top,
+ UnScaleByZoom(right, vp->zoom) + vp->left,
+ UnScaleByZoom(bottom, vp->zoom) + vp->top
);
}
@@ -1487,10 +1512,10 @@
{
const Town *t;
- if (!(_display_opt & DO_SHOW_TOWN_NAMES)) return false;
+ if (!HASBIT(_display_opt, DO_SHOW_TOWN_NAMES)) return false;
switch (vp->zoom) {
- case 0:
+ case ZOOM_LVL_NORMAL:
x = x - vp->left + vp->virtual_left;
y = y - vp->top + vp->virtual_top;
FOR_ALL_TOWNS(t) {
@@ -1504,7 +1529,7 @@
}
break;
- case 1:
+ case ZOOM_LVL_OUT_2X:
x = (x - vp->left + 1) * 2 + vp->virtual_left;
y = (y - vp->top + 1) * 2 + vp->virtual_top;
FOR_ALL_TOWNS(t) {
@@ -1518,19 +1543,26 @@
}
break;
- default:
- x = (x - vp->left + 3) * 4 + vp->virtual_left;
- y = (y - vp->top + 3) * 4 + vp->virtual_top;
+ case ZOOM_LVL_OUT_4X:
+ case ZOOM_LVL_OUT_8X:
+ x = ScaleByZoom(x - vp->left + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_left;
+ y = ScaleByZoom(y - vp->top + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_top;
+
FOR_ALL_TOWNS(t) {
if (y >= t->sign.top &&
- y < t->sign.top + 24 &&
+ y < t->sign.top + ScaleByZoom(12, vp->zoom) &&
x >= t->sign.left &&
- x < t->sign.left + t->sign.width_2 * 4) {
+ x < t->sign.left + ScaleByZoom(t->sign.width_2, vp->zoom)) {
ShowTownViewWindow(t->index);
return true;
}
}
break;
+
+ case ZOOM_LVL_OUT_16X:
+ break;
+
+ default: NOT_REACHED();
}
return false;
@@ -1541,10 +1573,10 @@
{
const Station *st;
- if (!(_display_opt & DO_SHOW_STATION_NAMES)) return false;
+ if (!HASBIT(_display_opt, DO_SHOW_STATION_NAMES)) return false;
switch (vp->zoom) {
- case 0:
+ case ZOOM_LVL_NORMAL:
x = x - vp->left + vp->virtual_left;
y = y - vp->top + vp->virtual_top;
FOR_ALL_STATIONS(st) {
@@ -1558,7 +1590,7 @@
}
break;
- case 1:
+ case ZOOM_LVL_OUT_2X:
x = (x - vp->left + 1) * 2 + vp->virtual_left;
y = (y - vp->top + 1) * 2 + vp->virtual_top;
FOR_ALL_STATIONS(st) {
@@ -1572,19 +1604,26 @@
}
break;
- default:
- x = (x - vp->left + 3) * 4 + vp->virtual_left;
- y = (y - vp->top + 3) * 4 + vp->virtual_top;
+ case ZOOM_LVL_OUT_4X:
+ case ZOOM_LVL_OUT_8X:
+ x = ScaleByZoom(x - vp->left + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_left;
+ y = ScaleByZoom(y - vp->top + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_top;
+
FOR_ALL_STATIONS(st) {
if (y >= st->sign.top &&
- y < st->sign.top + 24 &&
+ y < st->sign.top + ScaleByZoom(12, vp->zoom) &&
x >= st->sign.left &&
- x < st->sign.left + st->sign.width_2 * 4) {
+ x < st->sign.left + ScaleByZoom(st->sign.width_2, vp->zoom)) {
ShowStationViewWindow(st->index);
return true;
}
}
break;
+
+ case ZOOM_LVL_OUT_16X:
+ break;
+
+ default: NOT_REACHED();
}
return false;
@@ -1595,10 +1634,10 @@
{
const Sign *si;
- if (!(_display_opt & DO_SHOW_SIGNS) || _current_player == PLAYER_SPECTATOR) return false;
+ if (!HASBIT(_display_opt, DO_SHOW_SIGNS) || _current_player == PLAYER_SPECTATOR) return false;
switch (vp->zoom) {
- case 0:
+ case ZOOM_LVL_NORMAL:
x = x - vp->left + vp->virtual_left;
y = y - vp->top + vp->virtual_top;
FOR_ALL_SIGNS(si) {
@@ -1612,7 +1651,7 @@
}
break;
- case 1:
+ case ZOOM_LVL_OUT_2X:
x = (x - vp->left + 1) * 2 + vp->virtual_left;
y = (y - vp->top + 1) * 2 + vp->virtual_top;
FOR_ALL_SIGNS(si) {
@@ -1626,19 +1665,26 @@
}
break;
- default:
- x = (x - vp->left + 3) * 4 + vp->virtual_left;
- y = (y - vp->top + 3) * 4 + vp->virtual_top;
+ case ZOOM_LVL_OUT_4X:
+ case ZOOM_LVL_OUT_8X:
+ x = ScaleByZoom(x - vp->left + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_left;
+ y = ScaleByZoom(y - vp->top + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_top;
+
FOR_ALL_SIGNS(si) {
if (y >= si->sign.top &&
- y < si->sign.top + 24 &&
+ y < si->sign.top + ScaleByZoom(12, vp->zoom) &&
x >= si->sign.left &&
- x < si->sign.left + si->sign.width_2 * 4) {
+ x < si->sign.left + ScaleByZoom(si->sign.width_2, vp->zoom)) {
ShowRenameSignWindow(si);
return true;
}
}
break;
+
+ case ZOOM_LVL_OUT_16X:
+ break;
+
+ default: NOT_REACHED();
}
return false;
@@ -1649,10 +1695,10 @@
{
const Waypoint *wp;
- if (!(_display_opt & DO_WAYPOINTS)) return false;
+ if (!HASBIT(_display_opt, DO_WAYPOINTS)) return false;
switch (vp->zoom) {
- case 0:
+ case ZOOM_LVL_NORMAL:
x = x - vp->left + vp->virtual_left;
y = y - vp->top + vp->virtual_top;
FOR_ALL_WAYPOINTS(wp) {
@@ -1666,7 +1712,7 @@
}
break;
- case 1:
+ case ZOOM_LVL_OUT_2X:
x = (x - vp->left + 1) * 2 + vp->virtual_left;
y = (y - vp->top + 1) * 2 + vp->virtual_top;
FOR_ALL_WAYPOINTS(wp) {
@@ -1680,19 +1726,26 @@
}
break;
- default:
- x = (x - vp->left + 3) * 4 + vp->virtual_left;
- y = (y - vp->top + 3) * 4 + vp->virtual_top;
+ case ZOOM_LVL_OUT_4X:
+ case ZOOM_LVL_OUT_8X:
+ x = ScaleByZoom(x - vp->left + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_left;
+ y = ScaleByZoom(y - vp->top + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_top;
+
FOR_ALL_WAYPOINTS(wp) {
if (y >= wp->sign.top &&
- y < wp->sign.top + 24 &&
+ y < wp->sign.top + ScaleByZoom(12, vp->zoom) &&
x >= wp->sign.left &&
- x < wp->sign.left + wp->sign.width_2 * 4) {
+ x < wp->sign.left + ScaleByZoom(wp->sign.width_2, vp->zoom)) {
ShowRenameWaypointWindow(wp);
return true;
}
}
break;
+
+ case ZOOM_LVL_OUT_16X:
+ break;
+
+ default: NOT_REACHED();
}
return false;
@@ -1932,9 +1985,10 @@
}
/** highlighting tiles while only going over them with the mouse */
-void VpStartPlaceSizing(TileIndex tile, int user)
+void VpStartPlaceSizing(TileIndex tile, byte method, byte process)
{
- _thd.userdata = user;
+ _thd.select_method = method;
+ _thd.select_proc = process;
_thd.selend.x = TileX(tile) * TILE_SIZE;
_thd.selstart.x = TileX(tile) * TILE_SIZE;
_thd.selend.y = TileY(tile) * TILE_SIZE;
@@ -2392,7 +2446,8 @@
if (_special_mouse_mode != WSM_SIZING) return true;
- e.we.place.userdata = _thd.userdata;
+ e.we.place.select_method = _thd.select_method;
+ e.we.place.select_proc = _thd.select_proc;
/* stop drag mode if the window has been closed */
w = FindWindowById(_thd.window_class, _thd.window_number);
@@ -2414,7 +2469,7 @@
_special_mouse_mode = WSM_NONE;
if (_thd.next_drawstyle == HT_RECT) {
_thd.place_mode = VHM_RECT;
- } else if ((e.we.place.userdata & 0xF) == VPM_SIGNALDIRS) { // some might call this a hack... -- Dominik
+ } else if (e.we.place.select_method == VPM_SIGNALDIRS) { // some might call this a hack... -- Dominik
_thd.place_mode = VHM_RECT;
} else if (_thd.next_drawstyle & HT_LINE) {
_thd.place_mode = VHM_RAIL;