1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-06 06:32:56 +01:00

remove usages of gScreenDPI and gWindowDPI

This commit is contained in:
Ted John
2016-06-05 15:11:12 +01:00
parent ccec48e382
commit 83fc6ec4af
15 changed files with 115 additions and 128 deletions

View File

@@ -20,4 +20,4 @@
interface IRainDrawer;
void DrawRain(IRainDrawer * rainDrawer);
void DrawRain(rct_drawpixelinfo * dpi, IRainDrawer * rainDrawer);

View File

@@ -28,7 +28,6 @@ int gLastDrawStringX;
int gLastDrawStringY;
rct_drawpixelinfo gScreenDPI;
rct_drawpixelinfo gWindowDPI;
uint8 gGamePalette[256 * 4];
uint32 gPaletteEffectFrame;
@@ -181,23 +180,22 @@ void gfx_invalidate_screen()
void gfx_redraw_screen_rect(short left, short top, short right, short bottom)
{
rct_drawpixelinfo *screenDPI = &gScreenDPI;
rct_drawpixelinfo *windowDPI = &gWindowDPI;
windowDPI->bits = screenDPI->bits + left + ((screenDPI->width + screenDPI->pitch) * top);
windowDPI->x = left;
windowDPI->y = top;
windowDPI->width = right - left;
windowDPI->height = bottom - top;
windowDPI->pitch = screenDPI->width + screenDPI->pitch + left - right;
rct_drawpixelinfo windowDPI;
windowDPI.bits = screenDPI->bits + left + ((screenDPI->width + screenDPI->pitch) * top);
windowDPI.x = left;
windowDPI.y = top;
windowDPI.width = right - left;
windowDPI.height = bottom - top;
windowDPI.pitch = screenDPI->width + screenDPI->pitch + left - right;
windowDPI.zoom_level = 0;
for (rct_window *w = g_window_list; w < gWindowNextSlot; w++) {
if (w->flags & WF_TRANSPARENT)
continue;
if (right <= w->x || bottom <= w->y)
continue;
if (left >= w->x + w->width || top >= w->y + w->height)
continue;
window_draw(w, left, top, right, bottom);
if (w->flags & WF_TRANSPARENT) continue;
if (right <= w->x || bottom <= w->y) continue;
if (left >= w->x + w->width || top >= w->y + w->height) continue;
window_draw(&windowDPI, w, left, top, right, bottom);
}
}

View File

@@ -114,7 +114,6 @@ extern rct_g1_element *g1Elements;
extern rct_gx g2;
extern rct_drawpixelinfo gScreenDPI;
extern rct_drawpixelinfo gWindowDPI;
//
bool clip_drawpixelinfo(rct_drawpixelinfo *dst, rct_drawpixelinfo *src, int x, int y, int width, int height);
@@ -187,6 +186,8 @@ void ttf_dispose();
void scrolling_text_initialise_bitmaps();
int scrolling_text_setup(rct_string_id stringId, uint16 scroll, uint16 scrollingMode);
void rct2_draw(rct_drawpixelinfo *dpi);
#include "NewDrawing.h"
#endif

View File

@@ -181,7 +181,7 @@ public:
gfx_draw_pickedup_peep(&_bitsDPI);
rct2_draw();
rct2_draw(&_bitsDPI);
Display();
}

View File

@@ -304,9 +304,9 @@ public:
gfx_draw_pickedup_peep(&_bitsDPI);
gfx_invalidate_pickedup_peep();
DrawRain(&_rainDrawer);
DrawRain(&_bitsDPI, &_rainDrawer);
rct2_draw();
rct2_draw(&_bitsDPI);
Display();
}

View File

