Changeset - r17021:46adb9858c78
[Not reviewed]
master
0 1 0
frosch - 13 years ago 2011-01-11 16:45:45
frosch@openttd.org
(svn r21768) -Fix [FS#4396]: Diagonal tile iterator needed a special case for A * 0 selections.
1 file changed with 27 insertions and 15 deletions:
0 comments (0 inline, 0 general)
src/tilearea.cpp
Show inline comments
 
@@ -139,26 +139,38 @@ TileIterator &DiagonalTileIterator::oper
 
{
 
	assert(this->tile != INVALID_TILE);
 

	
 
	/* Determine the next tile, while clipping at map borders */
 
	bool new_line = false;
 
	do {
 
		/* Iterate using the rotated coordinates. */
 
		if (this->a_max > 0) {
 
			this->a_cur += 2;
 
			new_line = this->a_cur >= this->a_max;
 
		if (this->a_max == 1 || this->a_max == -1) {
 
			/* Special case: Every second column has zero length, skip them completely */
 
			this->a_cur = 0;
 
			if (this->b_max > 0) {
 
				this->b_cur = min(this->b_cur + 2, this->b_max);
 
			} else {
 
				this->b_cur = max(this->b_cur - 2, this->b_max);
 
			}
 
		} else {
 
			this->a_cur -= 2;
 
			new_line = this->a_cur <= this->a_max;
 
		}
 
		if (new_line) {
 
			/* offset of initial a_cur: one tile in the same direction as a_max
 
			 * every second line.
 
			 */
 
			this->a_cur = abs(this->a_cur) % 2 ? 0 : (this->a_max > 0 ? 1 : -1);
 
			/* Every column has at least one tile to process */
 
			if (this->a_max > 0) {
 
				this->a_cur += 2;
 
				new_line = this->a_cur >= this->a_max;
 
			} else {
 
				this->a_cur -= 2;
 
				new_line = this->a_cur <= this->a_max;
 
			}
 
			if (new_line) {
 
				/* offset of initial a_cur: one tile in the same direction as a_max
 
				 * every second line.
 
				 */
 
				this->a_cur = abs(this->a_cur) % 2 ? 0 : (this->a_max > 0 ? 1 : -1);
 

	
 
			if (this->b_max > 0) {
 
				++this->b_cur;
 
			} else {
 
				--this->b_cur;
 
				if (this->b_max > 0) {
 
					++this->b_cur;
 
				} else {
 
					--this->b_cur;
 
				}
 
			}
 
		}
 

	
0 comments (0 inline, 0 general)