src/viewport.cpp
author rubidium
Fri, 04 Jul 2008 19:00:11 +0000
changeset 11118 f66e0a4ce878
parent 11019 9c818b06c54d
permissions -rw-r--r--
(svn r13676) -Fix [FS#2126]: inactive companies from old (TTD) saves could be marked active in some cases, which then loads garbage in their statistics and such.
2186
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     1
/* $Id$ */
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     2
10429
1b99254f9607 (svn r12971) -Documentation: add @file in files that missed them and add something more than whitespace as description of files that don't have a description.
rubidium
parents: 10399
diff changeset
     3
/** @file viewport.cpp Handling of all viewports.
10217
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
     4
 *
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
     5
 * \verbatim
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
     6
 * The in-game coordinate system looks like this *
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
     7
 *                                               *
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
     8
 *                    ^ Z                        *
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
     9
 *                    |                          *
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
    10
 *                    |                          *
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
    11
 *                    |                          *
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
    12
 *                    |                          *
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
    13
 *                 /     \                       *
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
    14
 *              /           \                    *
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
    15
 *           /                 \                 *
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
    16
 *        /                       \              *
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
    17
 *   X <                             > Y         *
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
    18
 * \endverbatim
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
    19
 */
6443
b8f06d8eb7be (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6432
diff changeset
    20
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    21
#include "stdafx.h"
1891
92a3b0aa0946 (svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents: 1864
diff changeset
    22
#include "openttd.h"
1299
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents: 1172
diff changeset
    23
#include "debug.h"
8615
6b91ca653bad (svn r11680) -Codechange: refactor more out of openttd.h and functions.h.
rubidium
parents: 8610
diff changeset
    24
#include "tile_cmd.h"
2662
42c11a1a0a4b (svn r3204) Make handling of clicking on vehicles a bit less ugly by avoiding function declarations in .c files and unnecessary indirection
tron
parents: 2484
diff changeset
    25
#include "gui.h"
1349
07514c2cc6d1 (svn r1853) Move spritecache function declarations into a header of their own and use SpriteID as parameter type where appropriate
tron
parents: 1309
diff changeset
    26
#include "spritecache.h"
6949
72d11a1e1e60 (svn r9609) -Codechange: Move some function prototypes out of functions.h and into landscape.h, and add a few where they didn't exist.
maedhros
parents: 6944
diff changeset
    27
#include "landscape.h"
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
    28
#include "viewport_func.h"
9281
d8cd9ac52a68 (svn r12489) -Codechange: split station.h into station_base.h and station_func.h.
rubidium
parents: 9239
diff changeset
    29
#include "station_base.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    30
#include "town.h"
9286
d446bf9f4a68 (svn r12501) -Codechange: split signs.h.
rubidium
parents: 9281
diff changeset
    31
#include "signs_base.h"
d446bf9f4a68 (svn r12501) -Codechange: split signs.h.
rubidium
parents: 9281
diff changeset
    32
#include "signs_func.h"
1542
2ca6d1624e6d (svn r2046) -Codechange: moved all waypoint code to waypoint.c/waypoint.h
truelight
parents: 1390
diff changeset
    33
#include "waypoint.h"
2159
3b634157c3b2 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2125
diff changeset
    34
#include "variables.h"
2676
2ba71e034d97 (svn r3218) -Feature: Multiheaded train engines will now stay in the same train
bjarni
parents: 2662
diff changeset
    35
#include "train.h"
7353
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7349
diff changeset
    36
#include "roadveh.h"
7982
539e32cc37ce (svn r10997) -Codechange: unify the vehicle view window. Patch by PhilSophus.
rubidium
parents: 7829
diff changeset
    37
#include "vehicle_gui.h"
7433
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents: 7374
diff changeset
    38
#include "blitter/factory.hpp"
8345
6caa3fdb972c (svn r11399) -Feature(ette): transparency settings can now be saved and thus remembered.
belugas
parents: 8320
diff changeset
    39
#include "transparency.h"
8610
17cc343a23dd (svn r11675) -Codechange: split the string types from the string functions.
rubidium
parents: 8602
diff changeset
    40
#include "strings_func.h"
8619
c2434269c3eb (svn r11684) -Codechange: split gfx.h in a type and functional header.
rubidium
parents: 8617
diff changeset
    41
#include "zoom_func.h"
8640
1e93b81e96d2 (svn r11706) -Codechange: split vehicle.h and remove another bunch of useless includes.
rubidium
parents: 8635
diff changeset
    42
#include "vehicle_func.h"
8750
fdd6054e7bae (svn r11818) -Codechange: split player.h into smaller pieces.
rubidium
parents: 8733
diff changeset
    43
#include "player_func.h"
8766
c86cfa3a7580 (svn r11834) -Codechange: only include settings_type.h if needed.
rubidium
parents: 8760
diff changeset
    44
#include "settings_type.h"
9281
d8cd9ac52a68 (svn r12489) -Codechange: split station.h into station_base.h and station_func.h.
rubidium
parents: 9239
diff changeset
    45
#include "station_func.h"
10164
3ff9e65f3d49 (svn r12695) -Codechange: only allocate window structs when needed. Based on a patch by Alberth.
rubidium
parents: 9302
diff changeset
    46
#include "core/alloc_type.hpp"
11019
9c818b06c54d (svn r13575) -Codechange: Move small vector to core since it fits better in there
skidd13
parents: 11017
diff changeset
    47
#include "core/smallvec_type.hpp"
10435
0e2b98df9707 (svn r12977) -Codechange: remove quite some redundant (duplicate) function declarations.
rubidium
parents: 10429
diff changeset
    48
#include "window_func.h"
10445
2dd7d9d0a957 (svn r12987) -Codechange: split viewport and tile selection.
rubidium
parents: 10435
diff changeset
    49
#include "tilehighlight_func.h"
10596
0ee9eba64c9c (svn r13140) -Codechange: move the gui-list-sorting out of window_gui.h so window_gui.h only needs to be included in *_gui.cpp.
rubidium
parents: 10595
diff changeset
    50
#include "window_gui.h"
10202
19da84f6725c (svn r12734) -Codechange: use a vector instead of allocating memory in a big byte array for StringSpriteToDraw.
rubidium
parents: 10164
diff changeset
    51
8760
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8750
diff changeset
    52
#include "table/sprites.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8750
diff changeset
    53
#include "table/strings.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8750
diff changeset
    54
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
    55
PlaceProc *_place_proc;
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
    56
Point _tile_fract_coords;
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
    57
ZoomLevel _saved_scrollpos_zoom;
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
    58
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    59
struct StringSpriteToDraw {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    60
	uint16 string;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    61
	uint16 color;
849
c6223dbdb202 (svn r1330) Increase size of some vars from int16 to int32 to guard against future overflows
tron
parents: 835
diff changeset
    62
	int32 x;
c6223dbdb202 (svn r1330) Increase size of some vars from int16 to int32 to guard against future overflows
tron
parents: 835
diff changeset
    63
	int32 y;
7502
71f5d2c6a605 (svn r10262) -Fix (r10258): some places that needed to be changed to uint64 were hidden/forgotten, which caused memory corruptions and that in caused all kinds of assertions to trigger.
rubidium
parents: 7433
diff changeset
    64
	uint64 params[2];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    65
	uint16 width;
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    66
};
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    67
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    68
struct TileSpriteToDraw {
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5853
diff changeset
    69
	SpriteID image;
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5853
diff changeset
    70
	SpriteID pal;
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
    71
	const SubSprite *sub;           ///< only draw a rectangular part of the sprite
849
c6223dbdb202 (svn r1330) Increase size of some vars from int16 to int32 to guard against future overflows
tron
parents: 835
diff changeset
    72
	int32 x;
c6223dbdb202 (svn r1330) Increase size of some vars from int16 to int32 to guard against future overflows
tron
parents: 835
diff changeset
    73
	int32 y;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    74
	byte z;
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    75
};
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    76
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    77
struct ChildScreenSpriteToDraw {
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5853
diff changeset
    78
	SpriteID image;
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5853
diff changeset
    79
	SpriteID pal;
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
    80
	const SubSprite *sub;           ///< only draw a rectangular part of the sprite
849
c6223dbdb202 (svn r1330) Increase size of some vars from int16 to int32 to guard against future overflows
tron
parents: 835
diff changeset
    81
	int32 x;
c6223dbdb202 (svn r1330) Increase size of some vars from int16 to int32 to guard against future overflows
tron
parents: 835
diff changeset
    82
	int32 y;
10984
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
    83
	int next;                       ///< next child to draw (-1 at the end)
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    84
};
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    85
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    86
struct ParentSpriteToDraw {
8065
1ec515080c33 (svn r11094) -Documentation: Add comments on viewport structures and change an obscure variable name to something a little more meaningfull.
belugas
parents: 8041
diff changeset
    87
	SpriteID image;                 ///< sprite to draw
1ec515080c33 (svn r11094) -Documentation: Add comments on viewport structures and change an obscure variable name to something a little more meaningfull.
belugas
parents: 8041
diff changeset
    88
	SpriteID pal;                   ///< palette to use
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
    89
	const SubSprite *sub;           ///< only draw a rectangular part of the sprite
8065
1ec515080c33 (svn r11094) -Documentation: Add comments on viewport structures and change an obscure variable name to something a little more meaningfull.
belugas
parents: 8041
diff changeset
    90
8076
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
    91
	int32 x;                        ///< screen X coordinate of sprite
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
    92
	int32 y;                        ///< screen Y coordinate of sprite
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
    93
8065
1ec515080c33 (svn r11094) -Documentation: Add comments on viewport structures and change an obscure variable name to something a little more meaningfull.
belugas
parents: 8041
diff changeset
    94
	int32 left;                     ///< minimal screen X coordinate of sprite (= x + sprite->x_offs), reference point for child sprites
1ec515080c33 (svn r11094) -Documentation: Add comments on viewport structures and change an obscure variable name to something a little more meaningfull.
belugas
parents: 8041
diff changeset
    95
	int32 top;                      ///< minimal screen Y coordinate of sprite (= y + sprite->y_offs), reference point for child sprites
1ec515080c33 (svn r11094) -Documentation: Add comments on viewport structures and change an obscure variable name to something a little more meaningfull.
belugas
parents: 8041
diff changeset
    96
1ec515080c33 (svn r11094) -Documentation: Add comments on viewport structures and change an obscure variable name to something a little more meaningfull.
belugas
parents: 8041
diff changeset
    97
	int32 xmin;                     ///< minimal world X coordinate of bounding box
1ec515080c33 (svn r11094) -Documentation: Add comments on viewport structures and change an obscure variable name to something a little more meaningfull.
belugas
parents: 8041
diff changeset
    98
	int32 xmax;                     ///< maximal world X coordinate of bounding box
1ec515080c33 (svn r11094) -Documentation: Add comments on viewport structures and change an obscure variable name to something a little more meaningfull.
belugas
parents: 8041
diff changeset
    99
	int32 ymin;                     ///< minimal world Y coordinate of bounding box
1ec515080c33 (svn r11094) -Documentation: Add comments on viewport structures and change an obscure variable name to something a little more meaningfull.
belugas
parents: 8041
diff changeset
   100
	int32 ymax;                     ///< maximal world Y coordinate of bounding box
8076
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   101
	int zmin;                       ///< minimal world Z coordinate of bounding box
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   102
	int zmax;                       ///< maximal world Z coordinate of bounding box
8065
1ec515080c33 (svn r11094) -Documentation: Add comments on viewport structures and change an obscure variable name to something a little more meaningfull.
belugas
parents: 8041
diff changeset
   103
10208
98dc9f65629e (svn r12740) -Codechange: use a vector instead of allocating memory in a byte array for ChildScreenSpriteToDraw.
rubidium
parents: 10207
diff changeset
   104
	int first_child;                ///< the first child to draw.
8076
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   105
	bool comparison_done;           ///< Used during sprite sorting: true if sprite has been compared with all other sprites
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
   106
};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   107
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   108
/* Enumeration of multi-part foundations */
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   109
enum FoundationPart {
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   110
	FOUNDATION_PART_NONE     = 0xFF,  ///< Neither foundation nor groundsprite drawn yet.
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   111
	FOUNDATION_PART_NORMAL   = 0,     ///< First part (normal foundation or no foundation)
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   112
	FOUNDATION_PART_HALFTILE = 1,     ///< Second part (halftile foundation)
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   113
	FOUNDATION_PART_END
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   114
};
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   115
10205
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   116
typedef SmallVector<TileSpriteToDraw, 64> TileSpriteToDrawVector;
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   117
typedef SmallVector<StringSpriteToDraw, 4> StringSpriteToDrawVector;
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   118
typedef SmallVector<ParentSpriteToDraw, 64> ParentSpriteToDrawVector;
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   119
typedef SmallVector<ParentSpriteToDraw*, 64> ParentSpriteToSortVector;
10208
98dc9f65629e (svn r12740) -Codechange: use a vector instead of allocating memory in a byte array for ChildScreenSpriteToDraw.
rubidium
parents: 10207
diff changeset
   120
typedef SmallVector<ChildScreenSpriteToDraw, 16> ChildScreenSpriteToDrawVector;
10202
19da84f6725c (svn r12734) -Codechange: use a vector instead of allocating memory in a big byte array for StringSpriteToDraw.
rubidium
parents: 10164
diff changeset
   121
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
   122
struct ViewportDrawer {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   123
	DrawPixelInfo dpi;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
   124
10202
19da84f6725c (svn r12734) -Codechange: use a vector instead of allocating memory in a big byte array for StringSpriteToDraw.
rubidium
parents: 10164
diff changeset
   125
	StringSpriteToDrawVector string_sprites_to_draw;
10203
766c98a973c5 (svn r12735) -Codechange: use a vector instead of allocating memory in a byte array for TileSpriteToDraw.
rubidium
parents: 10202
diff changeset
   126
	TileSpriteToDrawVector tile_sprites_to_draw;
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   127
	ParentSpriteToDrawVector parent_sprites_to_draw;
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   128
	ParentSpriteToSortVector parent_sprites_to_sort;
10208
98dc9f65629e (svn r12740) -Codechange: use a vector instead of allocating memory in a byte array for ChildScreenSpriteToDraw.
rubidium
parents: 10207
diff changeset
   129
	ChildScreenSpriteToDrawVector child_screen_sprites_to_draw;
98dc9f65629e (svn r12740) -Codechange: use a vector instead of allocating memory in a byte array for ChildScreenSpriteToDraw.
rubidium
parents: 10207
diff changeset
   130
98dc9f65629e (svn r12740) -Codechange: use a vector instead of allocating memory in a byte array for ChildScreenSpriteToDraw.
rubidium
parents: 10207
diff changeset
   131
	int *last_child;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   132
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   133
	byte combine_sprites;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   134
10208
98dc9f65629e (svn r12740) -Codechange: use a vector instead of allocating memory in a byte array for ChildScreenSpriteToDraw.
rubidium
parents: 10207
diff changeset
   135
	int foundation[FOUNDATION_PART_END];             ///< Foundation sprites (index into parent_sprites_to_draw).
98dc9f65629e (svn r12740) -Codechange: use a vector instead of allocating memory in a byte array for ChildScreenSpriteToDraw.
rubidium
parents: 10207
diff changeset
   136
	FoundationPart foundation_part;                  ///< Currently active foundation for ground sprite drawing.
98dc9f65629e (svn r12740) -Codechange: use a vector instead of allocating memory in a byte array for ChildScreenSpriteToDraw.
rubidium
parents: 10207
diff changeset
   137
	int *last_foundation_child[FOUNDATION_PART_END]; ///< Tail of ChildSprite list of the foundations. (index into child_screen_sprites_to_draw)
98dc9f65629e (svn r12740) -Codechange: use a vector instead of allocating memory in a byte array for ChildScreenSpriteToDraw.
rubidium
parents: 10207
diff changeset
   138
	Point foundation_offset[FOUNDATION_PART_END];    ///< Pixeloffset for ground sprites on the foundations.
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
   139
};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   140
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   141
static ViewportDrawer _vd;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   142
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
   143
TileHighlightData _thd;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   144
static TileInfo *_cur_ti;
10239
a66b15550485 (svn r12771) -Codechange: remove more from variables.h.
rubidium
parents: 10229
diff changeset
   145
bool _draw_bounding_boxes = false;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   146
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   147
static Point MapXYZToViewport(const ViewPort *vp, uint x, uint y, uint z)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   148
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   149
	Point p = RemapCoords(x, y, z);
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   150
	p.x -= vp->virtual_width / 2;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   151
	p.y -= vp->virtual_height / 2;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   152
	return p;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   153
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   154
5122
a68d16b055fa (svn r7202) -Codechange: Move _viewports and _active_viewports local to viewport.c and have them
Darkvater
parents: 5120
diff changeset
   155
void DeleteWindowViewport(Window *w)
a68d16b055fa (svn r7202) -Codechange: Move _viewports and _active_viewports local to viewport.c and have them
Darkvater
parents: 5120
diff changeset
   156
{
10504
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
   157
	free(w->viewport);
5122
a68d16b055fa (svn r7202) -Codechange: Move _viewports and _active_viewports local to viewport.c and have them
Darkvater
parents: 5120
diff changeset
   158
	w->viewport = NULL;
a68d16b055fa (svn r7202) -Codechange: Move _viewports and _active_viewports local to viewport.c and have them
Darkvater
parents: 5120
diff changeset
   159
}
a68d16b055fa (svn r7202) -Codechange: Move _viewports and _active_viewports local to viewport.c and have them
Darkvater
parents: 5120
diff changeset
   160
10255
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   161
/**
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   162
 * Initialize viewport of the window for use.
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   163
 * @param w Window to use/display the viewport in
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   164
 * @param x Offset of left edge of viewport with respect to left edge window \a w
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   165
 * @param y Offset of top edge of viewport with respect to top edge window \a w
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   166
 * @param width Width of the viewport
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   167
 * @param height Height of the viewport
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   168
 * @param follow_flags Flags controlling the viewport.
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   169
 *        - If bit 31 is set, the lower 16 bits are the vehicle that the viewport should follow.
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   170
 *        - If bit 31 is clear, it is a tile position.
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   171
 * @param zoom Zoomlevel to display
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   172
 */
10257
fe75471234f3 (svn r12789) -Codechange: rename AssignWindowViewport to InitializeWindowViewport because the viewport is now part of the window struct. Patch by Alberth.
rubidium
parents: 10255
diff changeset
   173
void InitializeWindowViewport(Window *w, int x, int y,
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
   174
	int width, int height, uint32 follow_flags, ZoomLevel zoom)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   175
{
10217
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
   176
	assert(w->viewport == NULL);
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
   177
10504
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
   178
	ViewportData *vp = CallocT<ViewportData>(1);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   179
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   180
	vp->left = x + w->left;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   181
	vp->top = y + w->top;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   182
	vp->width = width;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   183
	vp->height = height;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
   184
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   185
	vp->zoom = zoom;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   186
7150
2cfe4a46fa1c (svn r9885) -Fix r9846: some last bitshifts with zoom-levels that were forgotten
truelight
parents: 7149
diff changeset
   187
	vp->virtual_width = ScaleByZoom(width, zoom);
2cfe4a46fa1c (svn r9885) -Fix r9846: some last bitshifts with zoom-levels that were forgotten
truelight
parents: 7149
diff changeset
   188
	vp->virtual_height = ScaleByZoom(height, zoom);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   189
10217
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
   190
	Point pt;
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
   191
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   192
	if (follow_flags & 0x80000000) {
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   193
		const Vehicle *veh;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   194
10504
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
   195
		vp->follow_vehicle = (VehicleID)(follow_flags & 0xFFFF);
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
   196
		veh = GetVehicle(vp->follow_vehicle);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   197
		pt = MapXYZToViewport(vp, veh->x_pos, veh->y_pos, veh->z_pos);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   198
	} else {
3421
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
   199
		uint x = TileX(follow_flags) * TILE_SIZE;
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
   200
		uint y = TileY(follow_flags) * TILE_SIZE;
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   201
10504
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
   202
		vp->follow_vehicle = INVALID_VEHICLE;
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   203
		pt = MapXYZToViewport(vp, x, y, GetSlopeZ(x, y));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   204
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   205
10504
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
   206
	vp->scrollpos_x = pt.x;
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
   207
	vp->scrollpos_y = pt.y;
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
   208
	vp->dest_scrollpos_x = pt.x;
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
   209
	vp->dest_scrollpos_y = pt.y;
7226
a8650d6ecb53 (svn r9962) -Feature: Add smooth viewport scrolling. This must be enabled with patch setting 'smooth_scroll'
peter1138
parents: 7165
diff changeset
   210
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   211
	w->viewport = vp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   212
	vp->virtual_left = 0;//pt.x;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   213
	vp->virtual_top = 0;//pt.y;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   214
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   215
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   216
static Point _vp_move_offs;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   217
5137
a1f26c30fecd (svn r7219) -Fix: Several warnings by gcc introduced in r7206 which MSVC found not of a problem. Thanks Tron
Darkvater
parents: 5124
diff changeset
   218
static void DoSetViewportPosition(Window* const *wz, int left, int top, int width, int height)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   219
{
5124
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5122
diff changeset
   220
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5122
diff changeset
   221
	for (; wz != _last_z_window; wz++) {
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5122
diff changeset
   222
		const Window *w = *wz;
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5122
diff changeset
   223
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   224
		if (left + width > w->left &&
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   225
				w->left + w->width > left &&
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   226
				top + height > w->top &&
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   227
				w->top + w->height > top) {
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
   228
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   229
			if (left < w->left) {
5124
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5122
diff changeset
   230
				DoSetViewportPosition(wz, left, top, w->left - left, height);
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5122
diff changeset
   231
				DoSetViewportPosition(wz, left + (w->left - left), top, width - (w->left - left), height);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   232
				return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   233
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   234
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   235
			if (left + width > w->left + w->width) {
5124
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5122
diff changeset
   236
				DoSetViewportPosition(wz, left, top, (w->left + w->width - left), height);
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5122
diff changeset
   237
				DoSetViewportPosition(wz, left + (w->left + w->width - left), top, width - (w->left + w->width - left) , height);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   238
				return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   239
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   240
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   241
			if (top < w->top) {
5124
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5122
diff changeset
   242
				DoSetViewportPosition(wz, left, top, width, (w->top - top));
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5122
diff changeset
   243
				DoSetViewportPosition(wz, left, top + (w->top - top), width, height - (w->top - top));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   244
				return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   245
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   246
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   247
			if (top + height > w->top + w->height) {
5124
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5122
diff changeset
   248
				DoSetViewportPosition(wz, left, top, width, (w->top + w->height - top));
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5122
diff changeset
   249
				DoSetViewportPosition(wz, left, top + (w->top + w->height - top), width , height - (w->top + w->height - top));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   250
				return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   251
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   252
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   253
			return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   254
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   255
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   256
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   257
	{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   258
		int xo = _vp_move_offs.x;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   259
		int yo = _vp_move_offs.y;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   260
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   261
		if (abs(xo) >= width || abs(yo) >= height) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   262
			/* fully_outside */
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   263
			RedrawScreenRect(left, top, left + width, top + height);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   264
			return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   265
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   266
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   267
		GfxScroll(left, top, width, height, xo, yo);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   268
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   269
		if (xo > 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   270
			RedrawScreenRect(left, top, xo + left, top + height);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   271
			left += xo;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   272
			width -= xo;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   273
		} else if (xo < 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   274
			RedrawScreenRect(left+width+xo, top, left+width, top + height);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   275
			width += xo;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   276
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   277
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   278
		if (yo > 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   279
			RedrawScreenRect(left, top, width+left, top + yo);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   280
		} else if (yo < 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   281
			RedrawScreenRect(left, top + height + yo, width+left, top + height);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   282
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   283
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   284
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   285
4171
3fadda3afe70 (svn r5609) CodeChange : Apply coding style
belugas
parents: 4164
diff changeset
   286
static void SetViewportPosition(Window *w, int x, int y)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   287
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   288
	ViewPort *vp = w->viewport;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   289
	int old_left = vp->virtual_left;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   290
	int old_top = vp->virtual_top;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   291
	int i;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   292
	int left, top, width, height;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   293
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   294
	vp->virtual_left = x;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   295
	vp->virtual_top = y;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   296
8401
3b1db2134a9e (svn r11456) -Fix [FS#1412] (r10070): Viewport is bound to its top-left corner
smatz
parents: 8385
diff changeset
   297
	/* viewport is bound to its left top corner, so it must be rounded down (UnScaleByZoomLower)
3b1db2134a9e (svn r11456) -Fix [FS#1412] (r10070): Viewport is bound to its top-left corner
smatz
parents: 8385
diff changeset
   298
	 * else glitch described in FS#1412 will happen (offset by 1 pixel with zoom level > NORMAL)
3b1db2134a9e (svn r11456) -Fix [FS#1412] (r10070): Viewport is bound to its top-left corner
smatz
parents: 8385
diff changeset
   299
	 */
3b1db2134a9e (svn r11456) -Fix [FS#1412] (r10070): Viewport is bound to its top-left corner
smatz
parents: 8385
diff changeset
   300
	old_left = UnScaleByZoomLower(old_left, vp->zoom);
3b1db2134a9e (svn r11456) -Fix [FS#1412] (r10070): Viewport is bound to its top-left corner
smatz
parents: 8385
diff changeset
   301
	old_top = UnScaleByZoomLower(old_top, vp->zoom);
3b1db2134a9e (svn r11456) -Fix [FS#1412] (r10070): Viewport is bound to its top-left corner
smatz
parents: 8385
diff changeset
   302
	x = UnScaleByZoomLower(x, vp->zoom);
3b1db2134a9e (svn r11456) -Fix [FS#1412] (r10070): Viewport is bound to its top-left corner
smatz
parents: 8385
diff changeset
   303
	y = UnScaleByZoomLower(y, vp->zoom);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   304
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   305
	old_left -= x;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   306
	old_top -= y;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   307
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   308
	if (old_top == 0 && old_left == 0) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   309
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   310
	_vp_move_offs.x = old_left;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   311
	_vp_move_offs.y = old_top;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   312
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   313
	left = vp->left;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   314
	top = vp->top;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   315
	width = vp->width;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   316
	height = vp->height;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   317
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   318
	if (left < 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   319
		width += left;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   320
		left = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   321
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   322
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   323
	i = left + width - _screen.width;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   324
	if (i >= 0) width -= i;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   325
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   326
	if (width > 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   327
		if (top < 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   328
			height += top;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   329
			top = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   330
		}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
   331
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   332
		i = top + height - _screen.height;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   333
		if (i >= 0) height -= i;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   334
5124
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5122
diff changeset
   335
		if (height > 0) DoSetViewportPosition(FindWindowZPosition(w) + 1, left, top, width, height);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   336
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   337
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   338
10255
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   339
/**
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   340
 * Is a xy position inside the viewport of the window?
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   341
 * @param w Window to examine its viewport
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   342
 * @param x X coordinate of the xy position
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   343
 * @param y Y coordinate of the xy position
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   344
 * @return Pointer to the viewport if the xy position is in the viewport of the window,
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   345
 *         otherwise \c NULL is returned.
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
   346
 */
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   347
ViewPort *IsPtInWindowViewport(const Window *w, int x, int y)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   348
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   349
	ViewPort *vp = w->viewport;
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   350
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   351
	if (vp != NULL &&
9058
b9c3fec968b8 (svn r12140) -Codechange: A bit of code style fixes(Geektoo).
belugas
parents: 8969
diff changeset
   352
			IsInsideMM(x, vp->left, vp->left + vp->width) &&
8450
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8447
diff changeset
   353
			IsInsideMM(y, vp->top, vp->top + vp->height))
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   354
		return vp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   355
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   356
	return NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   357
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   358
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   359
static Point TranslateXYToTileCoord(const ViewPort *vp, int x, int y)
1095
90220990fd7c (svn r1596) Add some more statics
tron
parents: 1093
diff changeset
   360
{
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   361
	Point pt;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   362
	int a,b;
5014
aaa61af89635 (svn r7047) -Fix [FS#317]: Zooming out near map-borders would previously fail because the new centre
Darkvater
parents: 4912
diff changeset
   363
	uint z;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   364
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   365
	if ( (uint)(x -= vp->left) >= (uint)vp->width ||
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   366
				(uint)(y -= vp->top) >= (uint)vp->height) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   367
				Point pt = {-1, -1};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   368
				return pt;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   369
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   370
7122
0607a15aedc0 (svn r9846) -Codechange: introduced ZOOM_LVL_MIN and ZOOM_LVL_MAX for the obvious reasons
truelight
parents: 7120
diff changeset
   371
	x = (ScaleByZoom(x, vp->zoom) + vp->virtual_left) >> 2;
0607a15aedc0 (svn r9846) -Codechange: introduced ZOOM_LVL_MIN and ZOOM_LVL_MAX for the obvious reasons
truelight
parents: 7120
diff changeset
   372
	y = (ScaleByZoom(y, vp->zoom) + vp->virtual_top) >> 1;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   373
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   374
	a = y-x;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   375
	b = y+x;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   376
5014
aaa61af89635 (svn r7047) -Fix [FS#317]: Zooming out near map-borders would previously fail because the new centre
Darkvater
parents: 4912
diff changeset
   377
	/* we need to move variables in to the valid range, as the
aaa61af89635 (svn r7047) -Fix [FS#317]: Zooming out near map-borders would previously fail because the new centre
Darkvater
parents: 4912
diff changeset
   378
	 * GetTileZoomCenterWindow() function can call here with invalid x and/or y,
aaa61af89635 (svn r7047) -Fix [FS#317]: Zooming out near map-borders would previously fail because the new centre
Darkvater
parents: 4912
diff changeset
   379
	 * when the user tries to zoom out along the sides of the map */
8418
b49fc6be1ab9 (svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents: 8414
diff changeset
   380
	a = Clamp(a, 0, (int)(MapMaxX() * TILE_SIZE) - 1);
b49fc6be1ab9 (svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents: 8414
diff changeset
   381
	b = Clamp(b, 0, (int)(MapMaxY() * TILE_SIZE) - 1);
5014
aaa61af89635 (svn r7047) -Fix [FS#317]: Zooming out near map-borders would previously fail because the new centre
Darkvater
parents: 4912
diff changeset
   382
8260
c7d75cebe3f6 (svn r11313) -Codechange: prepare several pieces of code so the can handle some new slopes. Patch by frosch.
rubidium
parents: 8222
diff changeset
   383
	/* (a, b) is the X/Y-world coordinate that belongs to (x,y) if the landscape would be completely flat on height 0.
c7d75cebe3f6 (svn r11313) -Codechange: prepare several pieces of code so the can handle some new slopes. Patch by frosch.
rubidium
parents: 8222
diff changeset
   384
	 * Now find the Z-world coordinate by fix point iteration.
c7d75cebe3f6 (svn r11313) -Codechange: prepare several pieces of code so the can handle some new slopes. Patch by frosch.
rubidium
parents: 8222
diff changeset
   385
	 * This is a bit tricky because the tile height is non-continuous at foundations.
c7d75cebe3f6 (svn r11313) -Codechange: prepare several pieces of code so the can handle some new slopes. Patch by frosch.
rubidium
parents: 8222
diff changeset
   386
	 * The clicked point should be approached from the back, otherwise there are regions that are not clickable.
c7d75cebe3f6 (svn r11313) -Codechange: prepare several pieces of code so the can handle some new slopes. Patch by frosch.
rubidium
parents: 8222
diff changeset
   387
	 * (FOUNDATION_HALFTILE_LOWER on SLOPE_STEEP_S hides north halftile completely)
c7d75cebe3f6 (svn r11313) -Codechange: prepare several pieces of code so the can handle some new slopes. Patch by frosch.
rubidium
parents: 8222
diff changeset
   388
	 * So give it a z-malus of 4 in the first iterations.
c7d75cebe3f6 (svn r11313) -Codechange: prepare several pieces of code so the can handle some new slopes. Patch by frosch.
rubidium
parents: 8222
diff changeset
   389
	 */
c7d75cebe3f6 (svn r11313) -Codechange: prepare several pieces of code so the can handle some new slopes. Patch by frosch.
rubidium
parents: 8222
diff changeset
   390
	z = 0;
c7d75cebe3f6 (svn r11313) -Codechange: prepare several pieces of code so the can handle some new slopes. Patch by frosch.
rubidium
parents: 8222
diff changeset
   391
	for (int i = 0; i < 5; i++) z = GetSlopeZ(a + max(z, 4u) - 4, b + max(z, 4u) - 4) / 2;
c7d75cebe3f6 (svn r11313) -Codechange: prepare several pieces of code so the can handle some new slopes. Patch by frosch.
rubidium
parents: 8222
diff changeset
   392
	for (uint malus = 3; malus > 0; malus--) z = GetSlopeZ(a + max(z, malus) - malus, b + max(z, malus) - malus) / 2;
c7d75cebe3f6 (svn r11313) -Codechange: prepare several pieces of code so the can handle some new slopes. Patch by frosch.
rubidium
parents: 8222
diff changeset
   393
	for (int i = 0; i < 5; i++) z = GetSlopeZ(a + z, b + z) / 2;
5014
aaa61af89635 (svn r7047) -Fix [FS#317]: Zooming out near map-borders would previously fail because the new centre
Darkvater
parents: 4912
diff changeset
   394
aaa61af89635 (svn r7047) -Fix [FS#317]: Zooming out near map-borders would previously fail because the new centre
Darkvater
parents: 4912
diff changeset
   395
	pt.x = a + z;
aaa61af89635 (svn r7047) -Fix [FS#317]: Zooming out near map-borders would previously fail because the new centre
Darkvater
parents: 4912
diff changeset
   396
	pt.y = b + z;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   397
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   398
	return pt;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   399
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   400
981
25c7b445dcb8 (svn r1477) -Fix: finally zooming in/out always works. The problem was that the zoomed in/out coordinates were used for checking if the area was a zoomable viewport in the not zoomed in/out position. The chances were high that there was a window.
darkvater
parents: 979
diff changeset
   401
/* When used for zooming, check area below current coordinates (x,y)
25c7b445dcb8 (svn r1477) -Fix: finally zooming in/out always works. The problem was that the zoomed in/out coordinates were used for checking if the area was a zoomable viewport in the not zoomed in/out position. The chances were high that there was a window.
darkvater
parents: 979
diff changeset
   402
 * and return the tile of the zoomed out/in position (zoom_x, zoom_y)
25c7b445dcb8 (svn r1477) -Fix: finally zooming in/out always works. The problem was that the zoomed in/out coordinates were used for checking if the area was a zoomable viewport in the not zoomed in/out position. The chances were high that there was a window.
darkvater
parents: 979
diff changeset
   403
 * when you just want the tile, make x = zoom_x and y = zoom_y */
25c7b445dcb8 (svn r1477) -Fix: finally zooming in/out always works. The problem was that the zoomed in/out coordinates were used for checking if the area was a zoomable viewport in the not zoomed in/out position. The chances were high that there was a window.
darkvater
parents: 979
diff changeset
   404
static Point GetTileFromScreenXY(int x, int y, int zoom_x, int zoom_y)
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
   405
{
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   406
	Window *w;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   407
	ViewPort *vp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   408
	Point pt;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
   409
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
   410
	if ( (w = FindWindowFromPt(x, y)) != NULL &&
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   411
			 (vp = IsPtInWindowViewport(w, x, y)) != NULL)
981
25c7b445dcb8 (svn r1477) -Fix: finally zooming in/out always works. The problem was that the zoomed in/out coordinates were used for checking if the area was a zoomable viewport in the not zoomed in/out position. The chances were high that there was a window.
darkvater
parents: 979
diff changeset
   412
				return TranslateXYToTileCoord(vp, zoom_x, zoom_y);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   413
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   414
	pt.y = pt.x = -1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   415
	return pt;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   416
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   417
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6443
diff changeset
   418
Point GetTileBelowCursor()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   419
{
981
25c7b445dcb8 (svn r1477) -Fix: finally zooming in/out always works. The problem was that the zoomed in/out coordinates were used for checking if the area was a zoomable viewport in the not zoomed in/out position. The chances were high that there was a window.
darkvater
parents: 979
diff changeset
   420
	return GetTileFromScreenXY(_cursor.pos.x, _cursor.pos.y, _cursor.pos.x, _cursor.pos.y);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   421
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   422
152
c3964b43943e (svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents: 137
diff changeset
   423
c3964b43943e (svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents: 137
diff changeset
   424
Point GetTileZoomCenterWindow(bool in, Window * w)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   425
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   426
	int x, y;
10504
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
   427
	ViewPort *vp = w->viewport;
152
c3964b43943e (svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents: 137
diff changeset
   428
2026
02dfa0aa2c2f (svn r2535) Tabs
tron
parents: 2023
diff changeset
   429
	if (in) {
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   430
		x = ((_cursor.pos.x - vp->left) >> 1) + (vp->width >> 2);
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   431
		y = ((_cursor.pos.y - vp->top) >> 1) + (vp->height >> 2);
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   432
	} else {
152
c3964b43943e (svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents: 137
diff changeset
   433
		x = vp->width - (_cursor.pos.x - vp->left);
c3964b43943e (svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents: 137
diff changeset
   434
		y = vp->height - (_cursor.pos.y - vp->top);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   435
	}
981
25c7b445dcb8 (svn r1477) -Fix: finally zooming in/out always works. The problem was that the zoomed in/out coordinates were used for checking if the area was a zoomable viewport in the not zoomed in/out position. The chances were high that there was a window.
darkvater
parents: 979
diff changeset
   436
	/* Get the tile below the cursor and center on the zoomed-out center */
25c7b445dcb8 (svn r1477) -Fix: finally zooming in/out always works. The problem was that the zoomed in/out coordinates were used for checking if the area was a zoomable viewport in the not zoomed in/out position. The chances were high that there was a window.
darkvater
parents: 979
diff changeset
   437
	return GetTileFromScreenXY(_cursor.pos.x, _cursor.pos.y, x + vp->left, y + vp->top);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   438
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   439
5045
3e734e178dae (svn r7094) -Codechange: Get rid of the window-specific code in DoZoomInOutWindow (enable, disable
Darkvater
parents: 5027
diff changeset
   440
/** Update the status of the zoom-buttons according to the zoom-level
3e734e178dae (svn r7094) -Codechange: Get rid of the window-specific code in DoZoomInOutWindow (enable, disable
Darkvater
parents: 5027
diff changeset
   441
 * of the viewport. This will update their status and invalidate accordingly
6939
50b3cf596ce2 (svn r9580) -Documentation: Correction of doxygen function declarations
belugas
parents: 6923
diff changeset
   442
 * @param w Window pointer to the window that has the zoom buttons
5045
3e734e178dae (svn r7094) -Codechange: Get rid of the window-specific code in DoZoomInOutWindow (enable, disable
Darkvater
parents: 5027
diff changeset
   443
 * @param vp pointer to the viewport whose zoom-level the buttons represent
3e734e178dae (svn r7094) -Codechange: Get rid of the window-specific code in DoZoomInOutWindow (enable, disable
Darkvater
parents: 5027
diff changeset
   444
 * @param widget_zoom_in widget index for window with zoom-in button
3e734e178dae (svn r7094) -Codechange: Get rid of the window-specific code in DoZoomInOutWindow (enable, disable
Darkvater
parents: 5027
diff changeset
   445
 * @param widget_zoom_out widget index for window with zoom-out button */
3e734e178dae (svn r7094) -Codechange: Get rid of the window-specific code in DoZoomInOutWindow (enable, disable
Darkvater
parents: 5027
diff changeset
   446
void HandleZoomMessage(Window *w, const ViewPort *vp, byte widget_zoom_in, byte widget_zoom_out)
3e734e178dae (svn r7094) -Codechange: Get rid of the window-specific code in DoZoomInOutWindow (enable, disable
Darkvater
parents: 5027
diff changeset
   447
{
8493
3ab458f7cff4 (svn r11555) -Codechange: use the new members introduced in r11551.
rubidium
parents: 8466
diff changeset
   448
	w->SetWidgetDisabledState(widget_zoom_in, vp->zoom == ZOOM_LVL_MIN);
8524
baf4ab1ba18d (svn r11588) -Codechange: use the new member introduced in r11551
glx
parents: 8493
diff changeset
   449
	w->InvalidateWidget(widget_zoom_in);
5045
3e734e178dae (svn r7094) -Codechange: Get rid of the window-specific code in DoZoomInOutWindow (enable, disable
Darkvater
parents: 5027
diff changeset
   450
8493
3ab458f7cff4 (svn r11555) -Codechange: use the new members introduced in r11551.
rubidium
parents: 8466
diff changeset
   451
	w->SetWidgetDisabledState(widget_zoom_out, vp->zoom == ZOOM_LVL_MAX);
8524
baf4ab1ba18d (svn r11588) -Codechange: use the new member introduced in r11551
glx
parents: 8493
diff changeset
   452
	w->InvalidateWidget(widget_zoom_out);
5045
3e734e178dae (svn r7094) -Codechange: Get rid of the window-specific code in DoZoomInOutWindow (enable, disable
Darkvater
parents: 5027
diff changeset
   453
}
3e734e178dae (svn r7094) -Codechange: Get rid of the window-specific code in DoZoomInOutWindow (enable, disable
Darkvater
parents: 5027
diff changeset
   454
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   455
/**
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   456
 * Draws a ground sprite at a specific world-coordinate.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   457
 *
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   458
 * @param image the image to draw.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   459
 * @param pal the provided palette.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   460
 * @param x position x of the sprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   461
 * @param y position y of the sprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   462
 * @param z position z of the sprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   463
 * @param sub Only draw a part of the sprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   464
 *
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   465
 */
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   466
void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z, const SubSprite *sub)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   467
{
2187
2a51f8925eeb (svn r2702) -Codechange: Cleaned up the sprite code and replaced many magic numbers
celestar
parents: 2186
diff changeset
   468
	assert((image & SPRITE_MASK) < MAX_SPRITES);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   469
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   470
	TileSpriteToDraw *ts = _vd.tile_sprites_to_draw.Append();
10205
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   471
	ts->image = image;
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   472
	ts->pal = pal;
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   473
	ts->sub = sub;
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   474
	ts->x = x;
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   475
	ts->y = y;
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   476
	ts->z = z;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   477
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   478
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   479
/**
8222
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   480
 * Adds a child sprite to the active foundation.
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   481
 *
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   482
 * The pixel offset of the sprite relative to the ParentSprite is the sum of the offset passed to OffsetGroundSprite() and extra_offs_?.
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   483
 *
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   484
 * @param image the image to draw.
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   485
 * @param pal the provided palette.
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   486
 * @param sub Only draw a part of the sprite.
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   487
 * @param foundation_part Foundation part.
8222
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   488
 * @param extra_offs_x Pixel X offset for the sprite position.
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   489
 * @param extra_offs_y Pixel Y offset for the sprite position.
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   490
 */
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   491
static void AddChildSpriteToFoundation(SpriteID image, SpriteID pal, const SubSprite *sub, FoundationPart foundation_part, int extra_offs_x, int extra_offs_y)
8222
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   492
{
8450
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8447
diff changeset
   493
	assert(IsInsideMM(foundation_part, 0, FOUNDATION_PART_END));
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   494
	assert(_vd.foundation[foundation_part] != -1);
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   495
	Point offs = _vd.foundation_offset[foundation_part];
8222
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   496
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   497
	/* Change the active ChildSprite list to the one of the foundation */
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   498
	int *old_child = _vd.last_child;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   499
	_vd.last_child = _vd.last_foundation_child[foundation_part];
8222
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   500
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   501
	AddChildSpriteScreen(image, pal, offs.x + extra_offs_x, offs.y + extra_offs_y, false, sub);
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   502
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   503
	/* Switch back to last ChildSprite list */
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   504
	_vd.last_child = old_child;
8222
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   505
}
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   506
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   507
/**
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   508
 * Draws a ground sprite for the current tile.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   509
 * If the current tile is drawn on top of a foundation the sprite is added as child sprite to the "foundation"-ParentSprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   510
 *
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   511
 * @param image the image to draw.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   512
 * @param pal the provided palette.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   513
 * @param sub Only draw a part of the sprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   514
 */
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   515
void DrawGroundSprite(SpriteID image, SpriteID pal, const SubSprite *sub)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   516
{
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   517
	/* Switch to first foundation part, if no foundation was drawn */
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   518
	if (_vd.foundation_part == FOUNDATION_PART_NONE) _vd.foundation_part = FOUNDATION_PART_NORMAL;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   519
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   520
	if (_vd.foundation[_vd.foundation_part] != -1) {
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   521
		AddChildSpriteToFoundation(image, pal, sub, _vd.foundation_part, 0, 0);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   522
	} else {
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   523
		DrawGroundSpriteAt(image, pal, _cur_ti->x, _cur_ti->y, _cur_ti->z, sub);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   524
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   525
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   526
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   527
8222
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   528
/**
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   529
 * Called when a foundation has been drawn for the current tile.
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   530
 * Successive ground sprites for the current tile will be drawn as child sprites of the "foundation"-ParentSprite, not as TileSprites.
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   531
 *
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   532
 * @param x sprite x-offset (screen coordinates) of ground sprites relative to the "foundation"-ParentSprite.
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   533
 * @param y sprite y-offset (screen coordinates) of ground sprites relative to the "foundation"-ParentSprite.
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   534
 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   535
void OffsetGroundSprite(int x, int y)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   536
{
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   537
	/* Switch to next foundation part */
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   538
	switch (_vd.foundation_part) {
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   539
		case FOUNDATION_PART_NONE:
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   540
			_vd.foundation_part = FOUNDATION_PART_NORMAL;
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   541
			break;
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   542
		case FOUNDATION_PART_NORMAL:
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   543
			_vd.foundation_part = FOUNDATION_PART_HALFTILE;
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   544
			break;
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   545
		default: NOT_REACHED();
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   546
	}
8222
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   547
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   548
	/* _vd.last_child == NULL if foundation sprite was clipped by the viewport bounds */
11017
115b1bf01e5e (svn r13573) -Codechange: Use smallvec class functions instead of class members
skidd13
parents: 10984
diff changeset
   549
	if (_vd.last_child != NULL) _vd.foundation[_vd.foundation_part] = _vd.parent_sprites_to_draw.Length() - 1;
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   550
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   551
	_vd.foundation_offset[_vd.foundation_part].x = x;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   552
	_vd.foundation_offset[_vd.foundation_part].y = y;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   553
	_vd.last_foundation_child[_vd.foundation_part] = _vd.last_child;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   554
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   555
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   556
/**
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   557
 * Adds a child sprite to a parent sprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   558
 * In contrast to "AddChildSpriteScreen()" the sprite position is in world coordinates
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   559
 *
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   560
 * @param image the image to draw.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   561
 * @param pal the provided palette.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   562
 * @param x position x of the sprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   563
 * @param y position y of the sprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   564
 * @param z position z of the sprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   565
 * @param sub Only draw a part of the sprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   566
 */
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   567
static void AddCombinedSprite(SpriteID image, SpriteID pal, int x, int y, byte z, const SubSprite *sub)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   568
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   569
	Point pt = RemapCoords(x, y, z);
2319
9902d3ffa309 (svn r2845) Remove sprite size caching, it was unused
tron
parents: 2187
diff changeset
   570
	const Sprite* spr = GetSprite(image & SPRITE_MASK);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   571
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   572
	if (pt.x + spr->x_offs >= _vd.dpi.left + _vd.dpi.width ||
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   573
			pt.x + spr->x_offs + spr->width <= _vd.dpi.left ||
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   574
			pt.y + spr->y_offs >= _vd.dpi.top + _vd.dpi.height ||
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   575
			pt.y + spr->y_offs + spr->height <= _vd.dpi.top)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   576
		return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   577
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   578
	const ParentSpriteToDraw *pstd = _vd.parent_sprites_to_draw.End() - 1;
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   579
	AddChildSpriteScreen(image, pal, pt.x - pstd->left, pt.y - pstd->top, false, sub);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   580
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   581
8076
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   582
/** Draw a (transparent) sprite at given coordinates with a given bounding box.
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   583
 * The bounding box extends from (x + bb_offset_x, y + bb_offset_y, z + bb_offset_z) to (x + w - 1, y + h - 1, z + dz - 1), both corners included.
8113
f7a573c5d56c (svn r11147) -Fix [FS#1247] (r11105): reallow bounding boxes with x/y/z-extent 0. Some NewGRFs need them. Patch by frosch.
rubidium
parents: 8097
diff changeset
   584
 * Bounding boxes with bb_offset_x == w or bb_offset_y == h or bb_offset_z == dz are allowed and produce thin slices.
8076
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   585
 *
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   586
 * @note Bounding boxes are normally specified with bb_offset_x = bb_offset_y = bb_offset_z = 0. The extent of the bounding box in negative direction is
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   587
 *       defined by the sprite offset in the grf file.
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   588
 *       However if modifying the sprite offsets is not suitable (e.g. when using existing graphics), the bounding box can be tuned by bb_offset.
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   589
 *
8113
f7a573c5d56c (svn r11147) -Fix [FS#1247] (r11105): reallow bounding boxes with x/y/z-extent 0. Some NewGRFs need them. Patch by frosch.
rubidium
parents: 8097
diff changeset
   590
 * @pre w >= bb_offset_x, h >= bb_offset_y, dz >= bb_offset_z. Else w, h or dz are ignored.
8076
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   591
 *
7829
88883899c9e6 (svn r10696) -Codechange: remove duplication of the "make sprite transparent" code.
rubidium
parents: 7817
diff changeset
   592
 * @param image the image to combine and draw,
88883899c9e6 (svn r10696) -Codechange: remove duplication of the "make sprite transparent" code.
rubidium
parents: 7817
diff changeset
   593
 * @param pal the provided palette,
8076
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   594
 * @param x position X (world) of the sprite,
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   595
 * @param y position Y (world) of the sprite,
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   596
 * @param w bounding box extent towards positive X (world),
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   597
 * @param h bounding box extent towards positive Y (world),
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   598
 * @param dz bounding box extent towards positive Z (world),
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   599
 * @param z position Z (world) of the sprite,
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   600
 * @param transparent if true, switch the palette between the provided palette and the transparent palette,
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   601
 * @param bb_offset_x bounding box extent towards negative X (world),
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   602
 * @param bb_offset_y bounding box extent towards negative Y (world),
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   603
 * @param bb_offset_z bounding box extent towards negative Z (world)
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   604
 * @param sub Only draw a part of the sprite.
7829
88883899c9e6 (svn r10696) -Codechange: remove duplication of the "make sprite transparent" code.
rubidium
parents: 7817
diff changeset
   605
 */
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   606
void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, int dz, int z, bool transparent, int bb_offset_x, int bb_offset_y, int bb_offset_z, const SubSprite *sub)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   607
{
8139
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   608
	int32 left, right, top, bottom;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   609
2187
2a51f8925eeb (svn r2702) -Codechange: Cleaned up the sprite code and replaced many magic numbers
celestar
parents: 2186
diff changeset
   610
	assert((image & SPRITE_MASK) < MAX_SPRITES);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   611
7829
88883899c9e6 (svn r10696) -Codechange: remove duplication of the "make sprite transparent" code.
rubidium
parents: 7817
diff changeset
   612
	/* make the sprites transparent with the right palette */
88883899c9e6 (svn r10696) -Codechange: remove duplication of the "make sprite transparent" code.
rubidium
parents: 7817
diff changeset
   613
	if (transparent) {
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
   614
		SetBit(image, PALETTE_MODIFIER_TRANSPARENT);
7829
88883899c9e6 (svn r10696) -Codechange: remove duplication of the "make sprite transparent" code.
rubidium
parents: 7817
diff changeset
   615
		pal = PALETTE_TO_TRANSPARENT;
88883899c9e6 (svn r10696) -Codechange: remove duplication of the "make sprite transparent" code.
rubidium
parents: 7817
diff changeset
   616
	}
88883899c9e6 (svn r10696) -Codechange: remove duplication of the "make sprite transparent" code.
rubidium
parents: 7817
diff changeset
   617
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   618
	if (_vd.combine_sprites == 2) {
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   619
		AddCombinedSprite(image, pal, x, y, z, sub);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   620
		return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   621
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   622
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   623
	_vd.last_child = NULL;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   624
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   625
	Point pt = RemapCoords(x, y, z);
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   626
	int tmp_left, tmp_top, tmp_x = pt.x, tmp_y = pt.y;
8139
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   627
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   628
	/* Compute screen extents of sprite */
8097
68eefbb4ff46 (svn r11128) -Fix: a lot of graphical glitches by changing some bounding boxes. It's not perfect yet, but a *very* good step into the right direction. Patch by frosch.
rubidium
parents: 8076
diff changeset
   629
	if (image == SPR_EMPTY_BOUNDING_BOX) {
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   630
		left = tmp_left = RemapCoords(x + w          , y + bb_offset_y, z + bb_offset_z).x;
8139
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   631
		right           = RemapCoords(x + bb_offset_x, y + h          , z + bb_offset_z).x + 1;
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   632
		top  = tmp_top  = RemapCoords(x + bb_offset_x, y + bb_offset_y, z + dz         ).y;
8139
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   633
		bottom          = RemapCoords(x + w          , y + h          , z + bb_offset_z).y + 1;
8097
68eefbb4ff46 (svn r11128) -Fix: a lot of graphical glitches by changing some bounding boxes. It's not perfect yet, but a *very* good step into the right direction. Patch by frosch.
rubidium
parents: 8076
diff changeset
   634
	} else {
68eefbb4ff46 (svn r11128) -Fix: a lot of graphical glitches by changing some bounding boxes. It's not perfect yet, but a *very* good step into the right direction. Patch by frosch.
rubidium
parents: 8076
diff changeset
   635
		const Sprite *spr = GetSprite(image & SPRITE_MASK);
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   636
		left = tmp_left = (pt.x += spr->x_offs);
8139
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   637
		right           = (pt.x +  spr->width );
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   638
		top  = tmp_top  = (pt.y += spr->y_offs);
8139
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   639
		bottom          = (pt.y +  spr->height);
8097
68eefbb4ff46 (svn r11128) -Fix: a lot of graphical glitches by changing some bounding boxes. It's not perfect yet, but a *very* good step into the right direction. Patch by frosch.
rubidium
parents: 8076
diff changeset
   640
	}
9058
b9c3fec968b8 (svn r12140) -Codechange: A bit of code style fixes(Geektoo).
belugas
parents: 8969
diff changeset
   641
8139
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   642
	if (_draw_bounding_boxes && (image != SPR_EMPTY_BOUNDING_BOX)) {
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   643
		/* Compute maximal extents of sprite and it's bounding box */
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   644
		left   = min(left  , RemapCoords(x + w          , y + bb_offset_y, z + bb_offset_z).x);
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   645
		right  = max(right , RemapCoords(x + bb_offset_x, y + h          , z + bb_offset_z).x + 1);
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   646
		top    = min(top   , RemapCoords(x + bb_offset_x, y + bb_offset_y, z + dz         ).y);
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   647
		bottom = max(bottom, RemapCoords(x + w          , y + h          , z + bb_offset_z).y + 1);
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   648
	}
9058
b9c3fec968b8 (svn r12140) -Codechange: A bit of code style fixes(Geektoo).
belugas
parents: 8969
diff changeset
   649
8139
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
   650
	/* Do not add the sprite to the viewport, if it is outside */
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   651
	if (left   >= _vd.dpi.left + _vd.dpi.width ||
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   652
	    right  <= _vd.dpi.left                 ||
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   653
	    top    >= _vd.dpi.top + _vd.dpi.height ||
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   654
	    bottom <= _vd.dpi.top) {
4189
258f98b17f57 (svn r5631) Don't allocate memory for information about a sprite which isn't drawn
tron
parents: 4188
diff changeset
   655
		return;
258f98b17f57 (svn r5631) Don't allocate memory for information about a sprite which isn't drawn
tron
parents: 4188
diff changeset
   656
	}
258f98b17f57 (svn r5631) Don't allocate memory for information about a sprite which isn't drawn
tron
parents: 4188
diff changeset
   657
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   658
	ParentSpriteToDraw *ps = _vd.parent_sprites_to_draw.Append();
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   659
	ps->x = tmp_x;
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   660
	ps->y = tmp_y;
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   661
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   662
	ps->left = tmp_left;
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
   663
	ps->top  = tmp_top;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   664
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   665
	ps->image = image;
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5853
diff changeset
   666
	ps->pal = pal;
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   667
	ps->sub = sub;
8076
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   668
	ps->xmin = x + bb_offset_x;
8113
f7a573c5d56c (svn r11147) -Fix [FS#1247] (r11105): reallow bounding boxes with x/y/z-extent 0. Some NewGRFs need them. Patch by frosch.
rubidium
parents: 8097
diff changeset
   669
	ps->xmax = x + max(bb_offset_x, w) - 1;
8076
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   670
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   671
	ps->ymin = y + bb_offset_y;
8113
f7a573c5d56c (svn r11147) -Fix [FS#1247] (r11105): reallow bounding boxes with x/y/z-extent 0. Some NewGRFs need them. Patch by frosch.
rubidium
parents: 8097
diff changeset
   672
	ps->ymax = y + max(bb_offset_y, h) - 1;
8076
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   673
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   674
	ps->zmin = z + bb_offset_z;
8113
f7a573c5d56c (svn r11147) -Fix [FS#1247] (r11105): reallow bounding boxes with x/y/z-extent 0. Some NewGRFs need them. Patch by frosch.
rubidium
parents: 8097
diff changeset
   675
	ps->zmax = z + max(bb_offset_z, dz) - 1;
8076
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   676
10e9b5e354d9 (svn r11105) -Codechange [FS#1223]: add some support for tuning of the bounding boxes for some special cases (like tunnels and bridges). Patch by frosch.
rubidium
parents: 8075
diff changeset
   677
	ps->comparison_done = false;
10984
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
   678
	ps->first_child = -1;
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
   679
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
   680
	_vd.last_child = &ps->first_child;
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   681
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   682
	if (_vd.combine_sprites == 1) _vd.combine_sprites = 2;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   683
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   684
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6443
diff changeset
   685
void StartSpriteCombine()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   686
{
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   687
	_vd.combine_sprites = 1;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   688
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   689
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6443
diff changeset
   690
void EndSpriteCombine()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   691
{
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   692
	_vd.combine_sprites = 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   693
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   694
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   695
/**
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   696
 * Add a child sprite to a parent sprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   697
 *
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   698
 * @param image the image to draw.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   699
 * @param pal the provided palette.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   700
 * @param x sprite x-offset (screen coordinates) relative to parent sprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   701
 * @param y sprite y-offset (screen coordinates) relative to parent sprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   702
 * @param transparent if true, switch the palette between the provided palette and the transparent palette,
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   703
 * @param sub Only draw a part of the sprite.
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   704
 */
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   705
void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y, bool transparent, const SubSprite *sub)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   706
{
2187
2a51f8925eeb (svn r2702) -Codechange: Cleaned up the sprite code and replaced many magic numbers
celestar
parents: 2186
diff changeset
   707
	assert((image & SPRITE_MASK) < MAX_SPRITES);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   708
10208
98dc9f65629e (svn r12740) -Codechange: use a vector instead of allocating memory in a byte array for ChildScreenSpriteToDraw.
rubidium
parents: 10207
diff changeset
   709
	/* If the ParentSprite was clipped by the viewport bounds, do not draw the ChildSprites either */
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   710
	if (_vd.last_child == NULL) return;
10208
98dc9f65629e (svn r12740) -Codechange: use a vector instead of allocating memory in a byte array for ChildScreenSpriteToDraw.
rubidium
parents: 10207
diff changeset
   711
8155
db4561087736 (svn r11190) -Fix: make snowy roofs of (newgrf) houses also transparent.
rubidium
parents: 8139
diff changeset
   712
	/* make the sprites transparent with the right palette */
db4561087736 (svn r11190) -Fix: make snowy roofs of (newgrf) houses also transparent.
rubidium
parents: 8139
diff changeset
   713
	if (transparent) {
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
   714
		SetBit(image, PALETTE_MODIFIER_TRANSPARENT);
8155
db4561087736 (svn r11190) -Fix: make snowy roofs of (newgrf) houses also transparent.
rubidium
parents: 8139
diff changeset
   715
		pal = PALETTE_TO_TRANSPARENT;
db4561087736 (svn r11190) -Fix: make snowy roofs of (newgrf) houses also transparent.
rubidium
parents: 8139
diff changeset
   716
	}
db4561087736 (svn r11190) -Fix: make snowy roofs of (newgrf) houses also transparent.
rubidium
parents: 8139
diff changeset
   717
11017
115b1bf01e5e (svn r13573) -Codechange: Use smallvec class functions instead of class members
skidd13
parents: 10984
diff changeset
   718
	*_vd.last_child = _vd.child_screen_sprites_to_draw.Length();
10984
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
   719
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   720
	ChildScreenSpriteToDraw *cs = _vd.child_screen_sprites_to_draw.Append();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   721
	cs->image = image;
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5853
diff changeset
   722
	cs->pal = pal;
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
   723
	cs->sub = sub;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   724
	cs->x = x;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   725
	cs->y = y;
10984
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
   726
	cs->next = -1;
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
   727
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
   728
	/* Append the sprite to the active ChildSprite list.
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
   729
	 * If the active ParentSprite is a foundation, update last_foundation_child as well.
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
   730
	 * Note: ChildSprites of foundations are NOT sequential in the vector, as selection sprites are added at last. */
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
   731
	if (_vd.last_foundation_child[0] == _vd.last_child) _vd.last_foundation_child[0] = &cs->next;
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
   732
	if (_vd.last_foundation_child[1] == _vd.last_child) _vd.last_foundation_child[1] = &cs->next;
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
   733
	_vd.last_child = &cs->next;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   734
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   735
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   736
/* Returns a StringSpriteToDraw */
10202
19da84f6725c (svn r12734) -Codechange: use a vector instead of allocating memory in a big byte array for StringSpriteToDraw.
rubidium
parents: 10164
diff changeset
   737
void AddStringToDraw(int x, int y, StringID string, uint64 params_1, uint64 params_2, uint16 color, uint16 width)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   738
{
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   739
	StringSpriteToDraw *ss = _vd.string_sprites_to_draw.Append();
10205
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   740
	ss->string = string;
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   741
	ss->x = x;
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   742
	ss->y = y;
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   743
	ss->params[0] = params_1;
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   744
	ss->params[1] = params_2;
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   745
	ss->width = width;
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
   746
	ss->color = color;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   747
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   748
4000
bab1ebc37da0 (svn r5210) Many small changes which piled up: const, unsigned, variable scope, CSE for readability, DeMorgan, if cascades -> switch, whitespace, parentheses, bracing, misc.
tron
parents: 3809
diff changeset
   749
8222
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   750
/**
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   751
 * Draws sprites between ground sprite and everything above.
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   752
 *
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   753
 * The sprite is either drawn as TileSprite or as ChildSprite of the active foundation.
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   754
 *
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   755
 * @param image the image to draw.
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   756
 * @param pal the provided palette.
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   757
 * @param ti TileInfo Tile that is being drawn
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   758
 * @param z_offset Z offset relative to the groundsprite. Only used for the sprite position, not for sprite sorting.
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   759
 * @param foundation_part Foundation part the sprite belongs to.
8222
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   760
 */
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   761
static void DrawSelectionSprite(SpriteID image, SpriteID pal, const TileInfo *ti, int z_offset, FoundationPart foundation_part)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   762
{
8222
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   763
	/* FIXME: This is not totally valid for some autorail highlights, that extent over the edges of the tile. */
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   764
	if (_vd.foundation[foundation_part] == -1) {
8222
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   765
		/* draw on real ground */
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   766
		DrawGroundSpriteAt(image, pal, ti->x, ti->y, ti->z + z_offset);
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   767
	} else {
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   768
		/* draw on top of foundation */
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   769
		AddChildSpriteToFoundation(image, pal, NULL, foundation_part, 0, -z_offset);
1083
2e9d525af38d (svn r1584) Fix: Highlighlighting tiles under bridges works again correctly for square selection tools.
dominik
parents: 1070
diff changeset
   770
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   771
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   772
8175
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   773
/**
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   774
 * Draws a selection rectangle on a tile.
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   775
 *
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   776
 * @param ti TileInfo Tile that is being drawn
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   777
 * @param pal Palette to apply.
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   778
 */
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   779
static void DrawTileSelectionRect(const TileInfo *ti, SpriteID pal)
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   780
{
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   781
	SpriteID sel;
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   782
	if (IsHalftileSlope(ti->tileh)) {
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   783
		Corner halftile_corner = GetHalftileSlopeCorner(ti->tileh);
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   784
		SpriteID sel2 = SPR_HALFTILE_SELECTION_FLAT + halftile_corner;
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   785
		DrawSelectionSprite(sel2, pal, ti, 7 + TILE_HEIGHT, FOUNDATION_PART_HALFTILE);
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   786
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   787
		Corner opposite_corner = OppositeCorner(halftile_corner);
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   788
		if (IsSteepSlope(ti->tileh)) {
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   789
			sel = SPR_HALFTILE_SELECTION_DOWN;
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   790
		} else {
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   791
			sel = ((ti->tileh & SlopeWithOneCornerRaised(opposite_corner)) != 0 ? SPR_HALFTILE_SELECTION_UP : SPR_HALFTILE_SELECTION_FLAT);
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   792
		}
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   793
		sel += opposite_corner;
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   794
	} else {
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   795
		sel = SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh];
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   796
	}
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   797
	DrawSelectionSprite(sel, pal, ti, 7, FOUNDATION_PART_NORMAL);
8175
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   798
}
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   799
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   800
static bool IsPartOfAutoLine(int px, int py)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   801
{
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
   802
	px -= _thd.selstart.x;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
   803
	py -= _thd.selstart.y;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   804
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
   805
	if ((_thd.drawstyle & ~HT_DIR_MASK) != HT_LINE) return false;
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
   806
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
   807
	switch (_thd.drawstyle & HT_DIR_MASK) {
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
   808
		case HT_DIR_X:  return py == 0; // x direction
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
   809
		case HT_DIR_Y:  return px == 0; // y direction
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
   810
		case HT_DIR_HU: return px == -py || px == -py - 16; // horizontal upper
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
   811
		case HT_DIR_HL: return px == -py || px == -py + 16; // horizontal lower
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
   812
		case HT_DIR_VL: return px == py || px == py + 16; // vertival left
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
   813
		case HT_DIR_VR: return px == py || px == py - 16; // vertical right
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
   814
		default:
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
   815
			NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   816
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   817
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   818
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
   819
// [direction][side]
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
   820
static const HighLightStyle _autorail_type[6][2] = {
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
   821
	{ HT_DIR_X,  HT_DIR_X },
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
   822
	{ HT_DIR_Y,  HT_DIR_Y },
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
   823
	{ HT_DIR_HU, HT_DIR_HL },
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
   824
	{ HT_DIR_HL, HT_DIR_HU },
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
   825
	{ HT_DIR_VL, HT_DIR_VR },
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
   826
	{ HT_DIR_VR, HT_DIR_VL }
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
   827
};
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
   828
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
   829
#include "table/autorail.h"
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
   830
7574
0d76e3392fa4 (svn r10343) -Cleanup: Add documentation of functions and code-style fix.
belugas
parents: 7565
diff changeset
   831
/**
8175
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   832
 * Draws autorail highlights.
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   833
 *
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   834
 * @param *ti TileInfo Tile that is being drawn
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   835
 * @param autorail_type Offset into _AutorailTilehSprite[][]
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   836
 */
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   837
static void DrawAutorailSelection(const TileInfo *ti, uint autorail_type)
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   838
{
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   839
	SpriteID image;
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   840
	SpriteID pal;
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   841
	int offset;
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   842
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   843
	FoundationPart foundation_part = FOUNDATION_PART_NORMAL;
8909
fa15e9afad2f (svn r11983) -Codechange: Add some helper functions for slopes and use them.
frosch
parents: 8766
diff changeset
   844
	Slope autorail_tileh = RemoveHalftileSlope(ti->tileh);
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   845
	if (IsHalftileSlope(ti->tileh)) {
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   846
		static const uint _lower_rail[4] = { 5U, 2U, 4U, 3U };
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   847
		Corner halftile_corner = GetHalftileSlopeCorner(ti->tileh);
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   848
		if (autorail_type != _lower_rail[halftile_corner]) {
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   849
			foundation_part = FOUNDATION_PART_HALFTILE;
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   850
			/* Here we draw the highlights of the "three-corners-raised"-slope. That looks ok to me. */
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   851
			autorail_tileh = SlopeWithThreeCornersRaised(OppositeCorner(halftile_corner));
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   852
		}
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   853
	}
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   854
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   855
	offset = _AutorailTilehSprite[autorail_tileh][autorail_type];
8175
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   856
	if (offset >= 0) {
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   857
		image = SPR_AUTORAIL_BASE + offset;
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   858
		pal = PAL_NONE;
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   859
	} else {
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   860
		image = SPR_AUTORAIL_BASE - offset;
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   861
		pal = PALETTE_SEL_TILE_RED;
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   862
	}
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   863
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   864
	DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : pal, ti, 7, foundation_part);
8175
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   865
}
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   866
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   867
/**
7574
0d76e3392fa4 (svn r10343) -Cleanup: Add documentation of functions and code-style fix.
belugas
parents: 7565
diff changeset
   868
 * Checks if the specified tile is selected and if so draws selection using correct selectionstyle.
0d76e3392fa4 (svn r10343) -Cleanup: Add documentation of functions and code-style fix.
belugas
parents: 7565
diff changeset
   869
 * @param *ti TileInfo Tile that is being drawn
0d76e3392fa4 (svn r10343) -Cleanup: Add documentation of functions and code-style fix.
belugas
parents: 7565
diff changeset
   870
 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   871
static void DrawTileSelection(const TileInfo *ti)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   872
{
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
   873
	/* Draw a red error square? */
9239
7b7a9495a0eb (svn r12439) -Fix [FS#1871]: do not 'disable' the drawing of autorail overlays when the tile is 'error'-marked (red pulsating selection). Patch by Icosikai.
rubidium
parents: 9081
diff changeset
   874
	bool is_redsq = _thd.redsq != 0 && _thd.redsq == ti->tile;
7b7a9495a0eb (svn r12439) -Fix [FS#1871]: do not 'disable' the drawing of autorail overlays when the tile is 'error'-marked (red pulsating selection). Patch by Icosikai.
rubidium
parents: 9081
diff changeset
   875
	if (is_redsq) DrawTileSelectionRect(ti, PALETTE_TILE_RED_PULSATING);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   876
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
   877
	/* no selection active? */
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   878
	if (_thd.drawstyle == 0) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   879
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
   880
	/* Inside the inner area? */
8450
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8447
diff changeset
   881
	if (IsInsideBS(ti->x, _thd.pos.x, _thd.size.x) &&
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8447
diff changeset
   882
			IsInsideBS(ti->y, _thd.pos.y, _thd.size.y)) {
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
   883
		if (_thd.drawstyle & HT_RECT) {
9239
7b7a9495a0eb (svn r12439) -Fix [FS#1871]: do not 'disable' the drawing of autorail overlays when the tile is 'error'-marked (red pulsating selection). Patch by Icosikai.
rubidium
parents: 9081
diff changeset
   884
			if (!is_redsq) DrawTileSelectionRect(ti, _thd.make_square_red ? PALETTE_SEL_TILE_RED : PAL_NONE);
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
   885
		} else if (_thd.drawstyle & HT_POINT) {
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
   886
			/* Figure out the Z coordinate for the single dot. */
8222
c0f05fd821ab (svn r11261) -Codechange: Draw selection sprites (HT_RECT, HT_POINT, HT_RAIL) on foundations as ChildSprite of the foundation, not as single ParentSprite. Patch by frosch.
rubidium
parents: 8177
diff changeset
   887
			byte z = 0;
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   888
			FoundationPart foundation_part = FOUNDATION_PART_NORMAL;
3636
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3609
diff changeset
   889
			if (ti->tileh & SLOPE_N) {
3645
86af43f87885 (svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents: 3636
diff changeset
   890
				z += TILE_HEIGHT;
8909
fa15e9afad2f (svn r11983) -Codechange: Add some helper functions for slopes and use them.
frosch
parents: 8766
diff changeset
   891
				if (RemoveHalftileSlope(ti->tileh) == SLOPE_STEEP_N) z += TILE_HEIGHT;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   892
			}
8265
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   893
			if (IsHalftileSlope(ti->tileh)) {
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   894
				Corner halftile_corner = GetHalftileSlopeCorner(ti->tileh);
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   895
				if ((halftile_corner == CORNER_W) || (halftile_corner == CORNER_E)) z += TILE_HEIGHT;
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   896
				if (halftile_corner != CORNER_S) {
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   897
					foundation_part = FOUNDATION_PART_HALFTILE;
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   898
					if (IsSteepSlope(ti->tileh)) z -= TILE_HEIGHT;
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   899
				}
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   900
			}
9d7c69a31cdc (svn r11318) -Codechange: add the actual support for drawing selections on halftiles, r11316 just added the things needed to load the sprites. Patch by frosch.
rubidium
parents: 8260
diff changeset
   901
			DrawSelectionSprite(_cur_dpi->zoom <= ZOOM_LVL_DETAIL ? SPR_DOT : SPR_DOT_SMALL, PAL_NONE, ti, z, foundation_part);
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   902
		} else if (_thd.drawstyle & HT_RAIL /*&& _thd.place_mode == VHM_RAIL*/) {
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
   903
			/* autorail highlight piece under cursor */
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   904
			uint type = _thd.drawstyle & 0xF;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   905
			assert(type <= 5);
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
   906
			DrawAutorailSelection(ti, _autorail_type[type][0]);
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   907
		} else if (IsPartOfAutoLine(ti->x, ti->y)) {
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
   908
			/* autorail highlighting long line */
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   909
			int dir = _thd.drawstyle & ~0xF0;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   910
			uint side;
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
   911
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   912
			if (dir < 2) {
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   913
				side = 0;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   914
			} else {
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   915
				TileIndex start = TileVirtXY(_thd.selstart.x, _thd.selstart.y);
8466
9ce95e16f9f9 (svn r11526) -Codechange: Rename the function delta fitting to the naming style
skidd13
parents: 8450
diff changeset
   916
				side = Delta(Delta(TileX(start), TileX(ti->tile)), Delta(TileY(start), TileY(ti->tile)));
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   917
			}
1109
1bab892228cd (svn r1610) Remove trailing whitespace (last time ever, i hope)
tron
parents: 1095
diff changeset
   918
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
   919
			DrawAutorailSelection(ti, _autorail_type[dir][side]);
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
   920
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   921
		return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   922
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   923
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
   924
	/* Check if it's inside the outer area? */
9239
7b7a9495a0eb (svn r12439) -Fix [FS#1871]: do not 'disable' the drawing of autorail overlays when the tile is 'error'-marked (red pulsating selection). Patch by Icosikai.
rubidium
parents: 9081
diff changeset
   925
	if (!is_redsq && _thd.outersize.x &&
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
   926
			_thd.size.x < _thd.size.x + _thd.outersize.x &&
8450
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8447
diff changeset
   927
			IsInsideBS(ti->x, _thd.pos.x + _thd.offs.x, _thd.size.x + _thd.outersize.x) &&
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8447
diff changeset
   928
			IsInsideBS(ti->y, _thd.pos.y + _thd.offs.y, _thd.size.y + _thd.outersize.y)) {
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
   929
		/* Draw a blue rect. */
8175
d67b421799bc (svn r11210) -Codechange: unify the way that selection sprites are drawn. Patch by frosch.
rubidium
parents: 8155
diff changeset
   930
		DrawTileSelectionRect(ti, PALETTE_SEL_TILE_BLUE);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   931
		return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   932
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   933
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   934
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6443
diff changeset
   935
static void ViewportAddLandscape()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   936
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   937
	int x, y, width, height;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   938
	TileInfo ti;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   939
	bool direction;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   940
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   941
	_cur_ti = &ti;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   942
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
   943
	/* Transform into tile coordinates and round to closest full tile */
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   944
	x = ((_vd.dpi.top >> 1) - (_vd.dpi.left >> 2)) & ~0xF;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   945
	y = ((_vd.dpi.top >> 1) + (_vd.dpi.left >> 2) - 0x10) & ~0xF;
5752
7e417aab8074 (svn r7794) -Cleanup: Remove obsolete, never-used landscape rotation code. And spell obsolete correctly.
peter1138
parents: 5726
diff changeset
   946
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
   947
	/* determine size of area */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   948
	{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   949
		Point pt = RemapCoords(x, y, 241);
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   950
		width = (_vd.dpi.left + _vd.dpi.width - pt.x + 95) >> 6;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   951
		height = (_vd.dpi.top + _vd.dpi.height - pt.y) >> 5 << 1;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   952
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   953
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   954
	assert(width > 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   955
	assert(height > 0);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
   956
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   957
	direction = false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   958
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   959
	do {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   960
		int width_cur = width;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   961
		int x_cur = x;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   962
		int y_cur = y;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
   963
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   964
		do {
4238
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   965
			TileType tt;
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   966
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   967
			ti.x = x_cur;
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   968
			ti.y = y_cur;
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   969
			if (0 <= x_cur && x_cur < (int)MapMaxX() * TILE_SIZE &&
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   970
					0 <= y_cur && y_cur < (int)MapMaxY() * TILE_SIZE) {
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   971
				TileIndex tile = TileVirtXY(x_cur, y_cur);
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   972
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   973
				ti.tile = tile;
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   974
				ti.tileh = GetTileSlope(tile, &ti.z);
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   975
				tt = GetTileType(tile);
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   976
			} else {
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   977
				ti.tileh = SLOPE_FLAT;
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   978
				ti.tile = 0;
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   979
				ti.z = 0;
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   980
				tt = MP_VOID;
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   981
			}
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   982
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   983
			y_cur += 0x10;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   984
			x_cur -= 0x10;
5752
7e417aab8074 (svn r7794) -Cleanup: Remove obsolete, never-used landscape rotation code. And spell obsolete correctly.
peter1138
parents: 5726
diff changeset
   985
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   986
			_vd.foundation_part = FOUNDATION_PART_NONE;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   987
			_vd.foundation[0] = -1;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   988
			_vd.foundation[1] = -1;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   989
			_vd.last_foundation_child[0] = NULL;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
   990
			_vd.last_foundation_child[1] = NULL;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
   991
4238
e017178ca040 (svn r5806) Inline FindLandscapeHeight() into its only remaining caller and remove the attribute "type" from struct TileInfo
tron
parents: 4231
diff changeset
   992
			_tile_type_procs[tt]->draw_tile_proc(&ti);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   993
			DrawTileSelection(&ti);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   994
		} while (--width_cur);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
   995
5752
7e417aab8074 (svn r7794) -Cleanup: Remove obsolete, never-used landscape rotation code. And spell obsolete correctly.
peter1138
parents: 5726
diff changeset
   996
		if ((direction ^= 1) != 0) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   997
			y += 0x10;
5752
7e417aab8074 (svn r7794) -Cleanup: Remove obsolete, never-used landscape rotation code. And spell obsolete correctly.
peter1138
parents: 5726
diff changeset
   998
		} else {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   999
			x += 0x10;
5752
7e417aab8074 (svn r7794) -Cleanup: Remove obsolete, never-used landscape rotation code. And spell obsolete correctly.
peter1138
parents: 5726
diff changeset
  1000
		}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  1001
	} while (--height);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1002
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1003
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1004
410
8de2aaf20800 (svn r607) -Patch: [ 985102 ] static cleanup
tron
parents: 395
diff changeset
  1005
static void ViewportAddTownNames(DrawPixelInfo *dpi)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1006
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1007
	Town *t;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1008
	int left, top, right, bottom;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1009
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8419
diff changeset
  1010
	if (!HasBit(_display_opt, DO_SHOW_TOWN_NAMES) || _game_mode == GM_MENU)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1011
		return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1012
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1013
	left = dpi->left;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1014
	top = dpi->top;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1015
	right = left + dpi->width;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1016
	bottom = top + dpi->height;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1017
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1018
	switch (dpi->zoom) {
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1019
		case ZOOM_LVL_NORMAL:
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1020
			FOR_ALL_TOWNS(t) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1021
				if (bottom > t->sign.top &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1022
						top    < t->sign.top + 12 &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1023
						right  > t->sign.left &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1024
						left   < t->sign.left + t->sign.width_1) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1025
					AddStringToDraw(t->sign.left + 1, t->sign.top + 1,
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10771
diff changeset
  1026
						_settings_client.gui.population_in_label ? STR_TOWN_LABEL_POP : STR_TOWN_LABEL,
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1027
						t->index, t->population);
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1028
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1029
			}
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1030
			break;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1031
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1032
		case ZOOM_LVL_OUT_2X:
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1033
			right += 2;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1034
			bottom += 2;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1035
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1036
			FOR_ALL_TOWNS(t) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1037
				if (bottom > t->sign.top &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1038
						top    < t->sign.top + 24 &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1039
						right  > t->sign.left &&
10229
fba3f9fa44d7 (svn r12761) -Codechange: lots of minor whitespace coding style fixes around operators.
rubidium
parents: 10217
diff changeset
  1040
						left   < t->sign.left + t->sign.width_1 * 2) {
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1041
					AddStringToDraw(t->sign.left + 1, t->sign.top + 1,
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10771
diff changeset
  1042
						_settings_client.gui.population_in_label ? STR_TOWN_LABEL_POP : STR_TOWN_LABEL,
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1043
						t->index, t->population);
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1044
				}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  1045
			}
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1046
			break;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1047
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1048
		case ZOOM_LVL_OUT_4X:
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1049
		case ZOOM_LVL_OUT_8X:
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1050
			right += ScaleByZoom(1, dpi->zoom);
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1051
			bottom += ScaleByZoom(1, dpi->zoom) + 1;
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1052
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1053
			FOR_ALL_TOWNS(t) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1054
				if (bottom > t->sign.top &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1055
						top    < t->sign.top + ScaleByZoom(12, dpi->zoom) &&
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1056
						right  > t->sign.left &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1057
						left   < t->sign.left + ScaleByZoom(t->sign.width_2, dpi->zoom)) {
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1058
					AddStringToDraw(t->sign.left + 5, t->sign.top + 1, STR_TOWN_LABEL_TINY_BLACK, t->index, 0);
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1059
					AddStringToDraw(t->sign.left + 1, t->sign.top - 3, STR_TOWN_LABEL_TINY_WHITE, t->index, 0);
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1060
				}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  1061
			}
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1062
			break;
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1063
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1064
		default: NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1065
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1066
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1067
5025
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1068
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1069
static void AddStation(const Station *st, StringID str, uint16 width)
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1070
{
10202
19da84f6725c (svn r12734) -Codechange: use a vector instead of allocating memory in a big byte array for StringSpriteToDraw.
rubidium
parents: 10164
diff changeset
  1071
	AddStringToDraw(st->sign.left + 1, st->sign.top + 1, str, st->index, st->facilities, (st->owner == OWNER_NONE || st->facilities == 0) ? 0xE : _player_colors[st->owner], width);
5025
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1072
}
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1073
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1074
410
8de2aaf20800 (svn r607) -Patch: [ 985102 ] static cleanup
tron
parents: 395
diff changeset
  1075
static void ViewportAddStationNames(DrawPixelInfo *dpi)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1076
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1077
	int left, top, right, bottom;
5025
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1078
	const Station *st;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1079
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8419
diff changeset
  1080
	if (!HasBit(_display_opt, DO_SHOW_STATION_NAMES) || _game_mode == GM_MENU)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1081
		return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1082
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1083
	left = dpi->left;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1084
	top = dpi->top;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1085
	right = left + dpi->width;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1086
	bottom = top + dpi->height;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1087
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1088
	switch (dpi->zoom) {
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1089
		case ZOOM_LVL_NORMAL:
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1090
			FOR_ALL_STATIONS(st) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1091
				if (bottom > st->sign.top &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1092
						top    < st->sign.top + 12 &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1093
						right  > st->sign.left &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1094
						left   < st->sign.left + st->sign.width_1) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1095
					AddStation(st, STR_305C_0, st->sign.width_1);
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1096
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1097
			}
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1098
			break;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1099
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1100
		case ZOOM_LVL_OUT_2X:
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1101
			right += 2;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1102
			bottom += 2;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1103
			FOR_ALL_STATIONS(st) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1104
				if (bottom > st->sign.top &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1105
						top    < st->sign.top + 24 &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1106
						right  > st->sign.left &&
10229
fba3f9fa44d7 (svn r12761) -Codechange: lots of minor whitespace coding style fixes around operators.
rubidium
parents: 10217
diff changeset
  1107
						left   < st->sign.left + st->sign.width_1 * 2) {
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1108
					AddStation(st, STR_305C_0, st->sign.width_1);
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1109
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1110
			}
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1111
			break;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1112
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1113
		case ZOOM_LVL_OUT_4X:
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1114
		case ZOOM_LVL_OUT_8X:
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1115
			right += ScaleByZoom(1, dpi->zoom);
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1116
			bottom += ScaleByZoom(1, dpi->zoom) + 1;
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1117
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1118
			FOR_ALL_STATIONS(st) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1119
				if (bottom > st->sign.top &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1120
						top    < st->sign.top + ScaleByZoom(12, dpi->zoom) &&
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1121
						right  > st->sign.left &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1122
						left   < st->sign.left + ScaleByZoom(st->sign.width_2, dpi->zoom)) {
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1123
					AddStation(st, STR_STATION_SIGN_TINY, st->sign.width_2 | 0x8000);
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1124
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1125
			}
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1126
			break;
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1127
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1128
		default: NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1129
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1130
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1131
5025
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1132
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1133
static void AddSign(const Sign *si, StringID str, uint16 width)
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1134
{
10202
19da84f6725c (svn r12734) -Codechange: use a vector instead of allocating memory in a big byte array for StringSpriteToDraw.
rubidium
parents: 10164
diff changeset
  1135
	AddStringToDraw(si->sign.left + 1, si->sign.top + 1, str, si->index, 0, (si->owner == OWNER_NONE) ? 14 : _player_colors[si->owner], width);
5025
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1136
}
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1137
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1138
410
8de2aaf20800 (svn r607) -Patch: [ 985102 ] static cleanup
tron
parents: 395
diff changeset
  1139
static void ViewportAddSigns(DrawPixelInfo *dpi)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1140
{
5025
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1141
	const Sign *si;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1142
	int left, top, right, bottom;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1143
9302
4aa3c4a44b16 (svn r12547) -Feature: invisibility options to make objects invisible instead of transparent
smatz
parents: 9294
diff changeset
  1144
	/* Signs are turned off or are invisible */
4aa3c4a44b16 (svn r12547) -Feature: invisibility options to make objects invisible instead of transparent
smatz
parents: 9294
diff changeset
  1145
	if (!HasBit(_display_opt, DO_SHOW_SIGNS) || IsInvisibilitySet(TO_SIGNS)) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1146
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1147
	left = dpi->left;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1148
	top = dpi->top;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1149
	right = left + dpi->width;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1150
	bottom = top + dpi->height;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1151
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1152
	switch (dpi->zoom) {
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1153
		case ZOOM_LVL_NORMAL:
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1154
			FOR_ALL_SIGNS(si) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1155
				if (bottom > si->sign.top &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1156
						top    < si->sign.top + 12 &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1157
						right  > si->sign.left &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1158
						left   < si->sign.left + si->sign.width_1) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1159
					AddSign(si, STR_2806, si->sign.width_1);
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1160
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1161
			}
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1162
			break;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1163
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1164
		case ZOOM_LVL_OUT_2X:
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1165
			right += 2;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1166
			bottom += 2;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1167
			FOR_ALL_SIGNS(si) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1168
				if (bottom > si->sign.top &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1169
						top    < si->sign.top + 24 &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1170
						right  > si->sign.left &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1171
						left   < si->sign.left + si->sign.width_1 * 2) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1172
					AddSign(si, STR_2806, si->sign.width_1);
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1173
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1174
			}
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1175
			break;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1176
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1177
		case ZOOM_LVL_OUT_4X:
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1178
		case ZOOM_LVL_OUT_8X:
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1179
			right += ScaleByZoom(1, dpi->zoom);
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1180
			bottom += ScaleByZoom(1, dpi->zoom) + 1;
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1181
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1182
			FOR_ALL_SIGNS(si) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1183
				if (bottom > si->sign.top &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1184
						top    < si->sign.top + ScaleByZoom(12, dpi->zoom) &&
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1185
						right  > si->sign.left &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1186
						left   < si->sign.left + ScaleByZoom(si->sign.width_2, dpi->zoom)) {
8447
286f94800163 (svn r11507) -Fix [FS#1463]: signs totally illegible when transparant signs is turned on and zoomed out more than one level.
rubidium
parents: 8427
diff changeset
  1187
					AddSign(si, IsTransparencySet(TO_SIGNS) ? STR_2002_WHITE : STR_2002, si->sign.width_2 | 0x8000);
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1188
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1189
			}
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1190
			break;
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1191
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1192
		default: NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1193
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1194
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1195
5025
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1196
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1197
static void AddWaypoint(const Waypoint *wp, StringID str, uint16 width)
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1198
{
10202
19da84f6725c (svn r12734) -Codechange: use a vector instead of allocating memory in a big byte array for StringSpriteToDraw.
rubidium
parents: 10164
diff changeset
  1199
	AddStringToDraw(wp->sign.left + 1, wp->sign.top + 1, str, wp->index, 0, (wp->deleted ? 0xE : 11), width);
5025
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1200
}
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1201
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1202
410
8de2aaf20800 (svn r607) -Patch: [ 985102 ] static cleanup
tron
parents: 395
diff changeset
  1203
static void ViewportAddWaypoints(DrawPixelInfo *dpi)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1204
{
5025
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1205
	const Waypoint *wp;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1206
	int left, top, right, bottom;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1207
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8419
diff changeset
  1208
	if (!HasBit(_display_opt, DO_WAYPOINTS))
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1209
		return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1210
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1211
	left = dpi->left;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1212
	top = dpi->top;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1213
	right = left + dpi->width;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1214
	bottom = top + dpi->height;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1215
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1216
	switch (dpi->zoom) {
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1217
		case ZOOM_LVL_NORMAL:
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1218
			FOR_ALL_WAYPOINTS(wp) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1219
				if (bottom > wp->sign.top &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1220
						top    < wp->sign.top + 12 &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1221
						right  > wp->sign.left &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1222
						left   < wp->sign.left + wp->sign.width_1) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1223
					AddWaypoint(wp, STR_WAYPOINT_VIEWPORT, wp->sign.width_1);
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1224
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1225
			}
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1226
			break;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1227
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1228
		case ZOOM_LVL_OUT_2X:
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1229
			right += 2;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1230
			bottom += 2;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1231
			FOR_ALL_WAYPOINTS(wp) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1232
				if (bottom > wp->sign.top &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1233
						top    < wp->sign.top + 24 &&
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1234
						right  > wp->sign.left &&
10229
fba3f9fa44d7 (svn r12761) -Codechange: lots of minor whitespace coding style fixes around operators.
rubidium
parents: 10217
diff changeset
  1235
						left   < wp->sign.left + wp->sign.width_1 * 2) {
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1236
					AddWaypoint(wp, STR_WAYPOINT_VIEWPORT, wp->sign.width_1);
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1237
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1238
			}
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1239
			break;
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1240
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1241
		case ZOOM_LVL_OUT_4X:
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1242
		case ZOOM_LVL_OUT_8X:
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1243
			right += ScaleByZoom(1, dpi->zoom);
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1244
			bottom += ScaleByZoom(1, dpi->zoom) + 1;
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1245
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1246
			FOR_ALL_WAYPOINTS(wp) {
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1247
				if (bottom > wp->sign.top &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1248
						top    < wp->sign.top + ScaleByZoom(12, dpi->zoom) &&
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1249
						right  > wp->sign.left &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1250
						left   < wp->sign.left + ScaleByZoom(wp->sign.width_2, dpi->zoom)) {
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1251
					AddWaypoint(wp, STR_WAYPOINT_VIEWPORT_TINY, wp->sign.width_2 | 0x8000);
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1252
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1253
			}
5027
1141f07a15b4 (svn r7068) if () cascades -> switch ()
tron
parents: 5026
diff changeset
  1254
			break;
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1255
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1256
		default: NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1257
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1258
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1259
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1260
void UpdateViewportSignPos(ViewportSign *sign, int left, int top, StringID str)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1261
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1262
	char buffer[128];
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1263
	uint w;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1264
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1265
	sign->top = top;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1266
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4885
diff changeset
  1267
	GetString(buffer, str, lastof(buffer));
4609
6c337b3fbf4b (svn r6462) -Codechange: Have GetStringWidth() return width as well as the height bounding
Darkvater
parents: 4539
diff changeset
  1268
	w = GetStringBoundingBox(buffer).width + 3;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1269
	sign->width_1 = w;
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1270
	sign->left = left - w / 2;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1271
4609
6c337b3fbf4b (svn r6462) -Codechange: Have GetStringWidth() return width as well as the height bounding
Darkvater
parents: 4539
diff changeset
  1272
	/* zoomed out version */
3798
37a2090eac94 (svn r4802) - Codechange: replace _stringwidth_base and associated magic numbers with a FontSize enum, using the numbers (which are SpriteIDs) in only the places needed.
peter1138
parents: 3645
diff changeset
  1273
	_cur_fontsize = FS_SMALL;
4609
6c337b3fbf4b (svn r6462) -Codechange: Have GetStringWidth() return width as well as the height bounding
Darkvater
parents: 4539
diff changeset
  1274
	w = GetStringBoundingBox(buffer).width + 3;
3798
37a2090eac94 (svn r4802) - Codechange: replace _stringwidth_base and associated magic numbers with a FontSize enum, using the numbers (which are SpriteIDs) in only the places needed.
peter1138
parents: 3645
diff changeset
  1275
	_cur_fontsize = FS_NORMAL;
1390
53a5713cf3f9 (svn r1894) - Codechange: cleaned up the console a bit, wholly unified handling of text with that of editboxes
Darkvater
parents: 1363
diff changeset
  1276
	sign->width_2 = w;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1277
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1278
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1279
10203
766c98a973c5 (svn r12735) -Codechange: use a vector instead of allocating memory in a byte array for TileSpriteToDraw.
rubidium
parents: 10202
diff changeset
  1280
static void ViewportDrawTileSprites(const TileSpriteToDrawVector *tstdv)
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  1281
{
10205
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
  1282
	const TileSpriteToDraw *tsend = tstdv->End();
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
  1283
	for (const TileSpriteToDraw *ts = tstdv->Begin(); ts != tsend; ++ts) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1284
		Point pt = RemapCoords(ts->x, ts->y, ts->z);
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
  1285
		DrawSprite(ts->image, ts->pal, pt.x, pt.y, ts->sub);
10203
766c98a973c5 (svn r12735) -Codechange: use a vector instead of allocating memory in a byte array for TileSpriteToDraw.
rubidium
parents: 10202
diff changeset
  1286
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1287
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1288
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1289
static void ViewportSortParentSprites(ParentSpriteToSortVector *psdv)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1290
{
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1291
	ParentSpriteToDraw **psdvend = psdv->End();
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1292
	ParentSpriteToDraw **psd = psdv->Begin();
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1293
	while (psd != psdvend) {
10204
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1294
		ParentSpriteToDraw *ps = *psd;
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1295
10206
69c8c35ffa7e (svn r12738) -Fix (r12736): some sprites could be left unsorted
smatz
parents: 10205
diff changeset
  1296
		if (ps->comparison_done) {
69c8c35ffa7e (svn r12738) -Fix (r12736): some sprites could be left unsorted
smatz
parents: 10205
diff changeset
  1297
			psd++;
69c8c35ffa7e (svn r12738) -Fix (r12736): some sprites could be left unsorted
smatz
parents: 10205
diff changeset
  1298
			continue;
69c8c35ffa7e (svn r12738) -Fix (r12736): some sprites could be left unsorted
smatz
parents: 10205
diff changeset
  1299
		}
10204
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1300
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1301
		ps->comparison_done = true;
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1302
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1303
		for (ParentSpriteToDraw **psd2 = psd + 1; psd2 != psdvend; psd2++) {
10204
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1304
			ParentSpriteToDraw *ps2 = *psd2;
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1305
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1306
			if (ps2->comparison_done) continue;
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1307
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1308
			/* Decide which comparator to use, based on whether the bounding
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1309
			 * boxes overlap
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1310
			 */
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1311
			if (ps->xmax >= ps2->xmin && ps->xmin <= ps2->xmax && // overlap in X?
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1312
					ps->ymax >= ps2->ymin && ps->ymin <= ps2->ymax && // overlap in Y?
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1313
					ps->zmax >= ps2->zmin && ps->zmin <= ps2->zmax) { // overlap in Z?
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1314
				/* Use X+Y+Z as the sorting order, so sprites closer to the bottom of
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1315
				 * the screen and with higher Z elevation, are drawn in front.
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1316
				 * Here X,Y,Z are the coordinates of the "center of mass" of the sprite,
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1317
				 * i.e. X=(left+right)/2, etc.
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1318
				 * However, since we only care about order, don't actually divide / 2
4187
50b94420d9a2 (svn r5629) Simplify the test whether two bounding boxes overlap
tron
parents: 4186
diff changeset
  1319
				 */
10204
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1320
				if (ps->xmin + ps->xmax + ps->ymin + ps->ymax + ps->zmin + ps->zmax <=
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1321
						ps2->xmin + ps2->xmax + ps2->ymin + ps2->ymax + ps2->zmin + ps2->zmax) {
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1322
					continue;
1934
b3d568113d4d (svn r2440) - Fix: [newgrf] Fix the spritesorter to handle overlapping sprites properly, this fixes display problems with really short wagons. (algorithm by patchman, ported by therax)
hackykid
parents: 1932
diff changeset
  1323
				}
10204
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1324
			} else {
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1325
				/* We only change the order, if it is definite.
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1326
				 * I.e. every single order of X, Y, Z says ps2 is behind ps or they overlap.
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1327
				 * That is: If one partial order says ps behind ps2, do not change the order.
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1328
				 */
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1329
				if (ps->xmax < ps2->xmin ||
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1330
						ps->ymax < ps2->ymin ||
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1331
						ps->zmax < ps2->zmin) {
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1332
					continue;
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1333
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1334
			}
10204
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1335
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1336
			/* Swap the two sprites ps and ps2 using bubble-sort algorithm. */
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1337
			ParentSpriteToDraw **psd3 = psd;
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1338
			do {
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1339
				ParentSpriteToDraw *temp = *psd3;
10204
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1340
				*psd3 = ps2;
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1341
				ps2 = temp;
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1342
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1343
				psd3++;
5d58118e6820 (svn r12736) -Codechange: a (small) touch of coding style in viewport.cpp.
rubidium
parents: 10203
diff changeset
  1344
			} while (psd3 <= psd2);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1345
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1346
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1347
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1348
10208
98dc9f65629e (svn r12740) -Codechange: use a vector instead of allocating memory in a byte array for ChildScreenSpriteToDraw.
rubidium
parents: 10207
diff changeset
  1349
static void ViewportDrawParentSprites(const ParentSpriteToSortVector *psd, const ChildScreenSpriteToDrawVector *csstdv)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1350
{
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1351
	const ParentSpriteToDraw * const *psd_end = psd->End();
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1352
	for (const ParentSpriteToDraw * const *it = psd->Begin(); it != psd_end; it++) {
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1353
		const ParentSpriteToDraw *ps = *it;
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
  1354
		if (ps->image != SPR_EMPTY_BOUNDING_BOX) DrawSprite(ps->image, ps->pal, ps->x, ps->y, ps->sub);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1355
10984
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
  1356
		int child_idx = ps->first_child;
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
  1357
		while (child_idx >= 0) {
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
  1358
			const ChildScreenSpriteToDraw *cs = csstdv->Get(child_idx);
05660d38d316 (svn r13538) -Fix (r12740)[FS#2087]: ChildSprites of foundations are not necessarily consecutive.
frosch
parents: 10947
diff changeset
  1359
			child_idx = cs->next;
8177
f0bcc8e149f3 (svn r11212) -Codechange: add support for drawing parts of sprites. Patch by frosch.
rubidium
parents: 8175
diff changeset
  1360
			DrawSprite(cs->image, cs->pal, ps->left + cs->x, ps->top + cs->y, cs->sub);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1361
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1362
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1363
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1364
8139
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1365
/**
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1366
 * Draws the bounding boxes of all ParentSprites
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1367
 * @param psd Array of ParentSprites
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1368
 */
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1369
static void ViewportDrawBoundingBoxes(const ParentSpriteToSortVector *psd)
8139
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1370
{
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1371
	const ParentSpriteToDraw * const *psd_end = psd->End();
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1372
	for (const ParentSpriteToDraw * const *it = psd->Begin(); it != psd_end; it++) {
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1373
		const ParentSpriteToDraw *ps = *it;
8139
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1374
		Point pt1 = RemapCoords(ps->xmax + 1, ps->ymax + 1, ps->zmax + 1); // top front corner
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1375
		Point pt2 = RemapCoords(ps->xmin    , ps->ymax + 1, ps->zmax + 1); // top left corner
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1376
		Point pt3 = RemapCoords(ps->xmax + 1, ps->ymin    , ps->zmax + 1); // top right corner
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1377
		Point pt4 = RemapCoords(ps->xmax + 1, ps->ymax + 1, ps->zmin    ); // bottom front corner
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1378
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1379
		DrawBox(        pt1.x,         pt1.y,
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1380
		        pt2.x - pt1.x, pt2.y - pt1.y,
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1381
		        pt3.x - pt1.x, pt3.y - pt1.y,
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1382
		        pt4.x - pt1.x, pt4.y - pt1.y);
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1383
	}
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1384
}
16ad832aa538 (svn r11174) -Codechange: add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Patch by frosch.
rubidium
parents: 8113
diff changeset
  1385
10202
19da84f6725c (svn r12734) -Codechange: use a vector instead of allocating memory in a big byte array for StringSpriteToDraw.
rubidium
parents: 10164
diff changeset
  1386
static void ViewportDrawStrings(DrawPixelInfo *dpi, const StringSpriteToDrawVector *sstdv)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1387
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1388
	DrawPixelInfo dp;
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1389
	ZoomLevel zoom;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  1390
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1391
	_cur_dpi = &dp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1392
	dp = *dpi;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1393
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1394
	zoom = dp.zoom;
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1395
	dp.zoom = ZOOM_LVL_NORMAL;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1396
7150
2cfe4a46fa1c (svn r9885) -Fix r9846: some last bitshifts with zoom-levels that were forgotten
truelight
parents: 7149
diff changeset
  1397
	dp.left   = UnScaleByZoom(dp.left,   zoom);
2cfe4a46fa1c (svn r9885) -Fix r9846: some last bitshifts with zoom-levels that were forgotten
truelight
parents: 7149
diff changeset
  1398
	dp.top    = UnScaleByZoom(dp.top,    zoom);
2cfe4a46fa1c (svn r9885) -Fix r9846: some last bitshifts with zoom-levels that were forgotten
truelight
parents: 7149
diff changeset
  1399
	dp.width  = UnScaleByZoom(dp.width,  zoom);
2cfe4a46fa1c (svn r9885) -Fix r9846: some last bitshifts with zoom-levels that were forgotten
truelight
parents: 7149
diff changeset
  1400
	dp.height = UnScaleByZoom(dp.height, zoom);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1401
10205
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
  1402
	const StringSpriteToDraw *ssend = sstdv->End();
d37e906c7070 (svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
peter1138
parents: 10204
diff changeset
  1403
	for (const StringSpriteToDraw *ss = sstdv->Begin(); ss != ssend; ++ss) {
5025
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1404
		uint16 colour;
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1405
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1406
		if (ss->width != 0) {
9302
4aa3c4a44b16 (svn r12547) -Feature: invisibility options to make objects invisible instead of transparent
smatz
parents: 9294
diff changeset
  1407
			/* Do not draw signs nor station names if they are set invisible */
10202
19da84f6725c (svn r12734) -Codechange: use a vector instead of allocating memory in a big byte array for StringSpriteToDraw.
rubidium
parents: 10164
diff changeset
  1408
			if (IsInvisibilitySet(TO_SIGNS) && ss->string != STR_2806) continue;
9302
4aa3c4a44b16 (svn r12547) -Feature: invisibility options to make objects invisible instead of transparent
smatz
parents: 9294
diff changeset
  1409
7150
2cfe4a46fa1c (svn r9885) -Fix r9846: some last bitshifts with zoom-levels that were forgotten
truelight
parents: 7149
diff changeset
  1410
			int x = UnScaleByZoom(ss->x, zoom) - 1;
2cfe4a46fa1c (svn r9885) -Fix r9846: some last bitshifts with zoom-levels that were forgotten
truelight
parents: 7149
diff changeset
  1411
			int y = UnScaleByZoom(ss->y, zoom) - 1;
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1412
			int bottom = y + 11;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1413
			int w = ss->width;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  1414
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1415
			if (w & 0x8000) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1416
				w &= ~0x8000;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1417
				y--;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1418
				bottom -= 6;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1419
				w -= 3;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1420
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1421
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1422
		/* Draw the rectangle if 'tranparent station signs' is off,
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1423
		 * or if we are drawing a general text sign (STR_2806) */
8345
6caa3fdb972c (svn r11399) -Feature(ette): transparency settings can now be saved and thus remembered.
belugas
parents: 8320
diff changeset
  1424
			if (!IsTransparencySet(TO_SIGNS) || ss->string == STR_2806) {
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1425
				DrawFrameRect(
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1426
					x, y, x + w, bottom, ss->color,
8345
6caa3fdb972c (svn r11399) -Feature(ette): transparency settings can now be saved and thus remembered.
belugas
parents: 8320
diff changeset
  1427
					IsTransparencySet(TO_SIGNS) ? FR_TRANSPARENT : FR_NONE
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1428
				);
6923
6913c8a82cc0 (svn r9563) -Feature: Add more finer control to transparency options, including a new toolbar, accessible from the map menu or Ctrl X. Patch by Wolf01.
peter1138
parents: 6919
diff changeset
  1429
			}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1430
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1431
534
17ab2f22ff74 (svn r901) Small step in the process to clean up the DPARAM mess:
tron
parents: 507
diff changeset
  1432
		SetDParam(0, ss->params[0]);
17ab2f22ff74 (svn r901) Small step in the process to clean up the DPARAM mess:
tron
parents: 507
diff changeset
  1433
		SetDParam(1, ss->params[1]);
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1434
		/* if we didn't draw a rectangle, or if transparant building is on,
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1435
		 * draw the text in the color the rectangle would have */
8345
6caa3fdb972c (svn r11399) -Feature(ette): transparency settings can now be saved and thus remembered.
belugas
parents: 8320
diff changeset
  1436
		if (IsTransparencySet(TO_SIGNS) && ss->string != STR_2806 && ss->width != 0) {
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1437
			/* Real colors need the IS_PALETTE_COLOR flag
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1438
			 * otherwise colors from _string_colormap are assumed. */
5025
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1439
			colour = _colour_gradient[ss->color][6] | IS_PALETTE_COLOR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1440
		} else {
8320
6ffad7a5d242 (svn r11374) -Codechange: Give meaning to the magical number that specifies the color of the text in a DrawString call.
belugas
parents: 8265
diff changeset
  1441
			colour = TC_BLACK;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1442
		}
5025
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1443
		DrawString(
7150
2cfe4a46fa1c (svn r9885) -Fix r9846: some last bitshifts with zoom-levels that were forgotten
truelight
parents: 7149
diff changeset
  1444
			UnScaleByZoom(ss->x, zoom), UnScaleByZoom(ss->y, zoom) - (ss->width & 0x8000 ? 2 : 0),
5025
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1445
			ss->string, colour
48314eb3efde (svn r7066) -Codechange: Factorise common code
tron
parents: 5014
diff changeset
  1446
		);
10203
766c98a973c5 (svn r12735) -Codechange: use a vector instead of allocating memory in a byte array for TileSpriteToDraw.
rubidium
parents: 10202
diff changeset
  1447
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1448
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1449
430
75820dedf4f1 (svn r631) Merge r440, r444, r485, r630 to trunk:
tron
parents: 410
diff changeset
  1450
void ViewportDoDraw(const ViewPort *vp, int left, int top, int right, int bottom)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1451
{
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1452
	DrawPixelInfo *old_dpi = _cur_dpi;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1453
	_cur_dpi = &_vd.dpi;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1454
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1455
	_vd.dpi.zoom = vp->zoom;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1456
	int mask = ScaleByZoom(-1, vp->zoom);
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1457
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1458
	_vd.combine_sprites = 0;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1459
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1460
	_vd.dpi.width = (right - left) & mask;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1461
	_vd.dpi.height = (bottom - top) & mask;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1462
	_vd.dpi.left = left & mask;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1463
	_vd.dpi.top = top & mask;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1464
	_vd.dpi.pitch = old_dpi->pitch;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1465
	_vd.last_child = NULL;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1466
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1467
	int x = UnScaleByZoom(_vd.dpi.left - (vp->virtual_left & mask), vp->zoom) + vp->left;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1468
	int y = UnScaleByZoom(_vd.dpi.top - (vp->virtual_top & mask), vp->zoom) + vp->top;
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1469
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1470
	_vd.dpi.dst_ptr = BlitterFactoryBase::GetCurrentBlitter()->MoveTo(old_dpi->dst_ptr, x - old_dpi->left, y - old_dpi->top);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1471
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1472
	ViewportAddLandscape();
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1473
	ViewportAddVehicles(&_vd.dpi);
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1474
	DrawTextEffects(&_vd.dpi);
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1475
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1476
	ViewportAddTownNames(&_vd.dpi);
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1477
	ViewportAddStationNames(&_vd.dpi);
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1478
	ViewportAddSigns(&_vd.dpi);
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1479
	ViewportAddWaypoints(&_vd.dpi);
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1480
11017
115b1bf01e5e (svn r13573) -Codechange: Use smallvec class functions instead of class members
skidd13
parents: 10984
diff changeset
  1481
	if (_vd.tile_sprites_to_draw.Length() != 0) ViewportDrawTileSprites(&_vd.tile_sprites_to_draw);
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1482
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1483
	ParentSpriteToDraw *psd_end = _vd.parent_sprites_to_draw.End();
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1484
	for (ParentSpriteToDraw *it = _vd.parent_sprites_to_draw.Begin(); it != psd_end; it++) {
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1485
		*_vd.parent_sprites_to_sort.Append() = it;
10207
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1486
	}
0bdc24d88198 (svn r12739) -Codechange: use a vector instead of allocating memory in a byte array for ParentSpriteToDraw.
rubidium
parents: 10206
diff changeset
  1487
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1488
	ViewportSortParentSprites(&_vd.parent_sprites_to_sort);
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1489
	ViewportDrawParentSprites(&_vd.parent_sprites_to_sort, &_vd.child_screen_sprites_to_draw);
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1490
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1491
	if (_draw_bounding_boxes) ViewportDrawBoundingBoxes(&_vd.parent_sprites_to_sort);
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1492
11017
115b1bf01e5e (svn r13573) -Codechange: Use smallvec class functions instead of class members
skidd13
parents: 10984
diff changeset
  1493
	if (_vd.string_sprites_to_draw.Length() != 0) ViewportDrawStrings(&_vd.dpi, &_vd.string_sprites_to_draw);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  1494
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1495
	_cur_dpi = old_dpi;
10209
13cb37e961f6 (svn r12741) -Codechange: do not allocate the viewport drawer each time on the stack, but only once and reuse this.
rubidium
parents: 10208
diff changeset
  1496
11017
115b1bf01e5e (svn r13573) -Codechange: Use smallvec class functions instead of class members
skidd13
parents: 10984
diff changeset
  1497
	_vd.string_sprites_to_draw.Clear();
115b1bf01e5e (svn r13573) -Codechange: Use smallvec class functions instead of class members
skidd13
parents: 10984
diff changeset
  1498
	_vd.tile_sprites_to_draw.Clear();
115b1bf01e5e (svn r13573) -Codechange: Use smallvec class functions instead of class members
skidd13
parents: 10984
diff changeset
  1499
	_vd.parent_sprites_to_draw.Clear();
115b1bf01e5e (svn r13573) -Codechange: Use smallvec class functions instead of class members
skidd13
parents: 10984
diff changeset
  1500
	_vd.parent_sprites_to_sort.Clear();
115b1bf01e5e (svn r13573) -Codechange: Use smallvec class functions instead of class members
skidd13
parents: 10984
diff changeset
  1501
	_vd.child_screen_sprites_to_draw.Clear();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1502
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1503
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
  1504
/** Make sure we don't draw a too big area at a time.
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
  1505
 * If we do, the sprite memory will overflow. */
5120
e12dfc67761f (svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents: 5045
diff changeset
  1506
static void ViewportDrawChk(const ViewPort *vp, int left, int top, int right, int bottom)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1507
{
7122
0607a15aedc0 (svn r9846) -Codechange: introduced ZOOM_LVL_MIN and ZOOM_LVL_MAX for the obvious reasons
truelight
parents: 7120
diff changeset
  1508
	if (ScaleByZoom(bottom - top, vp->zoom) * ScaleByZoom(right - left, vp->zoom) > 180000) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1509
		if ((bottom - top) > (right - left)) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1510
			int t = (top + bottom) >> 1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1511
			ViewportDrawChk(vp, left, top, right, t);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1512
			ViewportDrawChk(vp, left, t, right, bottom);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1513
		} else {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1514
			int t = (left + right) >> 1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1515
			ViewportDrawChk(vp, left, top, t, bottom);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1516
			ViewportDrawChk(vp, t, top, right, bottom);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1517
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1518
	} else {
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  1519
		ViewportDoDraw(vp,
7122
0607a15aedc0 (svn r9846) -Codechange: introduced ZOOM_LVL_MIN and ZOOM_LVL_MAX for the obvious reasons
truelight
parents: 7120
diff changeset
  1520
			ScaleByZoom(left - vp->left, vp->zoom) + vp->virtual_left,
0607a15aedc0 (svn r9846) -Codechange: introduced ZOOM_LVL_MIN and ZOOM_LVL_MAX for the obvious reasons
truelight
parents: 7120
diff changeset
  1521
			ScaleByZoom(top - vp->top, vp->zoom) + vp->virtual_top,
0607a15aedc0 (svn r9846) -Codechange: introduced ZOOM_LVL_MIN and ZOOM_LVL_MAX for the obvious reasons
truelight
parents: 7120
diff changeset
  1522
			ScaleByZoom(right - vp->left, vp->zoom) + vp->virtual_left,
0607a15aedc0 (svn r9846) -Codechange: introduced ZOOM_LVL_MIN and ZOOM_LVL_MAX for the obvious reasons
truelight
parents: 7120
diff changeset
  1523
			ScaleByZoom(bottom - vp->top, vp->zoom) + vp->virtual_top
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1524
		);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1525
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1526
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1527
5120
e12dfc67761f (svn r7200) -Codechange: remove unneeded redraw (console.c), coding style, use FindWindowById
Darkvater
parents: 5045
diff changeset
  1528
static inline void ViewportDraw(const ViewPort *vp, int left, int top, int right, int bottom)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1529
{
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1530
	if (right <= vp->left || bottom <= vp->top) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1531
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1532
	if (left >= vp->left + vp->width) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1533
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1534
	if (left < vp->left) left = vp->left;
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1535
	if (right > vp->left + vp->width) right = vp->left + vp->width;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1536
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1537
	if (top >= vp->top + vp->height) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1538
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1539
	if (top < vp->top) top = vp->top;
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1540
	if (bottom > vp->top + vp->height) bottom = vp->top + vp->height;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1541
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1542
	ViewportDrawChk(vp, left, top, right, bottom);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1543
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1544
10595
7957c71b0dfe (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium
parents: 10566
diff changeset
  1545
void Window::DrawViewport() const
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1546
{
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1547
	DrawPixelInfo *dpi = _cur_dpi;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1548
10595
7957c71b0dfe (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium
parents: 10566
diff changeset
  1549
	dpi->left += this->left;
7957c71b0dfe (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium
parents: 10566
diff changeset
  1550
	dpi->top += this->top;
7957c71b0dfe (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium
parents: 10566
diff changeset
  1551
7957c71b0dfe (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium
parents: 10566
diff changeset
  1552
	ViewportDraw(this->viewport, dpi->left, dpi->top, dpi->left + dpi->width, dpi->top + dpi->height);
7957c71b0dfe (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium
parents: 10566
diff changeset
  1553
7957c71b0dfe (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium
parents: 10566
diff changeset
  1554
	dpi->left -= this->left;
7957c71b0dfe (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium
parents: 10566
diff changeset
  1555
	dpi->top -= this->top;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1556
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1557
7565
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1558
static inline void ClampViewportToMap(const ViewPort *vp, int &x, int &y)
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1559
{
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1560
	/* Centre of the viewport is hot spot */
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1561
	x += vp->virtual_width / 2;
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1562
	y += vp->virtual_height / 2;
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1563
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1564
	/* Convert viewport coordinates to map coordinates
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1565
	 * Calculation is scaled by 4 to avoid rounding errors */
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1566
	int vx = -x + y * 2;
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1567
	int vy =  x + y * 2;
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1568
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1569
	/* clamp to size of map */
8418
b49fc6be1ab9 (svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents: 8414
diff changeset
  1570
	vx = Clamp(vx, 0, MapMaxX() * TILE_SIZE * 4);
b49fc6be1ab9 (svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents: 8414
diff changeset
  1571
	vy = Clamp(vy, 0, MapMaxY() * TILE_SIZE * 4);
7565
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1572
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1573
	/* Convert map coordinates to viewport coordinates */
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1574
	x = (-vx + vy) / 2;
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1575
	y = ( vx + vy) / 4;
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1576
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1577
	/* Remove centreing */
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1578
	x -= vp->virtual_width / 2;
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1579
	y -= vp->virtual_height / 2;
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1580
}
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1581
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1582
void UpdateViewportPosition(Window *w)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1583
{
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1584
	const ViewPort *vp = w->viewport;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1585
10504
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  1586
	if (w->viewport->follow_vehicle != INVALID_VEHICLE) {
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  1587
		const Vehicle* veh = GetVehicle(w->viewport->follow_vehicle);
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1588
		Point pt = MapXYZToViewport(vp, veh->x_pos, veh->y_pos, veh->z_pos);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1589
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1590
		SetViewportPosition(w, pt.x, pt.y);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1591
	} else {
7565
a2948dd92c0e (svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
peter1138
parents: 7552
diff changeset
  1592
		/* Ensure the destination location is within the map */
10504
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  1593
		ClampViewportToMap(vp, w->viewport->dest_scrollpos_x, w->viewport->dest_scrollpos_y);
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  1594
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  1595
		int delta_x = w->viewport->dest_scrollpos_x - w->viewport->scrollpos_x;
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  1596
		int delta_y = w->viewport->dest_scrollpos_y - w->viewport->scrollpos_y;
7226
a8650d6ecb53 (svn r9962) -Feature: Add smooth viewport scrolling. This must be enabled with patch setting 'smooth_scroll'
peter1138
parents: 7165
diff changeset
  1597
a8650d6ecb53 (svn r9962) -Feature: Add smooth viewport scrolling. This must be enabled with patch setting 'smooth_scroll'
peter1138
parents: 7165
diff changeset
  1598
		if (delta_x != 0 || delta_y != 0) {
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10771
diff changeset
  1599
			if (_settings_client.gui.smooth_scroll) {
7227
41a868cb2c8e (svn r9963) -Fix (r9962): 'smooth_scroll' patch setting was ignored (always on) in some places.
peter1138
parents: 7226
diff changeset
  1600
				int max_scroll = ScaleByMapSize1D(512);
41a868cb2c8e (svn r9963) -Fix (r9962): 'smooth_scroll' patch setting was ignored (always on) in some places.
peter1138
parents: 7226
diff changeset
  1601
				/* Not at our desired positon yet... */
10504
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  1602
				w->viewport->scrollpos_x += Clamp(delta_x / 4, -max_scroll, max_scroll);
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  1603
				w->viewport->scrollpos_y += Clamp(delta_y / 4, -max_scroll, max_scroll);
7227
41a868cb2c8e (svn r9963) -Fix (r9962): 'smooth_scroll' patch setting was ignored (always on) in some places.
peter1138
parents: 7226
diff changeset
  1604
			} else {
10504
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  1605
				w->viewport->scrollpos_x = w->viewport->dest_scrollpos_x;
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  1606
				w->viewport->scrollpos_y = w->viewport->dest_scrollpos_y;
7227
41a868cb2c8e (svn r9963) -Fix (r9962): 'smooth_scroll' patch setting was ignored (always on) in some places.
peter1138
parents: 7226
diff changeset
  1607
			}
7226
a8650d6ecb53 (svn r9962) -Feature: Add smooth viewport scrolling. This must be enabled with patch setting 'smooth_scroll'
peter1138
parents: 7165
diff changeset
  1608
		}
a8650d6ecb53 (svn r9962) -Feature: Add smooth viewport scrolling. This must be enabled with patch setting 'smooth_scroll'
peter1138
parents: 7165
diff changeset
  1609
10504
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  1610
		ClampViewportToMap(vp, w->viewport->scrollpos_x, w->viewport->scrollpos_y);
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  1611
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  1612
		SetViewportPosition(w, w->viewport->scrollpos_x, w->viewport->scrollpos_y);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1613
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1614
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1615
8041
63e760418a15 (svn r11065) -Documentation [FS#1186]: of the dirty marking/repainting subsystem. Patch by Progman.
rubidium
parents: 7993
diff changeset
  1616
/**
10255
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
  1617
 * Marks a viewport as dirty for repaint if it displays (a part of) the area the needs to be repainted.
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
  1618
 * @param vp     The viewport to mark as dirty
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
  1619
 * @param left   Left edge of area to repaint
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
  1620
 * @param top    Top edge of area to repaint
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
  1621
 * @param right  Right edge of area to repaint
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
  1622
 * @param bottom Bottom edge of area to repaint
8041
63e760418a15 (svn r11065) -Documentation [FS#1186]: of the dirty marking/repainting subsystem. Patch by Progman.
rubidium
parents: 7993
diff changeset
  1623
 * @ingroup dirty
63e760418a15 (svn r11065) -Documentation [FS#1186]: of the dirty marking/repainting subsystem. Patch by Progman.
rubidium
parents: 7993
diff changeset
  1624
 */
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1625
static void MarkViewportDirty(const ViewPort *vp, int left, int top, int right, int bottom)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1626
{
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1627
	right -= vp->virtual_left;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1628
	if (right <= 0) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1629
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1630
	bottom -= vp->virtual_top;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1631
	if (bottom <= 0) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1632
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1633
	left = max(0, left - vp->virtual_left);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1634
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1635
	if (left >= vp->virtual_width) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1636
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1637
	top = max(0, top - vp->virtual_top);
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1638
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1639
	if (top >= vp->virtual_height) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1640
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1641
	SetDirtyBlocks(
7122
0607a15aedc0 (svn r9846) -Codechange: introduced ZOOM_LVL_MIN and ZOOM_LVL_MAX for the obvious reasons
truelight
parents: 7120
diff changeset
  1642
		UnScaleByZoom(left, vp->zoom) + vp->left,
0607a15aedc0 (svn r9846) -Codechange: introduced ZOOM_LVL_MIN and ZOOM_LVL_MAX for the obvious reasons
truelight
parents: 7120
diff changeset
  1643
		UnScaleByZoom(top, vp->zoom) + vp->top,
0607a15aedc0 (svn r9846) -Codechange: introduced ZOOM_LVL_MIN and ZOOM_LVL_MAX for the obvious reasons
truelight
parents: 7120
diff changeset
  1644
		UnScaleByZoom(right, vp->zoom) + vp->left,
0607a15aedc0 (svn r9846) -Codechange: introduced ZOOM_LVL_MIN and ZOOM_LVL_MAX for the obvious reasons
truelight
parents: 7120
diff changeset
  1645
		UnScaleByZoom(bottom, vp->zoom) + vp->top
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1646
	);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1647
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1648
10255
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
  1649
/**
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
  1650
 * Mark all viewports that display an area as dirty (in need of repaint).
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
  1651
 * @param left   Left edge of area to repaint
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
  1652
 * @param top    Top edge of area to repaint
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
  1653
 * @param right  Right edge of area to repaint
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
  1654
 * @param bottom Bottom edge of area to repaint
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
  1655
 * @ingroup dirty
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10239
diff changeset
  1656
 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1657
void MarkAllViewportsDirty(int left, int top, int right, int bottom)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1658
{
10217
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
  1659
	Window **wz;
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
  1660
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
  1661
	FOR_ALL_WINDOWS(wz) {
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
  1662
		ViewPort *vp = (*wz)->viewport;
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
  1663
		if (vp != NULL) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1664
			assert(vp->width != 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1665
			MarkViewportDirty(vp, left, top, right, bottom);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1666
		}
10217
691a6b2140c6 (svn r12749) -Codechange: store the viewport information in the windows that have a viewport instead of one global array with a viewport for each window, even when they do not use the viewport.
rubidium
parents: 10209
diff changeset
  1667
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1668
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1669
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1670
void MarkTileDirtyByTile(TileIndex tile)
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1671
{
3421
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  1672
	Point pt = RemapCoords(TileX(tile) * TILE_SIZE, TileY(tile) * TILE_SIZE, GetTileZ(tile));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1673
	MarkAllViewportsDirty(
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1674
		pt.x - 31,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1675
		pt.y - 122,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1676
		pt.x - 31 + 67,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1677
		pt.y - 122 + 154
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1678
	);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1679
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1680
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1681
void MarkTileDirty(int x, int y)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1682
{
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1683
	uint z = 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1684
	Point pt;
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1685
8450
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8447
diff changeset
  1686
	if (IsInsideMM(x, 0, MapSizeX() * TILE_SIZE) &&
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8447
diff changeset
  1687
			IsInsideMM(y, 0, MapSizeY() * TILE_SIZE))
1980
9ea0c89fbb58 (svn r2486) Turn TILE_FROM_XY into an inline function and rename it to TileVirtXY
tron
parents: 1977
diff changeset
  1688
		z = GetTileZ(TileVirtXY(x, y));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1689
	pt = RemapCoords(x, y, z);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1690
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1691
	MarkAllViewportsDirty(
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1692
		pt.x - 31,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1693
		pt.y - 122,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1694
		pt.x - 31 + 67,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1695
		pt.y - 122 + 154
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1696
	);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  1697
}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1698
8041
63e760418a15 (svn r11065) -Documentation [FS#1186]: of the dirty marking/repainting subsystem. Patch by Progman.
rubidium
parents: 7993
diff changeset
  1699
/**
63e760418a15 (svn r11065) -Documentation [FS#1186]: of the dirty marking/repainting subsystem. Patch by Progman.
rubidium
parents: 7993
diff changeset
  1700
 * Marks the selected tiles as dirty.
63e760418a15 (svn r11065) -Documentation [FS#1186]: of the dirty marking/repainting subsystem. Patch by Progman.
rubidium
parents: 7993
diff changeset
  1701
 *
63e760418a15 (svn r11065) -Documentation [FS#1186]: of the dirty marking/repainting subsystem. Patch by Progman.
rubidium
parents: 7993
diff changeset
  1702
 * This function marks the selected tiles as dirty for repaint
63e760418a15 (svn r11065) -Documentation [FS#1186]: of the dirty marking/repainting subsystem. Patch by Progman.
rubidium
parents: 7993
diff changeset
  1703
 *
63e760418a15 (svn r11065) -Documentation [FS#1186]: of the dirty marking/repainting subsystem. Patch by Progman.
rubidium
parents: 7993
diff changeset
  1704
 * @note Documentation may be wrong (Progman)
63e760418a15 (svn r11065) -Documentation [FS#1186]: of the dirty marking/repainting subsystem. Patch by Progman.
rubidium
parents: 7993
diff changeset
  1705
 * @ingroup dirty
63e760418a15 (svn r11065) -Documentation [FS#1186]: of the dirty marking/repainting subsystem. Patch by Progman.
rubidium
parents: 7993
diff changeset
  1706
 */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6443
diff changeset
  1707
static void SetSelectionTilesDirty()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1708
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1709
	int y_size, x_size;
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  1710
	int x = _thd.pos.x;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  1711
	int y = _thd.pos.y;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1712
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  1713
	x_size = _thd.size.x;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  1714
	y_size = _thd.size.y;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1715
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  1716
	if (_thd.outersize.x) {
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  1717
		x_size += _thd.outersize.x;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  1718
		x += _thd.offs.x;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  1719
		y_size += _thd.outersize.y;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  1720
		y += _thd.offs.y;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1721
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1722
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1723
	assert(x_size > 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1724
	assert(y_size > 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1725
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1726
	x_size += x;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1727
	y_size += y;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1728
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1729
	do {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1730
		int y_bk = y;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1731
		do {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1732
			MarkTileDirty(x, y);
3421
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  1733
		} while ( (y += TILE_SIZE) != y_size);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1734
		y = y_bk;
3421
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  1735
	} while ( (x += TILE_SIZE) != x_size);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1736
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1737
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1738
1990
90eb49e87b90 (svn r2496) -Fix: [1179933] When toggling build/remove via keyboard the selection wasn't correctly redrawn
tron
parents: 1980
diff changeset
  1739
void SetSelectionRed(bool b)
90eb49e87b90 (svn r2496) -Fix: [1179933] When toggling build/remove via keyboard the selection wasn't correctly redrawn
tron
parents: 1980
diff changeset
  1740
{
90eb49e87b90 (svn r2496) -Fix: [1179933] When toggling build/remove via keyboard the selection wasn't correctly redrawn
tron
parents: 1980
diff changeset
  1741
	_thd.make_square_red = b;
90eb49e87b90 (svn r2496) -Fix: [1179933] When toggling build/remove via keyboard the selection wasn't correctly redrawn
tron
parents: 1980
diff changeset
  1742
	SetSelectionTilesDirty();
90eb49e87b90 (svn r2496) -Fix: [1179933] When toggling build/remove via keyboard the selection wasn't correctly redrawn
tron
parents: 1980
diff changeset
  1743
}
90eb49e87b90 (svn r2496) -Fix: [1179933] When toggling build/remove via keyboard the selection wasn't correctly redrawn
tron
parents: 1980
diff changeset
  1744
90eb49e87b90 (svn r2496) -Fix: [1179933] When toggling build/remove via keyboard the selection wasn't correctly redrawn
tron
parents: 1980
diff changeset
  1745
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1746
static bool CheckClickOnTown(const ViewPort *vp, int x, int y)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1747
{
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1748
	const Town *t;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1749
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8419
diff changeset
  1750
	if (!HasBit(_display_opt, DO_SHOW_TOWN_NAMES)) return false;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1751
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1752
	switch (vp->zoom) {
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1753
		case ZOOM_LVL_NORMAL:
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1754
			x = x - vp->left + vp->virtual_left;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1755
			y = y - vp->top  + vp->virtual_top;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1756
			FOR_ALL_TOWNS(t) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1757
				if (y >= t->sign.top &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1758
						y < t->sign.top + 12 &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1759
						x >= t->sign.left &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1760
						x < t->sign.left + t->sign.width_1) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1761
					ShowTownViewWindow(t->index);
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1762
					return true;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1763
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1764
			}
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1765
			break;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1766
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1767
		case ZOOM_LVL_OUT_2X:
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1768
			x = (x - vp->left + 1) * 2 + vp->virtual_left;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1769
			y = (y - vp->top  + 1) * 2 + vp->virtual_top;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1770
			FOR_ALL_TOWNS(t) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1771
				if (y >= t->sign.top &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1772
						y < t->sign.top + 24 &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1773
						x >= t->sign.left &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1774
						x < t->sign.left + t->sign.width_1 * 2) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1775
					ShowTownViewWindow(t->index);
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1776
					return true;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1777
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1778
			}
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1779
			break;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1780
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1781
		case ZOOM_LVL_OUT_4X:
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1782
		case ZOOM_LVL_OUT_8X:
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1783
			x = ScaleByZoom(x - vp->left + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_left;
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1784
			y = ScaleByZoom(y - vp->top  + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_top;
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1785
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1786
			FOR_ALL_TOWNS(t) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1787
				if (y >= t->sign.top &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1788
						y < t->sign.top + ScaleByZoom(12, vp->zoom) &&
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1789
						x >= t->sign.left &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1790
						x < t->sign.left + ScaleByZoom(t->sign.width_2, vp->zoom)) {
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1791
					ShowTownViewWindow(t->index);
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1792
					return true;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1793
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1794
			}
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1795
			break;
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1796
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1797
		default: NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1798
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1799
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1800
	return false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1801
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1802
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1803
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1804
static bool CheckClickOnStation(const ViewPort *vp, int x, int y)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1805
{
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1806
	const Station *st;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1807
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8419
diff changeset
  1808
	if (!HasBit(_display_opt, DO_SHOW_STATION_NAMES)) return false;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1809
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1810
	switch (vp->zoom) {
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1811
		case ZOOM_LVL_NORMAL:
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1812
			x = x - vp->left + vp->virtual_left;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1813
			y = y - vp->top  + vp->virtual_top;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1814
			FOR_ALL_STATIONS(st) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1815
				if (y >= st->sign.top &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1816
						y < st->sign.top + 12 &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1817
						x >= st->sign.left &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1818
						x < st->sign.left + st->sign.width_1) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1819
					ShowStationViewWindow(st->index);
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1820
					return true;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1821
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1822
			}
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1823
			break;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1824
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1825
		case ZOOM_LVL_OUT_2X:
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1826
			x = (x - vp->left + 1) * 2 + vp->virtual_left;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1827
			y = (y - vp->top  + 1) * 2 + vp->virtual_top;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1828
			FOR_ALL_STATIONS(st) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1829
				if (y >= st->sign.top &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1830
						y < st->sign.top + 24 &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1831
						x >= st->sign.left &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1832
						x < st->sign.left + st->sign.width_1 * 2) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1833
					ShowStationViewWindow(st->index);
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1834
					return true;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1835
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1836
			}
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1837
			break;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1838
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1839
		case ZOOM_LVL_OUT_4X:
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1840
		case ZOOM_LVL_OUT_8X:
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1841
			x = ScaleByZoom(x - vp->left + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_left;
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1842
			y = ScaleByZoom(y - vp->top  + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_top;
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1843
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1844
			FOR_ALL_STATIONS(st) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1845
				if (y >= st->sign.top &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1846
						y < st->sign.top + ScaleByZoom(12, vp->zoom) &&
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1847
						x >= st->sign.left &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1848
						x < st->sign.left + ScaleByZoom(st->sign.width_2, vp->zoom)) {
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1849
					ShowStationViewWindow(st->index);
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1850
					return true;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1851
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1852
			}
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1853
			break;
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1854
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1855
		default: NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1856
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1857
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1858
	return false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1859
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1860
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1861
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1862
static bool CheckClickOnSign(const ViewPort *vp, int x, int y)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1863
{
4349
2fc39ff2626e (svn r6050) -Codechange: mass-renamed SignStruct -> Sign and ss -> si. Now functions and variables all match eachother
truelight
parents: 4346
diff changeset
  1864
	const Sign *si;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1865
9302
4aa3c4a44b16 (svn r12547) -Feature: invisibility options to make objects invisible instead of transparent
smatz
parents: 9294
diff changeset
  1866
	/* Signs are turned off, or they are transparent and invisibility is ON, or player is a spectator */
4aa3c4a44b16 (svn r12547) -Feature: invisibility options to make objects invisible instead of transparent
smatz
parents: 9294
diff changeset
  1867
	if (!HasBit(_display_opt, DO_SHOW_SIGNS) || IsInvisibilitySet(TO_SIGNS) || _current_player == PLAYER_SPECTATOR) return false;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1868
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1869
	switch (vp->zoom) {
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1870
		case ZOOM_LVL_NORMAL:
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1871
			x = x - vp->left + vp->virtual_left;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1872
			y = y - vp->top  + vp->virtual_top;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1873
			FOR_ALL_SIGNS(si) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1874
				if (y >= si->sign.top &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1875
						y <  si->sign.top + 12 &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1876
						x >= si->sign.left &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1877
						x <  si->sign.left + si->sign.width_1) {
10947
10533a7545b6 (svn r13501) -Feature(tte): ctrl+click on sign you own to remove it (Osai, planetmaker)
smatz
parents: 10775
diff changeset
  1878
					HandleClickOnSign(si);
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1879
					return true;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1880
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1881
			}
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1882
			break;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1883
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1884
		case ZOOM_LVL_OUT_2X:
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1885
			x = (x - vp->left + 1) * 2 + vp->virtual_left;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1886
			y = (y - vp->top  + 1) * 2 + vp->virtual_top;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1887
			FOR_ALL_SIGNS(si) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1888
				if (y >= si->sign.top &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1889
						y <  si->sign.top + 24 &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1890
						x >= si->sign.left &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1891
						x <  si->sign.left + si->sign.width_1 * 2) {
10947
10533a7545b6 (svn r13501) -Feature(tte): ctrl+click on sign you own to remove it (Osai, planetmaker)
smatz
parents: 10775
diff changeset
  1892
					HandleClickOnSign(si);
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1893
					return true;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1894
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1895
			}
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1896
			break;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1897
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1898
		case ZOOM_LVL_OUT_4X:
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1899
		case ZOOM_LVL_OUT_8X:
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1900
			x = ScaleByZoom(x - vp->left + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_left;
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1901
			y = ScaleByZoom(y - vp->top  + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_top;
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1902
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1903
			FOR_ALL_SIGNS(si) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1904
				if (y >= si->sign.top &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1905
						y <  si->sign.top + ScaleByZoom(12, vp->zoom) &&
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1906
						x >= si->sign.left &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1907
						x <  si->sign.left + ScaleByZoom(si->sign.width_2, vp->zoom)) {
10947
10533a7545b6 (svn r13501) -Feature(tte): ctrl+click on sign you own to remove it (Osai, planetmaker)
smatz
parents: 10775
diff changeset
  1908
					HandleClickOnSign(si);
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1909
					return true;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1910
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1911
			}
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1912
			break;
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1913
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1914
		default: NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1915
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1916
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1917
	return false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1918
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1919
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1920
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1921
static bool CheckClickOnWaypoint(const ViewPort *vp, int x, int y)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1922
{
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1923
	const Waypoint *wp;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1924
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8419
diff changeset
  1925
	if (!HasBit(_display_opt, DO_WAYPOINTS)) return false;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1926
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1927
	switch (vp->zoom) {
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1928
		case ZOOM_LVL_NORMAL:
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1929
			x = x - vp->left + vp->virtual_left;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1930
			y = y - vp->top  + vp->virtual_top;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1931
			FOR_ALL_WAYPOINTS(wp) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1932
				if (y >= wp->sign.top &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1933
						y < wp->sign.top + 12 &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1934
						x >= wp->sign.left &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1935
						x < wp->sign.left + wp->sign.width_1) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1936
					ShowRenameWaypointWindow(wp);
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1937
					return true;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1938
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1939
			}
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1940
			break;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1941
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1942
		case ZOOM_LVL_OUT_2X:
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1943
			x = (x - vp->left + 1) * 2 + vp->virtual_left;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1944
			y = (y - vp->top  + 1) * 2 + vp->virtual_top;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1945
			FOR_ALL_WAYPOINTS(wp) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1946
				if (y >= wp->sign.top &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1947
						y < wp->sign.top + 24 &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1948
						x >= wp->sign.left &&
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1949
						x < wp->sign.left + wp->sign.width_1 * 2) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1950
					ShowRenameWaypointWindow(wp);
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1951
					return true;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1952
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1953
			}
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1954
			break;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1955
7120
e31767effc16 (svn r9844) -Codechange: replace zoomlevel with an enum
truelight
parents: 7087
diff changeset
  1956
		case ZOOM_LVL_OUT_4X:
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1957
		case ZOOM_LVL_OUT_8X:
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1958
			x = ScaleByZoom(x - vp->left + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_left;
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1959
			y = ScaleByZoom(y - vp->top  + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_top;
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1960
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1961
			FOR_ALL_WAYPOINTS(wp) {
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1962
				if (y >= wp->sign.top &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1963
						y < wp->sign.top + ScaleByZoom(12, vp->zoom) &&
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1964
						x >= wp->sign.left &&
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1965
						x < wp->sign.left + ScaleByZoom(wp->sign.width_2, vp->zoom)) {
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1966
					ShowRenameWaypointWindow(wp);
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1967
					return true;
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1968
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1969
			}
4471
4134f0452cd6 (svn r6256) if () cascades -> switch ()
tron
parents: 4444
diff changeset
  1970
			break;
7149
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1971
ba2798e551a3 (svn r9884) -Feature: 2 new zoom-out levels: 8 times and 16 times
truelight
parents: 7122
diff changeset
  1972
		default: NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1973
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1974
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1975
	return false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1976
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1977
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1978
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1979
static void CheckClickOnLandscape(const ViewPort *vp, int x, int y)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1980
{
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  1981
	Point pt = TranslateXYToTileCoord(vp, x, y);
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1964
diff changeset
  1982
1980
9ea0c89fbb58 (svn r2486) Turn TILE_FROM_XY into an inline function and rename it to TileVirtXY
tron
parents: 1977
diff changeset
  1983
	if (pt.x != -1) ClickTile(TileVirtXY(pt.x, pt.y));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1984
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1985
2662
42c11a1a0a4b (svn r3204) Make handling of clicking on vehicles a bit less ugly by avoiding function declarations in .c files and unnecessary indirection
tron
parents: 2484
diff changeset
  1986
42c11a1a0a4b (svn r3204) Make handling of clicking on vehicles a bit less ugly by avoiding function declarations in .c files and unnecessary indirection
tron
parents: 2484
diff changeset
  1987
static void SafeShowTrainViewWindow(const Vehicle* v)
42c11a1a0a4b (svn r3204) Make handling of clicking on vehicles a bit less ugly by avoiding function declarations in .c files and unnecessary indirection
tron
parents: 2484
diff changeset
  1988
{
7993
76b0eb3e19c9 (svn r11011) -Fix [FS#1129]: GetFirstVehicleInChain did change the game state while being marked const.
rubidium
parents: 7982
diff changeset
  1989
	if (!IsFrontEngine(v)) v = v->First();
7982
539e32cc37ce (svn r10997) -Codechange: unify the vehicle view window. Patch by PhilSophus.
rubidium
parents: 7829
diff changeset
  1990
	ShowVehicleViewWindow(v);
2662
42c11a1a0a4b (svn r3204) Make handling of clicking on vehicles a bit less ugly by avoiding function declarations in .c files and unnecessary indirection
tron
parents: 2484
diff changeset
  1991
}
42c11a1a0a4b (svn r3204) Make handling of clicking on vehicles a bit less ugly by avoiding function declarations in .c files and unnecessary indirection
tron
parents: 2484
diff changeset
  1992
7353
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7349
diff changeset
  1993
static void SafeShowRoadVehViewWindow(const Vehicle *v)
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7349
diff changeset
  1994
{
7993
76b0eb3e19c9 (svn r11011) -Fix [FS#1129]: GetFirstVehicleInChain did change the game state while being marked const.
rubidium
parents: 7982
diff changeset
  1995
	if (!IsRoadVehFront(v)) v = v->First();
7982
539e32cc37ce (svn r10997) -Codechange: unify the vehicle view window. Patch by PhilSophus.
rubidium
parents: 7829
diff changeset
  1996
	ShowVehicleViewWindow(v);
7353
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7349
diff changeset
  1997
}
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7349
diff changeset
  1998
4171
3fadda3afe70 (svn r5609) CodeChange : Apply coding style
belugas
parents: 4164
diff changeset
  1999
static void Nop(const Vehicle *v) {}
2662
42c11a1a0a4b (svn r3204) Make handling of clicking on vehicles a bit less ugly by avoiding function declarations in .c files and unnecessary indirection
tron
parents: 2484
diff changeset
  2000
4171
3fadda3afe70 (svn r5609) CodeChange : Apply coding style
belugas
parents: 4164
diff changeset
  2001
typedef void OnVehicleClickProc(const Vehicle *v);
2662
42c11a1a0a4b (svn r3204) Make handling of clicking on vehicles a bit less ugly by avoiding function declarations in .c files and unnecessary indirection
tron
parents: 2484
diff changeset
  2002
static OnVehicleClickProc* const _on_vehicle_click_proc[] = {
42c11a1a0a4b (svn r3204) Make handling of clicking on vehicles a bit less ugly by avoiding function declarations in .c files and unnecessary indirection
tron
parents: 2484
diff changeset
  2003
	SafeShowTrainViewWindow,
7353
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7349
diff changeset
  2004
	SafeShowRoadVehViewWindow,
7982
539e32cc37ce (svn r10997) -Codechange: unify the vehicle view window. Patch by PhilSophus.
rubidium
parents: 7829
diff changeset
  2005
	ShowVehicleViewWindow,
539e32cc37ce (svn r10997) -Codechange: unify the vehicle view window. Patch by PhilSophus.
rubidium
parents: 7829
diff changeset
  2006
	ShowVehicleViewWindow,
2662
42c11a1a0a4b (svn r3204) Make handling of clicking on vehicles a bit less ugly by avoiding function declarations in .c files and unnecessary indirection
tron
parents: 2484
diff changeset
  2007
	Nop, // Special vehicles
42c11a1a0a4b (svn r3204) Make handling of clicking on vehicles a bit less ugly by avoiding function declarations in .c files and unnecessary indirection
tron
parents: 2484
diff changeset
  2008
	Nop  // Disaster vehicles
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2009
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2010
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2011
void HandleViewportClicked(const ViewPort *vp, int x, int y)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2012
{
4171
3fadda3afe70 (svn r5609) CodeChange : Apply coding style
belugas
parents: 4164
diff changeset
  2013
	const Vehicle *v;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2014
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2015
	if (CheckClickOnTown(vp, x, y)) return;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2016
	if (CheckClickOnStation(vp, x, y)) return;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2017
	if (CheckClickOnSign(vp, x, y)) return;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2018
	if (CheckClickOnWaypoint(vp, x, y)) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2019
	CheckClickOnLandscape(vp, x, y);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2020
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2021
	v = CheckClickOnVehicle(vp, x, y);
3809
cff6d5e916f7 (svn r4819) -Debug: When clicking on a vehicle in the viewport, the index and address of the vehicle get dumped for "misc" debug levels >= 2
celestar
parents: 3798
diff changeset
  2022
	if (v != NULL) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5137
diff changeset
  2023
		DEBUG(misc, 2, "Vehicle %d (index %d) at %p", v->unitnumber, v->index, v);
6206
67358999d80d (svn r8621) -Codechange: assigned new numbers to the VEH_(type) enum so that VEH_Train is 0, VEH_Road is 1 and so on
bjarni
parents: 6144
diff changeset
  2024
		_on_vehicle_click_proc[v->type](v);
3809
cff6d5e916f7 (svn r4819) -Debug: When clicking on a vehicle in the viewport, the index and address of the vehicle get dumped for "misc" debug levels >= 2
celestar
parents: 3798
diff changeset
  2025
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2026
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2027
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6443
diff changeset
  2028
Vehicle *CheckMouseOverVehicle()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2029
{
4171
3fadda3afe70 (svn r5609) CodeChange : Apply coding style
belugas
parents: 4164
diff changeset
  2030
	const Window *w;
3fadda3afe70 (svn r5609) CodeChange : Apply coding style
belugas
parents: 4164
diff changeset
  2031
	const ViewPort *vp;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2032
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2033
	int x = _cursor.pos.x;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2034
	int y = _cursor.pos.y;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2035
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2036
	w = FindWindowFromPt(x, y);
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2037
	if (w == NULL) return NULL;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2038
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2039
	vp = IsPtInWindowViewport(w, x, y);
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2040
	return (vp != NULL) ? CheckClickOnVehicle(vp, x, y) : NULL;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2041
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2042
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2043
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2044
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6443
diff changeset
  2045
void PlaceObject()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2046
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2047
	Point pt;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2048
	Window *w;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  2049
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2050
	pt = GetTileBelowCursor();
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2051
	if (pt.x == -1) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2052
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2053
	if (_thd.place_mode == VHM_POINT) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2054
		pt.x += 8;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2055
		pt.y += 8;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2056
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2057
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2058
	_tile_fract_coords.x = pt.x & 0xF;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2059
	_tile_fract_coords.y = pt.y & 0xF;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2060
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2061
	w = GetCallbackWnd();
10486
247d43dfa6f1 (svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents: 10466
diff changeset
  2062
	if (w != NULL) w->OnPlaceObject(pt, TileVirtXY(pt.x, pt.y));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2063
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2064
152
c3964b43943e (svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents: 137
diff changeset
  2065
c3964b43943e (svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents: 137
diff changeset
  2066
/* scrolls the viewport in a window to a given location */
7226
a8650d6ecb53 (svn r9962) -Feature: Add smooth viewport scrolling. This must be enabled with patch setting 'smooth_scroll'
peter1138
parents: 7165
diff changeset
  2067
bool ScrollWindowTo(int x , int y, Window *w, bool instant)
152
c3964b43943e (svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents: 137
diff changeset
  2068
{
8969
243021ceca31 (svn r12044) -Fix [FS#1741]: crash when centering on a vehicle (aircraft) that is outside of the map.
rubidium
parents: 8909
diff changeset
  2069
	/* The slope cannot be acquired outside of the map, so make sure we are always within the map. */
243021ceca31 (svn r12044) -Fix [FS#1741]: crash when centering on a vehicle (aircraft) that is outside of the map.
rubidium
parents: 8909
diff changeset
  2070
	Point pt = MapXYZToViewport(w->viewport, x, y, GetSlopeZ(Clamp(x, 0, MapSizeX()), Clamp(y, 0, MapSizeY())));
10504
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  2071
	w->viewport->follow_vehicle = INVALID_VEHICLE;
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  2072
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  2073
	if (w->viewport->dest_scrollpos_x == pt.x && w->viewport->dest_scrollpos_y == pt.y)
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2074
		return false;
152
c3964b43943e (svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents: 137
diff changeset
  2075
7227
41a868cb2c8e (svn r9963) -Fix (r9962): 'smooth_scroll' patch setting was ignored (always on) in some places.
peter1138
parents: 7226
diff changeset
  2076
	if (instant) {
10504
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  2077
		w->viewport->scrollpos_x = pt.x;
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  2078
		w->viewport->scrollpos_y = pt.y;
7226
a8650d6ecb53 (svn r9962) -Feature: Add smooth viewport scrolling. This must be enabled with patch setting 'smooth_scroll'
peter1138
parents: 7165
diff changeset
  2079
	}
a8650d6ecb53 (svn r9962) -Feature: Add smooth viewport scrolling. This must be enabled with patch setting 'smooth_scroll'
peter1138
parents: 7165
diff changeset
  2080
10504
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  2081
	w->viewport->dest_scrollpos_x = pt.x;
7c80c8aaa1df (svn r13047) -Codechange: remove vp_d
glx
parents: 10486
diff changeset
  2082
	w->viewport->dest_scrollpos_y = pt.y;
152
c3964b43943e (svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents: 137
diff changeset
  2083
	return true;
c3964b43943e (svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents: 137
diff changeset
  2084
}
c3964b43943e (svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
darkvater
parents: 137
diff changeset
  2085
7226
a8650d6ecb53 (svn r9962) -Feature: Add smooth viewport scrolling. This must be enabled with patch setting 'smooth_scroll'
peter1138
parents: 7165
diff changeset
  2086
bool ScrollMainWindowToTile(TileIndex tile, bool instant)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2087
{
7226
a8650d6ecb53 (svn r9962) -Feature: Add smooth viewport scrolling. This must be enabled with patch setting 'smooth_scroll'
peter1138
parents: 7165
diff changeset
  2088
	return ScrollMainWindowTo(TileX(tile) * TILE_SIZE + TILE_SIZE / 2, TileY(tile) * TILE_SIZE + TILE_SIZE / 2, instant);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2089
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2090
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2091
void SetRedErrorSquare(TileIndex tile)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2092
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2093
	TileIndex old;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2094
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2095
	old = _thd.redsq;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2096
	_thd.redsq = tile;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2097
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2098
	if (tile != old) {
3281
0f3d836e35b1 (svn r3995) -Fix: Committed one file too much in 3992 (Thanks to Tron for pointing it out)
celestar
parents: 3279
diff changeset
  2099
		if (tile != 0) MarkTileDirtyByTile(tile);
0f3d836e35b1 (svn r3995) -Fix: Committed one file too much in 3992 (Thanks to Tron for pointing it out)
celestar
parents: 3279
diff changeset
  2100
		if (old  != 0) MarkTileDirtyByTile(old);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2101
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2102
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2103
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2104
void SetTileSelectSize(int w, int h)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2105
{
3421
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2106
	_thd.new_size.x = w * TILE_SIZE;
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2107
	_thd.new_size.y = h * TILE_SIZE;
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2108
	_thd.new_outersize.x = 0;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2109
	_thd.new_outersize.y = 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2110
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2111
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2112
void SetTileSelectBigSize(int ox, int oy, int sx, int sy)
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2113
{
3421
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2114
	_thd.offs.x = ox * TILE_SIZE;
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2115
	_thd.offs.y = oy * TILE_SIZE;
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2116
	_thd.new_outersize.x = sx * TILE_SIZE;
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2117
	_thd.new_outersize.y = sy * TILE_SIZE;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2118
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2119
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
  2120
/** returns the best autorail highlight type from map coordinates */
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2121
static HighLightStyle GetAutorailHT(int x, int y)
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2122
{
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2123
	return HT_RAIL | _autorail_piece[x & 0xF][y & 0xF];
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2124
}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2125
7574
0d76e3392fa4 (svn r10343) -Cleanup: Add documentation of functions and code-style fix.
belugas
parents: 7565
diff changeset
  2126
/**
0d76e3392fa4 (svn r10343) -Cleanup: Add documentation of functions and code-style fix.
belugas
parents: 7565
diff changeset
  2127
 * Updates tile highlighting for all cases.
0d76e3392fa4 (svn r10343) -Cleanup: Add documentation of functions and code-style fix.
belugas
parents: 7565
diff changeset
  2128
 * Uses _thd.selstart and _thd.selend and _thd.place_mode (set elsewhere) to determine _thd.pos and _thd.size
0d76e3392fa4 (svn r10343) -Cleanup: Add documentation of functions and code-style fix.
belugas
parents: 7565
diff changeset
  2129
 * Also drawstyle is determined. Uses _thd.new.* as a buffer and calls SetSelectionTilesDirty() twice,
0d76e3392fa4 (svn r10343) -Cleanup: Add documentation of functions and code-style fix.
belugas
parents: 7565
diff changeset
  2130
 * Once for the old and once for the new selection.
0d76e3392fa4 (svn r10343) -Cleanup: Add documentation of functions and code-style fix.
belugas
parents: 7565
diff changeset
  2131
 * _thd is TileHighlightData, found in viewport.h
0d76e3392fa4 (svn r10343) -Cleanup: Add documentation of functions and code-style fix.
belugas
parents: 7565
diff changeset
  2132
 * Called by MouseLoop() in windows.cpp
0d76e3392fa4 (svn r10343) -Cleanup: Add documentation of functions and code-style fix.
belugas
parents: 7565
diff changeset
  2133
 */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6443
diff changeset
  2134
void UpdateTileSelection()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2135
{
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2136
	int x1;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2137
	int y1;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2138
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2139
	_thd.new_drawstyle = 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2140
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2141
	if (_thd.place_mode == VHM_SPECIAL) {
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2142
		x1 = _thd.selend.x;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2143
		y1 = _thd.selend.y;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2144
		if (x1 != -1) {
8408
b14e4f68d1d7 (svn r11465) -Fix: more user-friedly placement in X and Y directions (most noticeable with autoroad)
smatz
parents: 8401
diff changeset
  2145
			int x2 = _thd.selstart.x & ~0xF;
b14e4f68d1d7 (svn r11465) -Fix: more user-friedly placement in X and Y directions (most noticeable with autoroad)
smatz
parents: 8401
diff changeset
  2146
			int y2 = _thd.selstart.y & ~0xF;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2147
			x1 &= ~0xF;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2148
			y1 &= ~0xF;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  2149
6432
8fb778a7f2d7 (svn r8841) -Fix
tron
parents: 6401
diff changeset
  2150
			if (x1 >= x2) Swap(x1, x2);
8fb778a7f2d7 (svn r8841) -Fix
tron
parents: 6401
diff changeset
  2151
			if (y1 >= y2) Swap(y1, y2);
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2152
			_thd.new_pos.x = x1;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2153
			_thd.new_pos.y = y1;
3421
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2154
			_thd.new_size.x = x2 - x1 + TILE_SIZE;
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2155
			_thd.new_size.y = y2 - y1 + TILE_SIZE;
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2156
			_thd.new_drawstyle = _thd.next_drawstyle;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2157
		}
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2158
	} else if (_thd.place_mode != VHM_NONE) {
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2159
		Point pt = GetTileBelowCursor();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2160
		x1 = pt.x;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2161
		y1 = pt.y;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2162
		if (x1 != -1) {
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2163
			switch (_thd.place_mode) {
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2164
				case VHM_RECT:
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2165
					_thd.new_drawstyle = HT_RECT;
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2166
					break;
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2167
				case VHM_POINT:
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2168
					_thd.new_drawstyle = HT_POINT;
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2169
					x1 += 8;
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2170
					y1 += 8;
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2171
					break;
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2172
				case VHM_RAIL:
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2173
					_thd.new_drawstyle = GetAutorailHT(pt.x, pt.y); // draw one highlighted tile
8414
8c2ecc2dc12c (svn r11471) -Codechange: one more variable retyped to enum ViewportHighlightMode
smatz
parents: 8408
diff changeset
  2174
					break;
8c2ecc2dc12c (svn r11471) -Codechange: one more variable retyped to enum ViewportHighlightMode
smatz
parents: 8408
diff changeset
  2175
				default:
8c2ecc2dc12c (svn r11471) -Codechange: one more variable retyped to enum ViewportHighlightMode
smatz
parents: 8408
diff changeset
  2176
					NOT_REACHED();
8c2ecc2dc12c (svn r11471) -Codechange: one more variable retyped to enum ViewportHighlightMode
smatz
parents: 8408
diff changeset
  2177
					break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2178
			}
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2179
			_thd.new_pos.x = x1 & ~0xF;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2180
			_thd.new_pos.y = y1 & ~0xF;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2181
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2182
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2183
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
  2184
	/* redraw selection */
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2185
	if (_thd.drawstyle != _thd.new_drawstyle ||
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2186
			_thd.pos.x != _thd.new_pos.x || _thd.pos.y != _thd.new_pos.y ||
4539
0b13858554fb (svn r6368) -Fix [FS#136]: Station catchment area persists after switching tools. The
Darkvater
parents: 4523
diff changeset
  2187
			_thd.size.x != _thd.new_size.x || _thd.size.y != _thd.new_size.y ||
7574
0d76e3392fa4 (svn r10343) -Cleanup: Add documentation of functions and code-style fix.
belugas
parents: 7565
diff changeset
  2188
			_thd.outersize.x != _thd.new_outersize.x ||
0d76e3392fa4 (svn r10343) -Cleanup: Add documentation of functions and code-style fix.
belugas
parents: 7565
diff changeset
  2189
			_thd.outersize.y != _thd.new_outersize.y) {
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
  2190
		/* clear the old selection? */
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2191
		if (_thd.drawstyle) SetSelectionTilesDirty();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2192
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2193
		_thd.drawstyle = _thd.new_drawstyle;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2194
		_thd.pos = _thd.new_pos;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2195
		_thd.size = _thd.new_size;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2196
		_thd.outersize = _thd.new_outersize;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2197
		_thd.dirty = 0xff;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2198
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
  2199
		/* draw the new selection? */
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2200
		if (_thd.new_drawstyle) SetSelectionTilesDirty();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2201
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2202
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2203
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
  2204
/** highlighting tiles while only going over them with the mouse */
10466
54dfadd481b0 (svn r13009) -Codechange: move more tile highlighting related functions/types to tilehighlight_*.h.
rubidium
parents: 10445
diff changeset
  2205
void VpStartPlaceSizing(TileIndex tile, ViewportPlaceMethod method, ViewportDragDropSelectionProcess process)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2206
{
7165
37eb253f3c06 (svn r9900) -Codechange: Separate the variables for how to highlight a land area and what to do with it afterwards.
maedhros
parents: 7150
diff changeset
  2207
	_thd.select_method = method;
37eb253f3c06 (svn r9900) -Codechange: Separate the variables for how to highlight a land area and what to do with it afterwards.
maedhros
parents: 7150
diff changeset
  2208
	_thd.select_proc   = process;
3421
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2209
	_thd.selend.x = TileX(tile) * TILE_SIZE;
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2210
	_thd.selstart.x = TileX(tile) * TILE_SIZE;
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2211
	_thd.selend.y = TileY(tile) * TILE_SIZE;
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2212
	_thd.selstart.y = TileY(tile) * TILE_SIZE;
8408
b14e4f68d1d7 (svn r11465) -Fix: more user-friedly placement in X and Y directions (most noticeable with autoroad)
smatz
parents: 8401
diff changeset
  2213
b14e4f68d1d7 (svn r11465) -Fix: more user-friedly placement in X and Y directions (most noticeable with autoroad)
smatz
parents: 8401
diff changeset
  2214
	/* Needed so several things (road, autoroad, bridges, ...) are placed correctly.
b14e4f68d1d7 (svn r11465) -Fix: more user-friedly placement in X and Y directions (most noticeable with autoroad)
smatz
parents: 8401
diff changeset
  2215
	 * In effect, placement starts from the centre of a tile
b14e4f68d1d7 (svn r11465) -Fix: more user-friedly placement in X and Y directions (most noticeable with autoroad)
smatz
parents: 8401
diff changeset
  2216
	 */
b14e4f68d1d7 (svn r11465) -Fix: more user-friedly placement in X and Y directions (most noticeable with autoroad)
smatz
parents: 8401
diff changeset
  2217
	if (method == VPM_X_OR_Y || method == VPM_FIX_X || method == VPM_FIX_Y) {
b14e4f68d1d7 (svn r11465) -Fix: more user-friedly placement in X and Y directions (most noticeable with autoroad)
smatz
parents: 8401
diff changeset
  2218
		_thd.selend.x += TILE_SIZE / 2;
b14e4f68d1d7 (svn r11465) -Fix: more user-friedly placement in X and Y directions (most noticeable with autoroad)
smatz
parents: 8401
diff changeset
  2219
		_thd.selend.y += TILE_SIZE / 2;
b14e4f68d1d7 (svn r11465) -Fix: more user-friedly placement in X and Y directions (most noticeable with autoroad)
smatz
parents: 8401
diff changeset
  2220
		_thd.selstart.x += TILE_SIZE / 2;
b14e4f68d1d7 (svn r11465) -Fix: more user-friedly placement in X and Y directions (most noticeable with autoroad)
smatz
parents: 8401
diff changeset
  2221
		_thd.selstart.y += TILE_SIZE / 2;
b14e4f68d1d7 (svn r11465) -Fix: more user-friedly placement in X and Y directions (most noticeable with autoroad)
smatz
parents: 8401
diff changeset
  2222
	}
b14e4f68d1d7 (svn r11465) -Fix: more user-friedly placement in X and Y directions (most noticeable with autoroad)
smatz
parents: 8401
diff changeset
  2223
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2224
	if (_thd.place_mode == VHM_RECT) {
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2225
		_thd.place_mode = VHM_SPECIAL;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2226
		_thd.next_drawstyle = HT_RECT;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2227
	} else if (_thd.place_mode == VHM_RAIL) { // autorail one piece
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2228
		_thd.place_mode = VHM_SPECIAL;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2229
		_thd.next_drawstyle = _thd.drawstyle;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2230
	} else {
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2231
		_thd.place_mode = VHM_SPECIAL;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2232
		_thd.next_drawstyle = HT_POINT;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2233
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2234
	_special_mouse_mode = WSM_SIZING;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2235
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2236
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2237
void VpSetPlaceSizingLimit(int limit)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2238
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2239
	_thd.sizelimit = limit;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2240
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2241
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2242
/**
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2243
* Highlights all tiles between a set of two tiles. Used in dock and tunnel placement
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2244
* @param from TileIndex of the first tile to highlight
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2245
* @param to TileIndex of the last tile to highlight */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2246
void VpSetPresizeRange(TileIndex from, TileIndex to)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2247
{
7502
71f5d2c6a605 (svn r10262) -Fix (r10258): some places that needed to be changed to uint64 were hidden/forgotten, which caused memory corruptions and that in caused all kinds of assertions to trigger.
rubidium
parents: 7433
diff changeset
  2248
	uint64 distance = DistanceManhattan(from, to) + 1;
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2249
3421
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2250
	_thd.selend.x = TileX(to) * TILE_SIZE;
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2251
	_thd.selend.y = TileY(to) * TILE_SIZE;
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2252
	_thd.selstart.x = TileX(from) * TILE_SIZE;
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3281
diff changeset
  2253
	_thd.selstart.y = TileY(from) * TILE_SIZE;
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2254
	_thd.next_drawstyle = HT_RECT;
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2255
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2256
	/* show measurement only if there is any length to speak of */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2257
	if (distance > 1) GuiShowTooltipsWithArgs(STR_MEASURE_LENGTH, 1, &distance);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2258
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2259
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6443
diff changeset
  2260
static void VpStartPreSizing()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2261
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2262
	_thd.selend.x = -1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2263
	_special_mouse_mode = WSM_PRESIZE;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2264
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2265
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
  2266
/** returns information about the 2x1 piece to be build.
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2267
 * The lower bits (0-3) are the track type. */
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2268
static HighLightStyle Check2x1AutoRail(int mode)
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2269
{
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2270
	int fxpy = _tile_fract_coords.x + _tile_fract_coords.y;
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2271
	int sxpy = (_thd.selend.x & 0xF) + (_thd.selend.y & 0xF);
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2272
	int fxmy = _tile_fract_coords.x - _tile_fract_coords.y;
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2273
	int sxmy = (_thd.selend.x & 0xF) - (_thd.selend.y & 0xF);
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2274
2952
6a26eeda9679 (svn r3511) More whitespace ([FS#46] by Rubidium)
tron
parents: 2817
diff changeset
  2275
	switch (mode) {
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2276
		default: NOT_REACHED();
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2277
		case 0: // end piece is lower right
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2278
			if (fxpy >= 20 && sxpy <= 12) { /*SwapSelection(); DoRailroadTrack(0); */return HT_DIR_HL; }
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2279
			if (fxmy < -3 && sxmy > 3) {/* DoRailroadTrack(0); */return HT_DIR_VR; }
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2280
			return HT_DIR_Y;
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2281
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2282
		case 1:
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2283
			if (fxmy > 3 && sxmy < -3) { /*SwapSelection(); DoRailroadTrack(0); */return HT_DIR_VL; }
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2284
			if (fxpy <= 12 && sxpy >= 20) { /*DoRailroadTrack(0); */return HT_DIR_HU; }
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2285
			return HT_DIR_Y;
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2286
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2287
		case 2:
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2288
			if (fxmy > 3 && sxmy < -3) { /*DoRailroadTrack(3);*/ return HT_DIR_VL; }
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2289
			if (fxpy >= 20 && sxpy <= 12) { /*SwapSelection(); DoRailroadTrack(0); */return HT_DIR_HL; }
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2290
			return HT_DIR_X;
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2291
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2292
		case 3:
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2293
			if (fxmy < -3 && sxmy > 3) { /*SwapSelection(); DoRailroadTrack(3);*/ return HT_DIR_VR; }
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2294
			if (fxpy <= 12 && sxpy >= 20) { /*DoRailroadTrack(0); */return HT_DIR_HU; }
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2295
			return HT_DIR_X;
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2296
	}
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2297
}
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2298
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2299
/** Check if the direction of start and end tile should be swapped based on
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2300
 * the dragging-style. Default directions are:
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2301
 * in the case of a line (HT_RAIL, HT_LINE):  DIR_NE, DIR_NW, DIR_N, DIR_E
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2302
 * in the case of a rect (HT_RECT, HT_POINT): DIR_S, DIR_E
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2303
 * For example dragging a rectangle area from south to north should be swapped to
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2304
 * north-south (DIR_S) to obtain the same results with less code. This is what
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2305
 * the return value signifies.
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2306
 * @param style HighLightStyle dragging style
6980
6b5dee376733 (svn r9665) -Documentation: Doxygen corrections,errors, corrections of corrections...
belugas
parents: 6949
diff changeset
  2307
 * @param start_tile start tile of drag
6b5dee376733 (svn r9665) -Documentation: Doxygen corrections,errors, corrections of corrections...
belugas
parents: 6949
diff changeset
  2308
 * @param end_tile end tile of drag
6b5dee376733 (svn r9665) -Documentation: Doxygen corrections,errors, corrections of corrections...
belugas
parents: 6949
diff changeset
  2309
 * @return boolean value which when true means start/end should be swapped */
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2310
static bool SwapDirection(HighLightStyle style, TileIndex start_tile, TileIndex end_tile)
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2311
{
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2312
	uint start_x = TileX(start_tile);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2313
	uint start_y = TileY(start_tile);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2314
	uint end_x = TileX(end_tile);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2315
	uint end_y = TileY(end_tile);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2316
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2317
	switch (style & HT_DRAG_MASK) {
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2318
		case HT_RAIL:
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2319
		case HT_LINE: return (end_x > start_x || (end_x == start_x && end_y > start_y));
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2320
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2321
		case HT_RECT:
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2322
		case HT_POINT: return (end_x != start_x && end_y < start_y);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2323
		default: NOT_REACHED();
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2324
	}
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2325
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2326
	return false;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2327
}
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2328
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2329
/** Calculates height difference between one tile and another
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2330
* Multiplies the result to suit the standard given by minimap - 50 meters high
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2331
* To correctly get the height difference we need the direction we are dragging
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2332
* in, as well as with what kind of tool we are dragging. For example a horizontal
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2333
* autorail tool that starts in bottom and ends at the top of a tile will need the
6987
b0f13039bda2 (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6980
diff changeset
  2334
* maximum of SW, S and SE, N corners respectively. This is handled by the lookup table below
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2335
* See _tileoffs_by_dir in map.c for the direction enums if you can't figure out
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2336
* the values yourself.
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2337
* @param style HightlightStyle of drag. This includes direction and style (autorail, rect, etc.)
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2338
* @param distance amount of tiles dragged, important for horizontal/vertical drags
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2339
*        ignored for others
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2340
* @param start_tile, end_tile start and end tile of drag operation
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2341
* @return height difference between two tiles. Tile measurement tool utilizes
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2342
* this value in its tooltips */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2343
static int CalcHeightdiff(HighLightStyle style, uint distance, TileIndex start_tile, TileIndex end_tile)
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2344
{
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2345
	bool swap = SwapDirection(style, start_tile, end_tile);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2346
	byte style_t;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2347
	uint h0, h1, ht; // start heigth, end height, and temp variable
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2348
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2349
	if (start_tile == end_tile) return 0;
5984
fbef81292ff9 (svn r8276) -Fix
tron
parents: 5924
diff changeset
  2350
	if (swap) Swap(start_tile, end_tile);
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2351
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2352
	switch (style & HT_DRAG_MASK) {
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2353
		case HT_RECT: {
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2354
			static const TileIndexDiffC heightdiff_area_by_dir[] = {
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2355
				/* Start */ {1, 0}, /* Dragging east */ {0, 0}, /* Dragging south */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2356
				/* End   */ {0, 1}, /* Dragging east */ {1, 1}  /* Dragging south */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2357
			};
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2358
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2359
			/* In the case of an area we can determine whether we were dragging south or
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2360
			 * east by checking the X-coordinates of the tiles */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2361
			style_t = (byte)(TileX(end_tile) > TileX(start_tile));
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2362
			start_tile = TILE_ADD(start_tile, ToTileIndexDiff(heightdiff_area_by_dir[style_t]));
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2363
			end_tile   = TILE_ADD(end_tile, ToTileIndexDiff(heightdiff_area_by_dir[2 + style_t]));
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2364
		}
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2365
		/* Fallthrough */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2366
		case HT_POINT:
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2367
			h0 = TileHeight(start_tile);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2368
			h1 = TileHeight(end_tile);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2369
			break;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2370
		default: { /* All other types, this is mostly only line/autorail */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2371
			static const HighLightStyle flip_style_direction[] = {
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2372
				HT_DIR_X, HT_DIR_Y, HT_DIR_HL, HT_DIR_HU, HT_DIR_VR, HT_DIR_VL
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2373
			};
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2374
			static const TileIndexDiffC heightdiff_line_by_dir[] = {
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2375
				/* Start */ {1, 0}, {1, 1}, /* HT_DIR_X  */ {0, 1}, {1, 1}, /* HT_DIR_Y  */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2376
				/* Start */ {1, 0}, {0, 0}, /* HT_DIR_HU */ {1, 0}, {1, 1}, /* HT_DIR_HL */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2377
				/* Start */ {1, 0}, {1, 1}, /* HT_DIR_VL */ {0, 1}, {1, 1}, /* HT_DIR_VR */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2378
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2379
				/* Start */ {0, 1}, {0, 0}, /* HT_DIR_X  */ {1, 0}, {0, 0}, /* HT_DIR_Y  */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2380
				/* End   */ {0, 1}, {0, 0}, /* HT_DIR_HU */ {1, 1}, {0, 1}, /* HT_DIR_HL */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2381
				/* End   */ {1, 0}, {0, 0}, /* HT_DIR_VL */ {0, 0}, {0, 1}, /* HT_DIR_VR */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2382
			};
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2383
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2384
			distance %= 2; // we're only interested if the distance is even or uneven
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2385
			style &= HT_DIR_MASK;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2386
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2387
			/* To handle autorail, we do some magic to be able to use a lookup table.
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2388
			 * Firstly if we drag the other way around, we switch start&end, and if needed
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2389
			 * also flip the drag-position. Eg if it was on the left, and the distance is even
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2390
			 * that means the end, which is now the start is on the right */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2391
			if (swap && distance == 0) style = flip_style_direction[style];
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2392
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2393
			/* Use lookup table for start-tile based on HighLightStyle direction */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2394
			style_t = style * 2;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2395
			assert(style_t < lengthof(heightdiff_line_by_dir) - 13);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2396
			h0 = TileHeight(TILE_ADD(start_tile, ToTileIndexDiff(heightdiff_line_by_dir[style_t])));
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2397
			ht = TileHeight(TILE_ADD(start_tile, ToTileIndexDiff(heightdiff_line_by_dir[style_t + 1])));
5852
cb3f71b16e1a (svn r8055) -Codechange: Replace the different max, dmax, maxu whatever macros by a simple template function max(), that requires two arguments of the same type. While I'm at it change a variable called "max" to "maxval" in a function that calls max().
celestar
parents: 5838
diff changeset
  2398
			h0 = max(h0, ht);
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2399
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2400
			/* Use lookup table for end-tile based on HighLightStyle direction
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2401
			 * flip around side (lower/upper, left/right) based on distance */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2402
			if (distance == 0) style_t = flip_style_direction[style] * 2;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2403
			assert(style_t < lengthof(heightdiff_line_by_dir) - 13);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2404
			h1 = TileHeight(TILE_ADD(end_tile, ToTileIndexDiff(heightdiff_line_by_dir[12 + style_t])));
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2405
			ht = TileHeight(TILE_ADD(end_tile, ToTileIndexDiff(heightdiff_line_by_dir[12 + style_t + 1])));
5852
cb3f71b16e1a (svn r8055) -Codechange: Replace the different max, dmax, maxu whatever macros by a simple template function max(), that requires two arguments of the same type. While I'm at it change a variable called "max" to "maxval" in a function that calls max().
celestar
parents: 5838
diff changeset
  2406
			h1 = max(h1, ht);
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2407
		} break;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2408
	}
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2409
5984
fbef81292ff9 (svn r8276) -Fix
tron
parents: 5924
diff changeset
  2410
	if (swap) Swap(h0, h1);
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2411
	/* Minimap shows height in intervals of 50 meters, let's do the same */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2412
	return (int)(h1 - h0) * 50;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2413
}
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2414
4885
c9fe8c52fd50 (svn r6822) -Fix r6821: add type for measure_strings_length[]
glx
parents: 4884
diff changeset
  2415
static const StringID measure_strings_length[] = {STR_NULL, STR_MEASURE_LENGTH, STR_MEASURE_LENGTH_HEIGHTDIFF};
4884
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2416
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
  2417
/** while dragging */
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2418
static void CalcRaildirsDrawstyle(TileHighlightData *thd, int x, int y, int method)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2419
{
4799
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2420
	HighLightStyle b;
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2421
	uint w, h;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  2422
4799
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2423
	int dx = thd->selstart.x - (thd->selend.x & ~0xF);
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2424
	int dy = thd->selstart.y - (thd->selend.y & ~0xF);
8419
de9999f762d0 (svn r11476) -Codechange: rename the function myabs to abs to get rid of an unneeded define
skidd13
parents: 8418
diff changeset
  2425
	w = abs(dx) + 16;
de9999f762d0 (svn r11476) -Codechange: rename the function myabs to abs to get rid of an unneeded define
skidd13
parents: 8418
diff changeset
  2426
	h = abs(dy) + 16;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2427
1980
9ea0c89fbb58 (svn r2486) Turn TILE_FROM_XY into an inline function and rename it to TileVirtXY
tron
parents: 1977
diff changeset
  2428
	if (TileVirtXY(thd->selstart.x, thd->selstart.y) == TileVirtXY(x, y)) { // check if we're only within one tile
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2429
		if (method == VPM_RAILDIRS) {
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2430
			b = GetAutorailHT(x, y);
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2431
		} else { // rect for autosignals on one tile
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2432
			b = HT_RECT;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2433
		}
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2434
	} else if (h == 16) { // Is this in X direction?
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2435
		if (dx == 16) { // 2x1 special handling
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2436
			b = (Check2x1AutoRail(3)) | HT_LINE;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2437
		} else if (dx == -16) {
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2438
			b = (Check2x1AutoRail(2)) | HT_LINE;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2439
		} else {
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2440
			b = HT_LINE | HT_DIR_X;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2441
		}
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2442
		y = thd->selstart.y;
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2443
	} else if (w == 16) { // Or Y direction?
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2444
		if (dy == 16) { // 2x1 special handling
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2445
			b = (Check2x1AutoRail(1)) | HT_LINE;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2446
		} else if (dy == -16) { // 2x1 other direction
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2447
			b = (Check2x1AutoRail(0)) | HT_LINE;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2448
		} else {
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2449
			b = HT_LINE | HT_DIR_Y;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2450
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2451
		x = thd->selstart.x;
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2452
	} else if (w > h * 2) { // still count as x dir?
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2453
		b = HT_LINE | HT_DIR_X;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2454
		y = thd->selstart.y;
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2455
	} else if (h > w * 2) { // still count as y dir?
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2456
		b = HT_LINE | HT_DIR_Y;
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2457
		x = thd->selstart.x;
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2458
	} else { // complicated direction
4799
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2459
		int d = w - h;
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2460
		thd->selend.x = thd->selend.x & ~0xF;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2461
		thd->selend.y = thd->selend.y & ~0xF;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2462
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2463
		// four cases.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2464
		if (x > thd->selstart.x) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2465
			if (y > thd->selstart.y) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2466
				// south
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2467
				if (d == 0) {
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2468
					b = (x & 0xF) > (y & 0xF) ? HT_LINE | HT_DIR_VL : HT_LINE | HT_DIR_VR;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2469
				} else if (d >= 0) {
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2470
					x = thd->selstart.x + h;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2471
					b = HT_LINE | HT_DIR_VL;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2472
					// return px == py || px == py + 16;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2473
				} else {
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2474
					y = thd->selstart.y + w;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2475
					b = HT_LINE | HT_DIR_VR;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2476
				} // return px == py || px == py - 16;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2477
			} else {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2478
				// west
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2479
				if (d == 0) {
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2480
					b = (x & 0xF) + (y & 0xF) >= 0x10 ? HT_LINE | HT_DIR_HL : HT_LINE | HT_DIR_HU;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2481
				} else if (d >= 0) {
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2482
					x = thd->selstart.x + h;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2483
					b = HT_LINE | HT_DIR_HL;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2484
				} else {
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2485
					y = thd->selstart.y - w;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2486
					b = HT_LINE | HT_DIR_HU;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2487
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2488
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2489
		} else {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2490
			if (y > thd->selstart.y) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2491
				// east
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2492
				if (d == 0) {
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2493
					b = (x & 0xF) + (y & 0xF) >= 0x10 ? HT_LINE | HT_DIR_HL : HT_LINE | HT_DIR_HU;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2494
				} else if (d >= 0) {
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2495
					x = thd->selstart.x - h;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2496
					b = HT_LINE | HT_DIR_HU;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2497
					// return px == -py || px == -py - 16;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2498
				} else {
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2499
					y = thd->selstart.y + w;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2500
					b = HT_LINE | HT_DIR_HL;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2501
				} // return px == -py || px == -py + 16;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2502
			} else {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2503
				// north
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2504
				if (d == 0) {
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2505
					b = (x & 0xF) > (y & 0xF) ? HT_LINE | HT_DIR_VL : HT_LINE | HT_DIR_VR;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2506
				} else if (d >= 0) {
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2507
					x = thd->selstart.x - h;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2508
					b = HT_LINE | HT_DIR_VR;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2509
					// return px == py || px == py - 16;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2510
				} else {
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2511
					y = thd->selstart.y - w;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2512
					b = HT_LINE | HT_DIR_VL;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2513
				} //return px == py || px == py + 16;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2514
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2515
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2516
	}
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2517
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10771
diff changeset
  2518
	if (_settings_client.gui.measure_tooltip) {
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2519
		TileIndex t0 = TileVirtXY(thd->selstart.x, thd->selstart.y);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2520
		TileIndex t1 = TileVirtXY(x, y);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2521
		uint distance = DistanceManhattan(t0, t1) + 1;
4884
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2522
		byte index = 0;
7502
71f5d2c6a605 (svn r10262) -Fix (r10258): some places that needed to be changed to uint64 were hidden/forgotten, which caused memory corruptions and that in caused all kinds of assertions to trigger.
rubidium
parents: 7433
diff changeset
  2523
		uint64 params[2];
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2524
4884
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2525
		if (distance != 1) {
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2526
			int heightdiff = CalcHeightdiff(b, distance, t0, t1);
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2527
			/* If we are showing a tooltip for horizontal or vertical drags,
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2528
			 * 2 tiles have a length of 1. To bias towards the ceiling we add
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2529
			 * one before division. It feels more natural to count 3 lengths as 2 */
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2530
			if ((b & HT_DIR_MASK) != HT_DIR_X && (b & HT_DIR_MASK) != HT_DIR_Y) {
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2531
				distance = (distance + 1) / 2;
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2532
			}
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2533
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2534
			params[index++] = distance;
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2535
			if (heightdiff != 0) params[index++] = heightdiff;
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2536
		}
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2537
4884
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2538
		GuiShowTooltipsWithArgs(measure_strings_length[index], index, params);
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2539
	}
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2540
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2541
	thd->selend.x = x;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2542
	thd->selend.y = y;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2543
	thd->next_drawstyle = b;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2544
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2545
4799
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2546
/**
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2547
 * Selects tiles while dragging
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2548
 * @param x X coordinate of end of selection
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2549
 * @param y Y coordinate of end of selection
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2550
 * @param method modifies the way tiles are selected. Possible
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2551
 * methods are VPM_* in viewport.h */
8384
cda01fb6ec2a (svn r11439) -Codechange: replace some magic numbers by a ViewportPlaceMethod enumified constant. Patch by SmatZ.
rubidium
parents: 8345
diff changeset
  2552
void VpSelectTilesWithMethod(int x, int y, ViewportPlaceMethod method)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2553
{
4799
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2554
	int sx, sy;
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2555
	HighLightStyle style;
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2556
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2557
	if (x == -1) {
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2558
		_thd.selend.x = -1;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2559
		return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2560
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2561
4799
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2562
	/* Special handling of drag in any (8-way) direction */
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 0
diff changeset
  2563
	if (method == VPM_RAILDIRS || method == VPM_SIGNALDIRS) {
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2564
		_thd.selend.x = x;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2565
		_thd.selend.y = y;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2566
		CalcRaildirsDrawstyle(&_thd, x, y, method);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2567
		return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2568
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2569
8408
b14e4f68d1d7 (svn r11465) -Fix: more user-friedly placement in X and Y directions (most noticeable with autoroad)
smatz
parents: 8401
diff changeset
  2570
	/* Needed so level-land is placed correctly */
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2571
	if (_thd.next_drawstyle == HT_POINT) {
4799
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2572
		x += TILE_SIZE / 2;
a32af5dd7b6c (svn r6721) -Codechange: some comments, aligning, types and variable localization.
Darkvater
parents: 4634
diff changeset
  2573
		y += TILE_SIZE / 2;
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2574
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2575
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2576
	sx = _thd.selstart.x;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2577
	sy = _thd.selstart.y;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2578
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2579
	switch (method) {
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2580
		case VPM_X_OR_Y: /* drag in X or Y direction */
8419
de9999f762d0 (svn r11476) -Codechange: rename the function myabs to abs to get rid of an unneeded define
skidd13
parents: 8418
diff changeset
  2581
			if (abs(sy - y) < abs(sx - x)) {
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2582
				y = sy;
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2583
				style = HT_DIR_X;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2584
			} else {
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2585
				x = sx;
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2586
				style = HT_DIR_Y;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  2587
			}
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2588
			goto calc_heightdiff_single_direction;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2589
		case VPM_FIX_X: /* drag in Y direction */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2590
			x = sx;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2591
			style = HT_DIR_Y;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2592
			goto calc_heightdiff_single_direction;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2593
		case VPM_FIX_Y: /* drag in X direction */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2594
			y = sy;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2595
			style = HT_DIR_X;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2596
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2597
calc_heightdiff_single_direction:;
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10771
diff changeset
  2598
			if (_settings_client.gui.measure_tooltip) {
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2599
				TileIndex t0 = TileVirtXY(sx, sy);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2600
				TileIndex t1 = TileVirtXY(x, y);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2601
				uint distance = DistanceManhattan(t0, t1) + 1;
4884
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2602
				byte index = 0;
7502
71f5d2c6a605 (svn r10262) -Fix (r10258): some places that needed to be changed to uint64 were hidden/forgotten, which caused memory corruptions and that in caused all kinds of assertions to trigger.
rubidium
parents: 7433
diff changeset
  2603
				uint64 params[2];
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2604
4884
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2605
				if (distance != 1) {
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2606
					/* With current code passing a HT_LINE style to calculate the height
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2607
					 * difference is enough. However if/when a point-tool is created
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2608
					 * with this method, function should be called with new_style (below)
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2609
					 * instead of HT_LINE | style case HT_POINT is handled specially
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2610
					 * new_style := (_thd.next_drawstyle & HT_RECT) ? HT_LINE | style : _thd.next_drawstyle; */
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2611
					int heightdiff = CalcHeightdiff(HT_LINE | style, 0, t0, t1);
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2612
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2613
					params[index++] = distance;
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2614
					if (heightdiff != 0) params[index++] = heightdiff;
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2615
				}
4884
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2616
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2617
				GuiShowTooltipsWithArgs(measure_strings_length[index], index, params);
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2618
			} break;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2619
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2620
		case VPM_X_AND_Y_LIMITED: { /* drag an X by Y constrained rect area */
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2621
			int limit = (_thd.sizelimit - 1) * TILE_SIZE;
8418
b49fc6be1ab9 (svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents: 8414
diff changeset
  2622
			x = sx + Clamp(x - sx, -limit, limit);
b49fc6be1ab9 (svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents: 8414
diff changeset
  2623
			y = sy + Clamp(y - sy, -limit, limit);
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
  2624
			} /* Fallthrough */
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
  2625
		case VPM_X_AND_Y: { /* drag an X by Y area */
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10771
diff changeset
  2626
			if (_settings_client.gui.measure_tooltip) {
4884
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2627
				static const StringID measure_strings_area[] = {
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2628
					STR_NULL, STR_NULL, STR_MEASURE_AREA, STR_MEASURE_AREA_HEIGHTDIFF
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2629
				};
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2630
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2631
				TileIndex t0 = TileVirtXY(sx, sy);
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2632
				TileIndex t1 = TileVirtXY(x, y);
8466
9ce95e16f9f9 (svn r11526) -Codechange: Rename the function delta fitting to the naming style
skidd13
parents: 8450
diff changeset
  2633
				uint dx = Delta(TileX(t0), TileX(t1)) + 1;
9ce95e16f9f9 (svn r11526) -Codechange: Rename the function delta fitting to the naming style
skidd13
parents: 8450
diff changeset
  2634
				uint dy = Delta(TileY(t0), TileY(t1)) + 1;
4884
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2635
				byte index = 0;
7502
71f5d2c6a605 (svn r10262) -Fix (r10258): some places that needed to be changed to uint64 were hidden/forgotten, which caused memory corruptions and that in caused all kinds of assertions to trigger.
rubidium
parents: 7433
diff changeset
  2636
				uint64 params[3];
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2637
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2638
				/* If dragging an area (eg dynamite tool) and it is actually a single
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2639
				 * row/column, change the type to 'line' to get proper calculation for height */
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8640
diff changeset
  2640
				style = (HighLightStyle)_thd.next_drawstyle;
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2641
				if (style & HT_RECT) {
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2642
					if (dx == 1) {
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2643
						style = HT_LINE | HT_DIR_Y;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2644
					} else if (dy == 1) {
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2645
						style = HT_LINE | HT_DIR_X;
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2646
					}
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2647
				}
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2648
4884
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2649
				if (dx != 1 || dy != 1) {
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2650
					int heightdiff = CalcHeightdiff(style, 0, t0, t1);
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2651
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2652
					params[index++] = dx;
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2653
					params[index++] = dy;
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2654
					if (heightdiff != 0) params[index++] = heightdiff;
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2655
				}
4884
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2656
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2657
				GuiShowTooltipsWithArgs(measure_strings_area[index], index, params);
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2658
			}
4884
895f06b87934 (svn r6821) -Codechange: For the measurement tool do not show the tooltip when the selection
Darkvater
parents: 4838
diff changeset
  2659
		break;
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2660
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2661
		}
4834
ddcf440d0ffd (svn r6758) -Feature: Add a measurement tool that will show dimensions and height
Darkvater
parents: 4799
diff changeset
  2662
		default: NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2663
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2664
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2665
	_thd.selend.x = x;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2666
	_thd.selend.y = y;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2667
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2668
10638
1234ac29df11 (svn r13182) -Doc: add documentation to mostly rail_gui related functions. Patch by Alberth.
rubidium
parents: 10596
diff changeset
  2669
/**
1234ac29df11 (svn r13182) -Doc: add documentation to mostly rail_gui related functions. Patch by Alberth.
rubidium
parents: 10596
diff changeset
  2670
 * Handle the mouse while dragging for placement/resizing.
1234ac29df11 (svn r13182) -Doc: add documentation to mostly rail_gui related functions. Patch by Alberth.
rubidium
parents: 10596
diff changeset
  2671
 * @return Boolean whether search for a handler should continue
1234ac29df11 (svn r13182) -Doc: add documentation to mostly rail_gui related functions. Patch by Alberth.
rubidium
parents: 10596
diff changeset
  2672
 */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6443
diff changeset
  2673
bool VpHandlePlaceSizingDrag()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2674
{
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2675
	if (_special_mouse_mode != WSM_SIZING) return true;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2676
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
  2677
	/* stop drag mode if the window has been closed */
10486
247d43dfa6f1 (svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents: 10466
diff changeset
  2678
	Window *w = FindWindowById(_thd.window_class, _thd.window_number);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2679
	if (w == NULL) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2680
		ResetObjectToPlace();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2681
		return false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2682
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2683
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
  2684
	/* while dragging execute the drag procedure of the corresponding window (mostly VpSelectTilesWithMethod() ) */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2685
	if (_left_button_down) {
10486
247d43dfa6f1 (svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents: 10466
diff changeset
  2686
		w->OnPlaceDrag(_thd.select_method, _thd.select_proc, GetTileBelowCursor());
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2687
		return false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2688
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2689
6919
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
  2690
	/* mouse button released..
339210ecccd3 (svn r9559) -Documentation: doxygen and comment changes: 'U' and 'V' now. Almost done. Yeah. I know, I've already said that...
belugas
parents: 6574
diff changeset
  2691
	 * keep the selected tool, but reset it to the original mode. */
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  2692
	_special_mouse_mode = WSM_NONE;
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2693
	if (_thd.next_drawstyle == HT_RECT) {
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2694
		_thd.place_mode = VHM_RECT;
10486
247d43dfa6f1 (svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents: 10466
diff changeset
  2695
	} else if (_thd.select_method == VPM_SIGNALDIRS) { // some might call this a hack... -- Dominik
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2696
		_thd.place_mode = VHM_RECT;
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2697
	} else if (_thd.next_drawstyle & HT_LINE) {
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2698
		_thd.place_mode = VHM_RAIL;
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2699
	} else if (_thd.next_drawstyle & HT_RAIL) {
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2700
		_thd.place_mode = VHM_RAIL;
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2701
	} else {
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2702
		_thd.place_mode = VHM_POINT;
2116
cdfc27b696b7 (svn r2626) static, const, misc.
tron
parents: 2109
diff changeset
  2703
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2704
	SetTileSelectSize(1, 1);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2705
10486
247d43dfa6f1 (svn r13029) -Codechange: more work in the road to getting the WP macros and byte[WINDOW_CUSTOM_SIZE] removed. This step changes the event handling to work directly on the Window class instead of via a function pointer and big switches while keeping backward compatability while we're rewriting the Windows to the new scheme.
rubidium
parents: 10466
diff changeset
  2706
	w->OnPlaceMouseUp(_thd.select_method, _thd.select_proc, _thd.selend, TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y));
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  2707
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2708
	return false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2709
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2710
8385
aedd7656cfd1 (svn r11440) -Codechange: replace magic numbers with enumified WindowHighlightMode constants. Patch by SmatZ.
rubidium
parents: 8384
diff changeset
  2711
void SetObjectToPlaceWnd(CursorID icon, SpriteID pal, ViewportHighlightMode mode, Window *w)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2712
{
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5853
diff changeset
  2713
	SetObjectToPlace(icon, pal, mode, w->window_class, w->window_number);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2714
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2715
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2716
#include "table/animcursors.h"
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2717
8385
aedd7656cfd1 (svn r11440) -Codechange: replace magic numbers with enumified WindowHighlightMode constants. Patch by SmatZ.
rubidium
parents: 8384
diff changeset
  2718
void SetObjectToPlace(CursorID icon, SpriteID pal, ViewportHighlightMode mode, WindowClass window_class, WindowNumber window_num)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2719
{
9081
4c47047836f3 (svn r12166) -Fix [FS#337]: when drag&drop mode was cancelled by keyboard input, depot/group window wasn't updated (original patch by GrimRC)
smatz
parents: 9058
diff changeset
  2720
	/* undo clicking on button and drag & drop */
4c47047836f3 (svn r12166) -Fix [FS#337]: when drag&drop mode was cancelled by keyboard input, depot/group window wasn't updated (original patch by GrimRC)
smatz
parents: 9058
diff changeset
  2721
	if (_thd.place_mode != VHM_NONE || _special_mouse_mode == WSM_DRAGDROP) {
10566
6467a5398cfb (svn r13110) -Fix [FS#2018]: some toolbar buttons not being unpressed properly.
rubidium
parents: 10560
diff changeset
  2722
		Window *w = FindWindowById(_thd.window_class, _thd.window_number);
6467a5398cfb (svn r13110) -Fix [FS#2018]: some toolbar buttons not being unpressed properly.
rubidium
parents: 10560
diff changeset
  2723
		if (w != NULL) {
6467a5398cfb (svn r13110) -Fix [FS#2018]: some toolbar buttons not being unpressed properly.
rubidium
parents: 10560
diff changeset
  2724
			/* Call the abort function, but set the window class to something
6467a5398cfb (svn r13110) -Fix [FS#2018]: some toolbar buttons not being unpressed properly.
rubidium
parents: 10560
diff changeset
  2725
			 * that will never be used to avoid infinite loops. Setting it to
6467a5398cfb (svn r13110) -Fix [FS#2018]: some toolbar buttons not being unpressed properly.
rubidium
parents: 10560
diff changeset
  2726
			 * the 'next' window class must not be done because recursion into
6467a5398cfb (svn r13110) -Fix [FS#2018]: some toolbar buttons not being unpressed properly.
rubidium
parents: 10560
diff changeset
  2727
			 * this function might in some cases reset the newly set object to
6467a5398cfb (svn r13110) -Fix [FS#2018]: some toolbar buttons not being unpressed properly.
rubidium
parents: 10560
diff changeset
  2728
			 * place or not properly reset the original selection. */
6467a5398cfb (svn r13110) -Fix [FS#2018]: some toolbar buttons not being unpressed properly.
rubidium
parents: 10560
diff changeset
  2729
			_thd.window_class = WC_INVALID;
6467a5398cfb (svn r13110) -Fix [FS#2018]: some toolbar buttons not being unpressed properly.
rubidium
parents: 10560
diff changeset
  2730
			w->OnPlaceObjectAbort();
6467a5398cfb (svn r13110) -Fix [FS#2018]: some toolbar buttons not being unpressed properly.
rubidium
parents: 10560
diff changeset
  2731
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2732
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  2733
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2734
	SetTileSelectSize(1, 1);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  2735
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2736
	_thd.make_square_red = false;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2737
8385
aedd7656cfd1 (svn r11440) -Codechange: replace magic numbers with enumified WindowHighlightMode constants. Patch by SmatZ.
rubidium
parents: 8384
diff changeset
  2738
	if (mode == VHM_DRAG) { // VHM_DRAG is for dragdropping trains in the depot window
aedd7656cfd1 (svn r11440) -Codechange: replace magic numbers with enumified WindowHighlightMode constants. Patch by SmatZ.
rubidium
parents: 8384
diff changeset
  2739
		mode = VHM_NONE;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2740
		_special_mouse_mode = WSM_DRAGDROP;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2741
	} else {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2742
		_special_mouse_mode = WSM_NONE;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2743
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2744
1863
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2745
	_thd.place_mode = mode;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2746
	_thd.window_class = window_class;
610acc8bc189 (svn r2369) Remove _thd_ptr: It always holds the address of _thd
tron
parents: 1542
diff changeset
  2747
	_thd.window_number = window_num;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2748
1070
bef634a62323 (svn r1571) Feature: Visually enhanced autorail placing
dominik
parents: 988
diff changeset
  2749
	if (mode == VHM_SPECIAL) // special tools, like tunnels or docks start with presizing mode
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2750
		VpStartPreSizing();
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 152
diff changeset
  2751
10560
0cf0a95ebaf9 (svn r13104) -Codechange: make ResetObjectToPlace safe to be called recursively via the OnPlaceObjectAbort callback and use this knowledge to simplify closing some windows.
rubidium
parents: 10512
diff changeset
  2752
	if ((int)icon < 0) {
4334
75322a204d0c (svn r6035) -Revert r5900 which supposedly fixed an invalid warning caused by buggy MS software
Darkvater
parents: 4272
diff changeset
  2753
		SetAnimatedMouseCursor(_animcursors[~icon]);
10560
0cf0a95ebaf9 (svn r13104) -Codechange: make ResetObjectToPlace safe to be called recursively via the OnPlaceObjectAbort callback and use this knowledge to simplify closing some windows.
rubidium
parents: 10512
diff changeset
  2754
	} else {
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5853
diff changeset
  2755
		SetMouseCursor(icon, pal);
10560
0cf0a95ebaf9 (svn r13104) -Codechange: make ResetObjectToPlace safe to be called recursively via the OnPlaceObjectAbort callback and use this knowledge to simplify closing some windows.
rubidium
parents: 10512
diff changeset
  2756
	}
0cf0a95ebaf9 (svn r13104) -Codechange: make ResetObjectToPlace safe to be called recursively via the OnPlaceObjectAbort callback and use this knowledge to simplify closing some windows.
rubidium
parents: 10512
diff changeset
  2757
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2758
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2759
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6443
diff changeset
  2760
void ResetObjectToPlace()
1093
e8d26c7dc42f (svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents: 1083
diff changeset
  2761
{
6144
5a0ffbf27ced (svn r8511) -Codechange: make WindowClass an enumerated value.
rubidium
parents: 5984
diff changeset
  2762
	SetObjectToPlace(SPR_CURSOR_MOUSE, PAL_NONE, VHM_NONE, WC_MAIN_WINDOW, 0);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2763
}
10771
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2764
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2765
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2766
void SaveViewportBeforeSaveGame()
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2767
{
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2768
	const Window *w = FindWindowById(WC_MAIN_WINDOW, 0);
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2769
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2770
	if (w != NULL) {
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2771
		_saved_scrollpos_x = w->viewport->scrollpos_x;
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2772
		_saved_scrollpos_y = w->viewport->scrollpos_y;
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2773
		_saved_scrollpos_zoom = w->viewport->zoom;
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2774
	}
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2775
}
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2776
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2777
void ResetViewportAfterLoadGame()
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2778
{
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2779
	Window *w = FindWindowById(WC_MAIN_WINDOW, 0);
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2780
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2781
	w->viewport->scrollpos_x = _saved_scrollpos_x;
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2782
	w->viewport->scrollpos_y = _saved_scrollpos_y;
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2783
	w->viewport->dest_scrollpos_x = _saved_scrollpos_x;
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2784
	w->viewport->dest_scrollpos_y = _saved_scrollpos_y;
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2785
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2786
	ViewPort *vp = w->viewport;
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2787
	vp->zoom = min(_saved_scrollpos_zoom, ZOOM_LVL_MAX);
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2788
	vp->virtual_width = ScaleByZoom(vp->width, vp->zoom);
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2789
	vp->virtual_height = ScaleByZoom(vp->height, vp->zoom);
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2790
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2791
	DoZoomInOutWindow(ZOOM_NONE, w); // update button status
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2792
	MarkWholeScreenDirty();
6c7035d85faf (svn r13321) -Codechange: move some GUI/viewport related functions out op openttd.cpp to viewport.cpp/window.cpp.
rubidium
parents: 10703
diff changeset
  2793
}