@@ -152,13 +152,12 @@ static void DrawRainWindow(IRainDrawer * rainDrawer,
*
* rct2: 0x00684266
*/
static void DrawRainAnimation(IRainDrawer * rainDrawer, uint32 rainType)
static void DrawRainAnimation(rct_drawpixelinfo * dpi, IRainDrawer * rainDrawer, uint32 rainType)
{
rct_drawpixelinfo * screenDPI = &gScreenDPI;
sint32 left = screenDPI->x;
sint32 right = left + screenDPI->width;
sint32 top = screenDPI->y;
sint32 bottom = top + screenDPI->height;
sint32 left = dpi->x;
sint32 right = left + dpi->width;
sint32 top = dpi->y;
sint32 bottom = top + dpi->height;
rct_window * newWindow = gWindowNextSlot;
for (rct_window * w = g_window_list; w < newWindow; w++)
@@ -171,13 +170,13 @@ static void DrawRainAnimation(IRainDrawer * rainDrawer, uint32 rainType)
*
* rct2: 0x00684218
*/
void DrawRain(IRainDrawer * rainDrawer)
void DrawRain(rct_drawpixelinfo * dpi, IRainDrawer * rainDrawer)
{
// Get rain draw function and draw rain
uint32 rainType = gClimateCurrentRainLevel;
if (rainType > 0 && !(RCT2_GLOBAL(0x009DEA6F, uint8) & 1))
{
DrawRainAnimation(rainDrawer, rainType);
DrawRainAnimation(dpi, rainDrawer, rainType);
}
}

View File

@@ -74,13 +74,12 @@ void chat_update()
_chatCaretTicks = (_chatCaretTicks + 1) % 30;
}
void chat_draw()
void chat_draw(rct_drawpixelinfo * dpi)
{
if (network_get_mode() == NETWORK_MODE_NONE || network_get_status() != NETWORK_STATUS_CONNECTED || network_get_authstatus() != NETWORK_AUTH_OK) {
gChatOpen = false;
return;
}
rct_drawpixelinfo *dpi = &gScreenDPI;
_chatLeft = 10;
_chatTop = gScreenHeight - 40 - ((CHAT_HISTORY_SIZE + 1) * 10);
_chatRight = gScreenWidth - 10;

View File

@@ -28,7 +28,7 @@ void chat_toggle();
void chat_init();
void chat_update();
void chat_draw();
void chat_draw(rct_drawpixelinfo * dpi);
void chat_history_add(const char *src);
void chat_input(int c);

View File

@@ -73,7 +73,8 @@ float window_scroll_locations[][2] = {
static bool sub_6EA95D(int x, int y, int width, int height);
static void window_all_wheel_input();
static int window_draw_split(rct_window *w, int left, int top, int right, int bottom);
static int window_draw_split(rct_drawpixelinfo *dpi, rct_window *w, int left, int top, int right, int bottom);
static void window_draw_single(rct_drawpixelinfo *dpi, rct_window *w, int left, int top, int right, int bottom);
int window_get_widget_index(rct_window *w, rct_widget *widget)
{
@@ -1461,14 +1462,10 @@ void window_zoom_out(rct_window *w)
* right (dx)
* bottom (bp)
*/
void window_draw(rct_window *w, int left, int top, int right, int bottom)
void window_draw(rct_drawpixelinfo *dpi, rct_window *w, int left, int top, int right, int bottom)
{
rct_window* v;
rct_drawpixelinfo *dpi, copy;
int overflow;
// Split window into only the regions that require drawing
if (window_draw_split(w, left, top, right, bottom))
if (window_draw_split(dpi, w, left, top, right, bottom))
return;
// Clamp region
@@ -1476,71 +1473,15 @@ void window_draw(rct_window *w, int left, int top, int right, int bottom)
top = max(top, w->y);
right = min(right, w->x + w->width);
bottom = min(bottom, w->y + w->height);
if (left >= right)
return;
if (top >= bottom)
return;
if (left >= right) return;
if (top >= bottom) return;
// Draw the window in this region
for (v = w; v < RCT2_NEW_WINDOW; v++) {
for (rct_window *v = w; v < RCT2_NEW_WINDOW; v++) {
// Don't draw overlapping opaque windows, they won't have changed
if (w != v && !(v->flags & WF_TRANSPARENT))
continue;
copy = gWindowDPI;
dpi = &copy;
// Clamp left to 0
overflow = left - dpi->x;
if (overflow > 0) {
dpi->x += overflow;
dpi->width -= overflow;
if (dpi->width <= 0)
continue;
dpi->pitch += overflow;
dpi->bits += overflow;
if (w == v || (v->flags & WF_TRANSPARENT)) {
window_draw_single(dpi, v, left, top, right, bottom);
}
// Clamp width to right
overflow = dpi->x + dpi->width - right;
if (overflow > 0) {
dpi->width -= overflow;
if (dpi->width <= 0)
continue;
dpi->pitch += overflow;
}
// Clamp top to 0
overflow = top - dpi->y;
if (overflow > 0) {
dpi->y += overflow;
dpi->height -= overflow;
if (dpi->height <= 0)
continue;
dpi->bits += (dpi->width + dpi->pitch) * overflow;
}
// Clamp height to bottom
overflow = dpi->y + dpi->height - bottom;
if (overflow > 0) {
dpi->height -= overflow;
if (dpi->height <= 0)
continue;
}
RCT2_GLOBAL(0x01420070, sint32) = v->x;
// Invalidate modifies the window colours so first get the correct
// colour before setting the global variables for the string painting
window_event_invalidate_call(v);
// Text colouring
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_1, uint8) = v->colours[0] & 0x7F;
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_2, uint8) = v->colours[1] & 0x7F;
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_3, uint8) = v->colours[2] & 0x7F;
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_4, uint8) = v->colours[3] & 0x7F;
window_event_paint_call(v, dpi);
}
}
@@ -1548,7 +1489,7 @@ void window_draw(rct_window *w, int left, int top, int right, int bottom)
* Splits a drawing of a window into regions that can be seen and are not hidden
* by other opaque overlapping windows.
*/
static int window_draw_split(rct_window *w, int left, int top, int right, int bottom)
static int window_draw_split(rct_drawpixelinfo *dpi, rct_window *w, int left, int top, int right, int bottom)
{
rct_window* topwindow;
@@ -1565,20 +1506,20 @@ static int window_draw_split(rct_window *w, int left, int top, int right, int bo
// A window overlaps w, split up the draw into two regions where the window starts to overlap
if (topwindow->x > left) {
// Split draw at topwindow.left
window_draw(w, left, top, topwindow->x, bottom);
window_draw(w, topwindow->x, top, right, bottom);
window_draw(dpi, w, left, top, topwindow->x, bottom);
window_draw(dpi, w, topwindow->x, top, right, bottom);
} else if (topwindow->x + topwindow->width < right) {
// Split draw at topwindow.right
window_draw(w, left, top, topwindow->x + topwindow->width, bottom);
window_draw(w, topwindow->x + topwindow->width, top, right, bottom);
window_draw(dpi, w, left, top, topwindow->x + topwindow->width, bottom);
window_draw(dpi, w, topwindow->x + topwindow->width, top, right, bottom);
} else if (topwindow->y > top) {
// Split draw at topwindow.top
window_draw(w, left, top, right, topwindow->y);
window_draw(w, left, topwindow->y, right, bottom);
window_draw(dpi, w, left, top, right, topwindow->y);
window_draw(dpi, w, left, topwindow->y, right, bottom);
} else if (topwindow->y + topwindow->height < bottom) {
// Split draw at topwindow.bottom
window_draw(w, left, top, right, topwindow->y + topwindow->height);
window_draw(w, left, topwindow->y + topwindow->height, right, bottom);
window_draw(dpi, w, left, top, right, topwindow->y + topwindow->height);
window_draw(dpi, w, left, topwindow->y + topwindow->height, right, bottom);
}
// Drawing for this region should be done now, exit
@@ -1589,6 +1530,65 @@ static int window_draw_split(rct_window *w, int left, int top, int right, int bo
return 0;
}
static void window_draw_single(rct_drawpixelinfo *dpi, rct_window *w, int left, int top, int right, int bottom)
{
// Copy dpi so we can crop it
rct_drawpixelinfo copy = *dpi;
dpi = &copy;
// Clamp left to 0
int overflow = left - dpi->x;
if (overflow > 0) {
dpi->x += overflow;
dpi->width -= overflow;
if (dpi->width <= 0)
return;
dpi->pitch += overflow;
dpi->bits += overflow;
}
// Clamp width to right
overflow = dpi->x + dpi->width - right;
if (overflow > 0) {
dpi->width -= overflow;
if (dpi->width <= 0)
return;
dpi->pitch += overflow;
}
// Clamp top to 0
overflow = top - dpi->y;
if (overflow > 0) {
dpi->y += overflow;
dpi->height -= overflow;
if (dpi->height <= 0)
return;
dpi->bits += (dpi->width + dpi->pitch) * overflow;
}
// Clamp height to bottom
overflow = dpi->y + dpi->height - bottom;
if (overflow > 0) {
dpi->height -= overflow;
if (dpi->height <= 0)
return;
}
RCT2_GLOBAL(0x01420070, sint32) = w->x;
// Invalidate modifies the window colours so first get the correct
// colour before setting the global variables for the string painting
window_event_invalidate_call(w);
// Text colouring
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_1, uint8) = w->colours[0] & 0x7F;
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_2, uint8) = w->colours[1] & 0x7F;
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_3, uint8) = w->colours[2] & 0x7F;
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_4, uint8) = w->colours[3] & 0x7F;
window_event_paint_call(w, dpi);
}
/**
*
* rct2: 0x006EB15C

View File

@@ -560,7 +560,7 @@ void window_zoom_out(rct_window *w);
void window_show_textinput(rct_window *w, int widgetIndex, uint16 title, uint16 text, int value);
void window_text_input_key(rct_window* w, int key);
void window_draw(rct_window *w, int left, int top, int right, int bottom);
void window_draw(rct_drawpixelinfo *dpi, rct_window *w, int left, int top, int right, int bottom);
void window_draw_widgets(rct_window *w, rct_drawpixelinfo *dpi);
void window_draw_viewport(rct_drawpixelinfo *dpi, rct_window *w);

View File

@@ -418,7 +418,6 @@ static void openrct2_loop()
}
if ((SDL_GetWindowFlags(gWindow) & (SDL_WINDOW_MINIMIZED | SDL_WINDOW_HIDDEN)) == 0) {
// rct2_draw();
platform_draw();
}
@@ -454,7 +453,6 @@ static void openrct2_loop()
rct2_update();
if ((SDL_GetWindowFlags(gWindow) & (SDL_WINDOW_MINIMIZED | SDL_WINDOW_HIDDEN)) == 0) {
rct2_draw();
platform_draw();
}
}
@@ -591,11 +589,6 @@ bool openrct2_setup_rct2_segment()
*/
static void openrct2_setup_rct2_hooks()
{
addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0, 0); // remove when all callers are decompiled
addhook(0x006E7499, (int)gfx_redraw_screen_rect, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0, 0); // remove when 0x6E7FF3 is decompiled
addhook(0x006B752C, (int)ride_crash, 0, (int[]){ EDX, EBX, END }, 0, 0); // remove when all callers are decompiled
addhook(0x0069A42F, (int)peep_window_state_update, 0, (int[]){ ESI, END }, 0, 0); // remove when all callers are decompiled
addhook(0x006BB76E, (int)audio_play_sound_panned, 0, (int[]){EAX, EBX, ECX, EDX, EBP, END}, 0, EAX); // remove when all callers are decompiled
addhook(0x006C42D9, (int)scrolling_text_setup, 0, (int[]){EAX, ECX, EBP, END}, 0, EBX); // remove when all callers are decompiled
addhook(0x006C2321, (int)gfx_get_string_width, 0, (int[]){ESI, END}, 0, ECX); // remove when all callers are decompiled
addhook(0x006C2555, (int)format_string, 0, (int[]){EDI, EAX, ECX, END}, 0, 0); // remove when all callers are decompiled

