(svn r13688) [0.6] -Backport from trunk: 0.6
authorrubidium
Wed, 09 Jul 2008 19:20:50 +0000
branch0.6
changeset 11130 488ecb9d3296
parent 11129 72b8e47f86d8
child 11131 d8136dad6b1c
(svn r13688) [0.6] -Backport from trunk:
- Fix: If the first bridge can not be build for a given length, then none of the other bridges can. Effectively meaning that if someone replaces the first bridge with a bridge that can be only 3 tiles longs then only other bridges that can be 3 tiles long will be buildable, but only if they are 3 tiles long [FS#2100] (r13611)
- Fix: [OSX] 10.5 failed to switch to fullscreen (r13584)
- Fix: Properly count number of non-north housetiles [FS#2083] (r13518)
- Fix: Drawing of zoomed out partial sprites could cause deadlocks or crashes (r13502)
src/blitter/factory.hpp
src/bridge.h
src/gfx.cpp
src/town_cmd.cpp
src/tunnelbridge_cmd.cpp
--- a/src/blitter/factory.hpp	Wed Jul 09 19:15:43 2008 +0000
+++ b/src/blitter/factory.hpp	Wed Jul 09 19:20:50 2008 +0000
@@ -65,6 +65,13 @@
 	{
 		const char *default_blitter = "8bpp-optimized";
 
+#if defined(__APPLE__)
+		/* MacOS X 10.5 removed 8bpp fullscreen support.
+		 * Because of this we will pick 32bpp by default */
+		if (MacOSVersionIsAtLeast(10, 5, 0)) {
+			default_blitter = "32bpp-anim";
+		}
+#endif /* defined(__APPLE__) */
 		if (GetBlitters().size() == 0) return NULL;
 		const char *bname = (StrEmpty(name)) ? default_blitter : name;
 
--- a/src/bridge.h	Wed Jul 09 19:15:43 2008 +0000
+++ b/src/bridge.h	Wed Jul 09 19:20:50 2008 +0000
@@ -44,7 +44,7 @@
 
 void DrawBridgeMiddle(const TileInfo *ti);
 
-bool CheckBridge_Stuff(BridgeType bridge_type, uint bridge_len);
+bool CheckBridge_Stuff(BridgeType bridge_type, uint bridge_len, uint32 flags = 0);
 int CalcBridgeLenCostFactor(int x);
 
 void ResetBridges();
--- a/src/gfx.cpp	Wed Jul 09 19:15:43 2008 +0000
+++ b/src/gfx.cpp	Wed Jul 09 19:20:50 2008 +0000
@@ -669,7 +669,7 @@
 	}
 }
 
-static inline void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub)
+static void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub)
 {
 	const DrawPixelInfo *dpi = _cur_dpi;
 	Blitter::BlitterParams bp;
@@ -695,8 +695,8 @@
 	bp.height = UnScaleByZoom(sprite->height - clip_top - clip_bottom, dpi->zoom);
 	bp.top = 0;
 	bp.left = 0;
-	bp.skip_left = UnScaleByZoom(clip_left, dpi->zoom);
-	bp.skip_top = UnScaleByZoom(clip_top, dpi->zoom);
+	bp.skip_left = UnScaleByZoomLower(clip_left, dpi->zoom);
+	bp.skip_top = UnScaleByZoomLower(clip_top, dpi->zoom);
 
 	x += ScaleByZoom(bp.skip_left, dpi->zoom);
 	y += ScaleByZoom(bp.skip_top, dpi->zoom);
@@ -747,6 +747,9 @@
 		if (bp.width <= 0) return;
 	}
 
+	assert(bp.skip_left + bp.width <= UnScaleByZoom(sprite->width, dpi->zoom));
+	assert(bp.skip_top + bp.height <= UnScaleByZoom(sprite->height, dpi->zoom));
+
 	BlitterFactoryBase::GetCurrentBlitter()->Draw(&bp, mode, dpi->zoom);
 }
 
--- a/src/town_cmd.cpp	Wed Jul 09 19:15:43 2008 +0000
+++ b/src/town_cmd.cpp	Wed Jul 09 19:20:50 2008 +0000
@@ -1614,7 +1614,7 @@
  * @param random_bits required for newgrf houses
  * @pre house can be built here
  */
-static inline void ClearMakeHouseTile(TileIndex tile, TownID tid, byte counter, byte stage, HouseID type, byte random_bits)
+static inline void ClearMakeHouseTile(TileIndex tile, Town *t, byte counter, byte stage, HouseID type, byte random_bits)
 {
 	#if !defined(NDEBUG) || defined(WITH_ASSERT)
 		CommandCost cc =
@@ -1624,7 +1624,8 @@
 
 	assert(CmdSucceeded(cc));
 
-	MakeHouseTile(tile, tid, counter, stage, type, random_bits);
+	IncreaseBuildingCount(t, type);
+	MakeHouseTile(tile, t->index, counter, stage, type, random_bits);
 }
 
 
@@ -1638,14 +1639,14 @@
  * @param random_bits required for newgrf houses
  * @pre house can be built here
  */
