diff options
-rw-r--r-- | src/gfx.cpp | 20 | ||||
-rw-r--r-- | src/main_gui.cpp | 2 | ||||
-rw-r--r-- | src/openttd.cpp | 4 | ||||
-rw-r--r-- | src/openttd.h | 5 | ||||
-rw-r--r-- | src/video/sdl_v.cpp | 7 | ||||
-rw-r--r-- | src/video/win32_v.cpp | 16 |
6 files changed, 26 insertions, 28 deletions
diff --git a/src/gfx.cpp b/src/gfx.cpp index ce48ac8bd..af77f3d45 100644 --- 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 @@ static byte _string_colorremap[3]; 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 @@ byte GetCharacterWidth(FontSize size, WChar key) 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 @@ void DrawDirtyBlocks() /* 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 @@ void DrawDirtyBlocks() /* 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 @@ void DrawDirtyBlocks() 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 @@ void DrawDirtyBlocks() } } 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 @@ void SetDirtyBlocks(int left, int top, int right, int bottom) 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 @@ void SetDirtyBlocks(int left, int top, int right, int bottom) do b[--i] = 0xFF; while (i); - b += DIRTY_BYTES_PER_LINE; + b += _dirty_bytes_per_line; } while (--height != 0); } diff --git a/src/main_gui.cpp b/src/main_gui.cpp index dd4886c03..6fe53a425 100644 --- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -449,7 +449,7 @@ void GameSizeChanged() { _cur_resolution[0] = _screen.width; _cur_resolution[1] = _screen.height; - RelocateAllWindows(_screen.width, _screen.height); ScreenSizeChanged(); + RelocateAllWindows(_screen.width, _screen.height); MarkWholeScreenDirty(); } diff --git a/src/openttd.cpp b/src/openttd.cpp index cf4e23a37..82bd359f6 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -258,8 +258,8 @@ static void ParseResolution(int res[2], const char *s) 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() diff --git a/src/openttd.h b/src/openttd.h index 445d95b05..f860aba3e 100644 --- a/src/openttd.h +++ b/src/openttd.h @@ -97,11 +97,6 @@ enum { 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 */ diff --git a/src/video/sdl_v.cpp b/src/video/sdl_v.cpp index 12478cfc9..6bf74488d 100644 --- a/src/video/sdl_v.cpp +++ b/src/video/sdl_v.cpp @@ -127,8 +127,7 @@ static void GetVideoModes() 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 @@ static int PollEvent() 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; } diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index 5030362c6..0ab7be62f 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -545,8 +545,8 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP 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 @@ static bool AllocateDibSection(int w, int h) 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 @@ static void FindResolutions() * 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,10 +787,10 @@ const char *VideoDriver_Win32::Start(const char * const *parm) _wnd.height_org = _cur_resolution[1]; AllocateDibSection(_cur_resolution[0], _cur_resolution[1]); - MarkWholeScreenDirty(); - MakeWindow(_fullscreen); + MarkWholeScreenDirty(); + return NULL; } |