changeset 8985:480d464f5e24 draft

(svn r12779) -Codechange: remove a few constants from openttd.h.
author rubidium <rubidium@openttd.org>
date Fri, 18 Apr 2008 21:49:38 +0000
parents 3b959efd9667
children 6691bccdc43d
files src/gfx.cpp src/main_gui.cpp src/openttd.cpp src/openttd.h src/video/sdl_v.cpp src/video/win32_v.cpp
diffstat 6 files changed, 26 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/src/gfx.cpp
+++ b/src/gfx.cpp
@@ -17,6 +17,7 @@
 #include "strings_func.h"
 #include "core/math_func.hpp"
 #include "settings_type.h"
+#include "core/alloc_func.hpp"
 
 #include "table/palettes.h"
 #include "table/sprites.h"
@@ -67,9 +68,9 @@
 enum {
 	DIRTY_BLOCK_HEIGHT   = 8,
 	DIRTY_BLOCK_WIDTH    = 64,
-	DIRTY_BYTES_PER_LINE = MAX_SCREEN_WIDTH / DIRTY_BLOCK_WIDTH,
 };
-static byte _dirty_blocks[DIRTY_BYTES_PER_LINE * MAX_SCREEN_HEIGHT / DIRTY_BLOCK_HEIGHT];
+static uint _dirty_bytes_per_line = 0;
+static byte *_dirty_blocks = NULL;
 
 void GfxScroll(int left, int top, int width, int height, int xo, int yo)
 {
@@ -934,6 +935,9 @@
 
 void ScreenSizeChanged()
 {
+	_dirty_bytes_per_line = (_screen.width + DIRTY_BLOCK_WIDTH - 1) / DIRTY_BLOCK_WIDTH;
+	_dirty_blocks = ReallocT<byte>(_dirty_blocks, _dirty_bytes_per_line * ((_screen.height + DIRTY_BLOCK_HEIGHT - 1) / DIRTY_BLOCK_HEIGHT));
+
 	/* check the dirty rect */
 	if (_invalid_rect.right >= _screen.width) _invalid_rect.right = _screen.width;
 	if (_invalid_rect.bottom >= _screen.height) _invalid_rect.bottom = _screen.height;
@@ -1059,7 +1063,7 @@
 				/* First try coalescing downwards */
 				do {
 					*p = 0;
-					p += DIRTY_BYTES_PER_LINE;
+					p += _dirty_bytes_per_line;
 					bottom += DIRTY_BLOCK_HEIGHT;
 				} while (bottom != h && *p != 0);
 
@@ -1074,7 +1078,7 @@
 					/* Check if a full line of dirty flags is set. */
 					do {
 						if (!*p2) goto no_more_coalesc;
-						p2 += DIRTY_BYTES_PER_LINE;
+						p2 += _dirty_bytes_per_line;
 					} while (--h != 0);
 
 					/* Wohoo, can combine it one step to the right!
@@ -1085,7 +1089,7 @@
 					p2 = p;
 					do {
 						*p2 = 0;
-						p2 += DIRTY_BYTES_PER_LINE;
+						p2 += _dirty_bytes_per_line;
 					} while (--h != 0);
 				}
 				no_more_coalesc:
@@ -1104,7 +1108,7 @@
 
 			}
 		} while (b++, (x += DIRTY_BLOCK_WIDTH) != w);
-	} while (b += -(w / DIRTY_BLOCK_WIDTH) + DIRTY_BYTES_PER_LINE, (y += DIRTY_BLOCK_HEIGHT) != h);
+	} while (b += -(w / DIRTY_BLOCK_WIDTH) + _dirty_bytes_per_line, (y += DIRTY_BLOCK_HEIGHT) != h);
 
 	_invalid_rect.left = w;
 	_invalid_rect.top = h;
@@ -1154,7 +1158,7 @@
 	left /= DIRTY_BLOCK_WIDTH;
 	top  /= DIRTY_BLOCK_HEIGHT;
 
-	b = _dirty_blocks + top * DIRTY_BYTES_PER_LINE + left;
+	b = _dirty_blocks + top * _dirty_bytes_per_line + left;
 
 	width  = ((right  - 1) / DIRTY_BLOCK_WIDTH)  - left + 1;
 	height = ((bottom - 1) / DIRTY_BLOCK_HEIGHT) - top  + 1;
@@ -1166,7 +1170,7 @@
 
 		do b[--i] = 0xFF; while (i);
 
-		b += DIRTY_BYTES_PER_LINE;
+		b += _dirty_bytes_per_line;
 	} while (--height != 0);
 }
 
--- a/src/main_gui.cpp
+++ b/src/main_gui.cpp
@@ -449,7 +449,7 @@
 {
 	_cur_resolution[0] = _screen.width;
 	_cur_resolution[1] = _screen.height;
+	ScreenSizeChanged();
 	RelocateAllWindows(_screen.width, _screen.height);
-	ScreenSizeChanged();
 	MarkWholeScreenDirty();
 }
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -258,8 +258,8 @@
 		return;
 	}
 
-	res[0] = Clamp(strtoul(s, NULL, 0), 64, MAX_SCREEN_WIDTH);
-	res[1] = Clamp(strtoul(t + 1, NULL, 0), 64, MAX_SCREEN_HEIGHT);
+	res[0] = max(strtoul(s, NULL, 0), 64UL);
+	res[1] = max(strtoul(t + 1, NULL, 0), 64UL);
 }
 
 static void InitializeDynamicVariables()
--- a/src/openttd.h
+++ b/src/openttd.h
@@ -97,11 +97,6 @@
 
 extern byte _savegame_sort_order;
 
-enum {
-	MAX_SCREEN_WIDTH  = 2048,
-	MAX_SCREEN_HEIGHT = 1200,
-};
-
 /* In certain windows you navigate with the arrow keys. Do not scroll the
  * gameview when here. Bitencoded variable that only allows scrolling if all
  * elements are zero */
--- a/src/video/sdl_v.cpp
+++ b/src/video/sdl_v.cpp
@@ -127,8 +127,7 @@
 		for (i = 0; modes[i]; i++) {
 			int w = modes[i]->w;
 			int h = modes[i]->h;
-			if (IsInsideMM(w, 640, MAX_SCREEN_WIDTH + 1) &&
-					IsInsideMM(h, 480, MAX_SCREEN_HEIGHT + 1)) {
+			if (w >= 640 && h >= 480) {
 				int j;
 				for (j = 0; j < n; j++) {
 					if (_resolutions[j][0] == w && _resolutions[j][1] == h) break;
@@ -419,8 +418,8 @@
 			break;
 
 		case SDL_VIDEORESIZE: {
-			int w = Clamp(ev.resize.w, 64, MAX_SCREEN_WIDTH);
-			int h = Clamp(ev.resize.h, 64, MAX_SCREEN_HEIGHT);
+			int w = max(ev.resize.w, 64);
+			int h = max(ev.resize.h, 64);
 			ChangeResInGame(w, h);
 			break;
 		}
--- a/src/video/win32_v.cpp
+++ b/src/video/win32_v.cpp
@@ -545,8 +545,8 @@
 
 			w = r->right - r->left - (r2.right - r2.left);
 			h = r->bottom - r->top - (r2.bottom - r2.top);
-			w = Clamp(w, 64, MAX_SCREEN_WIDTH);
-			h = Clamp(h, 64, MAX_SCREEN_HEIGHT);
+			w = max(w, 64);
+			h = max(h, 64);
 			SetRect(&r2, 0, 0, w, h);
 
 			AdjustWindowRect(&r2, GetWindowLong(hwnd, GWL_STYLE), FALSE);
@@ -677,8 +677,8 @@
 	HDC dc;
 	int bpp = BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth();
 
-	w = Clamp(w, 64, MAX_SCREEN_WIDTH);
-	h = Clamp(h, 64, MAX_SCREEN_HEIGHT);
+	w = max(w, 64);
+	h = max(h, 64);
 
 	if (bpp == 0) error("Can't use a blitter that blits 0 bpp for normal visuals");
 
@@ -737,8 +737,8 @@
 	 * Doesn't really matter since we don't pass a string anyways, but still
 	 * a letdown */
 	for (i = 0; EnumDisplaySettingsA(NULL, i, &dm) != 0; i++) {
-		if (dm.dmBitsPerPel == BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth() && IsInsideMM(dm.dmPelsWidth, 640, MAX_SCREEN_WIDTH + 1) &&
-				IsInsideMM(dm.dmPelsHeight, 480, MAX_SCREEN_HEIGHT + 1)) {
+		if (dm.dmBitsPerPel == BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth() &&
+				dm.dmPelsWidth >= 640 && dm.dmPelsHeight >= 480) {
 			uint j;
 
 			for (j = 0; j < n; j++) {
@@ -787,9 +787,9 @@
 	_wnd.height_org = _cur_resolution[1];
 
 	AllocateDibSection(_cur_resolution[0], _cur_resolution[1]);
-	MarkWholeScreenDirty();
+	MakeWindow(_fullscreen);
 
-	MakeWindow(_fullscreen);
+	MarkWholeScreenDirty();
 
 	return NULL;
 }