-static void MakeTownHouse(TileIndex t, TownID tid, byte counter, byte stage, HouseID type, byte random_bits)
+static void MakeTownHouse(TileIndex t, Town *town, byte counter, byte stage, HouseID type, byte random_bits)
 {
 	BuildingFlags size = GetHouseSpecs(type)->building_flags;
 
-	ClearMakeHouseTile(t, tid, counter, stage, type, random_bits);
-	if (size & BUILDING_2_TILES_Y)   ClearMakeHouseTile(t + TileDiffXY(0, 1), tid, counter, stage, ++type, random_bits);
-	if (size & BUILDING_2_TILES_X)   ClearMakeHouseTile(t + TileDiffXY(1, 0), tid, counter, stage, ++type, random_bits);
-	if (size & BUILDING_HAS_4_TILES) ClearMakeHouseTile(t + TileDiffXY(1, 1), tid, counter, stage, ++type, random_bits);
+	ClearMakeHouseTile(t, town, counter, stage, type, random_bits);
+	if (size & BUILDING_2_TILES_Y)   ClearMakeHouseTile(t + TileDiffXY(0, 1), town, counter, stage, ++type, random_bits);
+	if (size & BUILDING_2_TILES_X)   ClearMakeHouseTile(t + TileDiffXY(1, 0), town, counter, stage, ++type, random_bits);
+	if (size & BUILDING_HAS_4_TILES) ClearMakeHouseTile(t + TileDiffXY(1, 1), town, counter, stage, ++type, random_bits);
 }
 
 
@@ -1938,7 +1939,6 @@
 
 		/* build the house */
 		t->num_houses++;
-		IncreaseBuildingCount(t, house);
 
 		/* Special houses that there can be only one of. */
 		t->flags12 |= oneof;
@@ -1959,7 +1959,7 @@
 			}
 		}
 
-		MakeTownHouse(tile, t->index, construction_counter, construction_stage, house, Random());
+		MakeTownHouse(tile, t, construction_counter, construction_stage, house, Random());
 
 		return true;
 	}
@@ -1968,9 +1968,10 @@
 }
 
 
-static void DoClearTownHouseHelper(TileIndex tile)
+static void DoClearTownHouseHelper(TileIndex tile, Town *t, HouseID house)
 {
 	assert(IsTileType(tile, MP_HOUSE));
+	DecreaseBuildingCount(t, house);
 	DoClearSquare(tile);
 	DeleteAnimatedTile(tile);
 }
@@ -2021,7 +2022,6 @@
 	}
 
 	t->num_houses--;
-	DecreaseBuildingCount(t, house);
 
 	/* Clear flags for houses that only may exist once/town. */
 	if (hs->building_flags & BUILDING_IS_CHURCH) {
@@ -2032,10 +2032,10 @@
 
 	/* Do the actual clearing of tiles */
 	eflags = hs->building_flags;
-	DoClearTownHouseHelper(tile);
-	if (eflags & BUILDING_2_TILES_X)   DoClearTownHouseHelper(tile + TileDiffXY(1, 0));
-	if (eflags & BUILDING_2_TILES_Y)   DoClearTownHouseHelper(tile + TileDiffXY(0, 1));
-	if (eflags & BUILDING_HAS_4_TILES) DoClearTownHouseHelper(tile + TileDiffXY(1, 1));
+	DoClearTownHouseHelper(tile, t, house);
+	if (eflags & BUILDING_2_TILES_Y)   DoClearTownHouseHelper(tile + TileDiffXY(0, 1), t, ++house);
+	if (eflags & BUILDING_2_TILES_X)   DoClearTownHouseHelper(tile + TileDiffXY(1, 0), t, ++house);
+	if (eflags & BUILDING_HAS_4_TILES) DoClearTownHouseHelper(tile + TileDiffXY(1, 1), t, ++house);
 }
 
 static bool IsUniqueTownName(const char *name)
--- a/src/tunnelbridge_cmd.cpp	Wed Jul 09 19:15:43 2008 +0000
+++ b/src/tunnelbridge_cmd.cpp	Wed Jul 09 19:20:50 2008 +0000
@@ -152,15 +152,18 @@
 	return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
 }
 
-bool CheckBridge_Stuff(BridgeType bridge_type, uint bridge_len)
+bool CheckBridge_Stuff(BridgeType bridge_type, uint bridge_len, uint32 flags)
 {
-	const BridgeSpec *b = GetBridgeSpec(bridge_type);
-	uint max; // max possible length of a bridge (with patch 100)
+	if (flags & DC_QUERY_COST) {
+		return bridge_len <= (_patches.longbridges ? 100 : 16);
+	}
 
 	if (bridge_type >= MAX_BRIDGES) return false;
+
+	const BridgeSpec *b = GetBridgeSpec(bridge_type);
 	if (b->avail_year > _cur_year) return false;
 
-	max = b->max_length;
+	uint max = b->max_length;
 	if (max >= 16 && _patches.longbridges) max = 100;
 
 	return b->min_length <= bridge_len && bridge_len <= max;
@@ -244,7 +247,7 @@
 
 	/* set and test bridge length, availability */
 	bridge_len = sx + sy - x - y - 1;
-	if (!CheckBridge_Stuff(bridge_type, bridge_len)) return_cmd_error(STR_5015_CAN_T_BUILD_BRIDGE_HERE);
+	if (!CheckBridge_Stuff(bridge_type, bridge_len, flags)) return_cmd_error(STR_5015_CAN_T_BUILD_BRIDGE_HERE);
 
 	/* retrieve landscape height and ensure it's on land */
 	tile_start = TileXY(x, y);