View File

@@ -121,7 +121,7 @@ void print_launch_information();
int rct2_init_directories();
int rct2_startup_checks();
static void rct2_draw_fps();
static void rct2_draw_fps(rct_drawpixelinfo *dpi);
void rct2_quit()
{
@@ -273,7 +273,7 @@ int rct2_startup_checks()
return 1;
}
void rct2_draw()
void rct2_draw(rct_drawpixelinfo *dpi)
{
if (gIntroState != INTRO_STATE_NONE) {
return;
@@ -286,15 +286,15 @@ void rct2_draw()
// update_rain_animation();
update_palette_effects();
chat_draw();
console_draw(&gScreenDPI);
chat_draw(dpi);
console_draw(dpi);
if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) {
DrawOpenRCT2(0, gScreenHeight - 20);
DrawOpenRCT2(dpi, 0, gScreenHeight - 20);
}
if (gConfigGeneral.show_fps) {
rct2_draw_fps();
rct2_draw_fps(dpi);
}
gCurrentDrawCount++;
@@ -317,9 +317,8 @@ static float rct2_measure_fps()
return _currentFPS;
}
static void rct2_draw_fps()
static void rct2_draw_fps(rct_drawpixelinfo *dpi)
{
rct_drawpixelinfo *dpi = &gScreenDPI;
int x = gScreenWidth / 2;
int y = 2;

View File

@@ -282,7 +282,6 @@ extern sint32 gScreenHeight;
int rct2_init();
void rct2_dispose();
void rct2_update();
void rct2_draw();
void substitute_path(char *dest, const char *path, const char *filename);
int check_mutex();
int check_file_paths();

View File

@@ -490,10 +490,9 @@ static void title_update_showcase()
} while (gTitleScriptSkipTo != -1 && gTitleScriptSkipLoad == -1);
}
void DrawOpenRCT2(int x, int y)
void DrawOpenRCT2(rct_drawpixelinfo *dpi, int x, int y)
{
utf8 buffer[256];
rct_drawpixelinfo *dpi = &gScreenDPI;
// Draw background
gfx_fill_rect_inset(dpi, x, y, x + 128, y + 20, TRANSLUCENT(COLOUR_DARK_GREEN), 0x8);

View File

@@ -45,6 +45,6 @@ void title_skip_from_beginning();
void title_script_get_line(SDL_RWops *file, char *parts);
bool title_refresh_sequence();
void title_fix_location();
void DrawOpenRCT2(int x, int y);
void DrawOpenRCT2(rct_drawpixelinfo *dpi, int x, int y);
#endif