1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-24 07:14:31 +01:00

remove gScreenDPI

This commit is contained in:
Ted John
2016-06-05 17:59:35 +01:00
parent 932dec75d0
commit 996202ac43
9 changed files with 105 additions and 90 deletions

View File

@@ -224,58 +224,7 @@ void sub_683326(int left, int top, int right, int bottom)
RCT2_CALLPROC_X(0x00683359, left, top, right, bottom, 0, 0, 0);
}
/**
* shifts pixels from the region in a direction. Used when a viewport moves;
* consider putting in src/drawing/drawing.c or src/drawing/rect.c
*
* rct2: 0x00683359
* ax = x
* bx = y;
* cx = width;
* dx = height;
* di = dx;
* si = dy;
*/
void gfx_move_screen_rect(int x, int y, int width, int height, int dx, int dy)
{
// nothing to do
if (dx == 0 && dy == 0)
return;
// get screen info
rct_drawpixelinfo *screenDPI = &gScreenDPI;
// adjust for move off screen
// NOTE: when zooming, there can be x, y, dx, dy combinations that go off the
// screen; hence the checks. This code should ultimately not be called when
// zooming because this function is specific to updating the screen on move
int lmargin = min(x - dx, 0);
int rmargin = min(gScreenWidth - (x - dx + width), 0);
int tmargin = min(y - dy, 0);
int bmargin = min(gScreenHeight - (y - dy + height), 0);
x -= lmargin;
y -= tmargin;
width += lmargin + rmargin;
height += tmargin + bmargin;
sint32 stride = screenDPI->width + screenDPI->pitch;
uint8* to = screenDPI->bits + y * stride + x;
uint8* from = screenDPI->bits + (y - dy) * stride + x - dx;
if (dy > 0)
{
// if positive dy, reverse directions
to += (height - 1) * stride;
from += (height - 1) * stride;
stride = -stride;
}
// move bits
for (int i = 0; i < height; i++, to += stride, from += stride)
memmove(to, from, width);
}
void sub_6E7FF3(rct_window *window, rct_viewport *viewport, int x, int y)
void sub_6E7FF3(rct_drawpixelinfo *dpi, rct_window *window, rct_viewport *viewport, int x, int y)
{
// sub-divide by intersecting windows
if (window < gWindowNextSlot)
@@ -286,7 +235,7 @@ void sub_6E7FF3(rct_window *window, rct_viewport *viewport, int x, int y)
viewport->x >= window->x + window->width ||
viewport->y + viewport->height <= window->y ||
viewport->y >= window->y + window->height){
sub_6E7FF3(window + 1, viewport, x, y);
sub_6E7FF3(dpi, window + 1, viewport, x, y);
return;
}
@@ -298,49 +247,49 @@ void sub_6E7FF3(rct_window *window, rct_viewport *viewport, int x, int y)
{
viewport->width = window->x - viewport->x;
viewport->view_width = viewport->width << viewport->zoom;
sub_6E7FF3(window, viewport, x, y);
sub_6E7FF3(dpi, window, viewport, x, y);
viewport->x += viewport->width;
viewport->view_x += viewport->width << viewport->zoom;
viewport->width = view_copy.width - viewport->width;
viewport->view_width = viewport->width << viewport->zoom;
sub_6E7FF3(window, viewport, x, y);
sub_6E7FF3(dpi, window, viewport, x, y);
}
else if (viewport->x + viewport->width > window->x + window->width)
{
viewport->width = window->x + window->width - viewport->x;
viewport->view_width = viewport->width << viewport->zoom;
sub_6E7FF3(window, viewport, x, y);
sub_6E7FF3(dpi, window, viewport, x, y);
viewport->x += viewport->width;
viewport->view_x += viewport->width << viewport->zoom;
viewport->width = view_copy.width - viewport->width;
viewport->view_width = viewport->width << viewport->zoom;
sub_6E7FF3(window, viewport, x, y);
sub_6E7FF3(dpi, window, viewport, x, y);
}
else if (viewport->y < window->y)
{
viewport->height = window->y - viewport->y;
viewport->view_width = viewport->width << viewport->zoom;
sub_6E7FF3(window, viewport, x, y);
sub_6E7FF3(dpi, window, viewport, x, y);
viewport->y += viewport->height;
viewport->view_y += viewport->height << viewport->zoom;
viewport->height = view_copy.height - viewport->height;
viewport->view_width = viewport->width << viewport->zoom;
sub_6E7FF3(window, viewport, x, y);
sub_6E7FF3(dpi, window, viewport, x, y);
}
else if (viewport->y + viewport->height > window->y + window->height)
{
viewport->height = window->y + window->height - viewport->y;
viewport->view_width = viewport->width << viewport->zoom;
sub_6E7FF3(window, viewport, x, y);
sub_6E7FF3(dpi, window, viewport, x, y);
viewport->y += viewport->height;
viewport->view_y += viewport->height << viewport->zoom;
viewport->height = view_copy.height - viewport->height;
viewport->view_width = viewport->width << viewport->zoom;
sub_6E7FF3(window, viewport, x, y);
sub_6E7FF3(dpi, window, viewport, x, y);
}
// restore viewport
@@ -357,20 +306,20 @@ void sub_6E7FF3(rct_window *window, rct_viewport *viewport, int x, int y)
if (abs(x) < viewport->width && abs(y) < viewport->height)
{
// update whole block ?
gfx_move_screen_rect(viewport->x, viewport->y, viewport->width, viewport->height, x, y);
drawing_engine_copy_rect(viewport->x, viewport->y, viewport->width, viewport->height, x, y);
if (x > 0)
{
// draw left
sint16 _right = viewport->x + x;
gfx_redraw_screen_rect(left, top, _right, bottom);
window_draw_all(dpi, left, top, _right, bottom);
left += x;
}
else if (x < 0)
{
// draw right
sint16 _left = viewport->x + viewport->width + x;
gfx_redraw_screen_rect(_left, top, right, bottom);
window_draw_all(dpi, _left, top, right, bottom);
right += x;
}
@@ -378,24 +327,24 @@ void sub_6E7FF3(rct_window *window, rct_viewport *viewport, int x, int y)
{
// draw top
bottom = viewport->y + y;
gfx_redraw_screen_rect(left, top, right, bottom);
window_draw_all(dpi, left, top, right, bottom);
}
else if (y < 0)
{
// draw bottom
top = viewport->y + viewport->height + y;
gfx_redraw_screen_rect(left, top, right, bottom);
window_draw_all(dpi, left, top, right, bottom);
}
}
else
{
// redraw whole viewport
gfx_redraw_screen_rect(left, top, right, bottom);
window_draw_all(dpi, left, top, right, bottom);
}
}
}
void viewport_shift_pixels(rct_window* w, rct_viewport* viewport, sint16 x_diff, sint16 y_diff)
void viewport_shift_pixels(rct_drawpixelinfo *dpi, rct_window* w, rct_viewport* viewport, sint16 x_diff, sint16 y_diff)
{
rct_window* orignal_w = w;
int left = 0, right = 0, top = 0, bottom = 0;
@@ -424,11 +373,11 @@ void viewport_shift_pixels(rct_window* w, rct_viewport* viewport, sint16 x_diff,
if (left >= right) continue;
if (top >= bottom) continue;
gfx_redraw_screen_rect(left, top, right, bottom);
window_draw_all(dpi, left, top, right, bottom);
}
w = orignal_w;
sub_6E7FF3(w, viewport, x_diff, y_diff);
sub_6E7FF3(dpi, w, viewport, x_diff, y_diff);
}
void viewport_move(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport)
@@ -456,8 +405,11 @@ void viewport_move(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport)
if (left >= right) return;
if (top >= bottom) return;
gfx_redraw_screen_rect(left, top, right, bottom);
return;
if (drawing_engine_has_dirty_optimisations()) {
rct_drawpixelinfo *dpi = drawing_engine_get_dpi();
window_draw_all(dpi, left, top, right, bottom);
return;
}
}
rct_viewport view_copy;
@@ -500,7 +452,8 @@ void viewport_move(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport)
}
if (drawing_engine_has_dirty_optimisations()) {
viewport_shift_pixels(w, viewport, x_diff, y_diff);
rct_drawpixelinfo *dpi = drawing_engine_get_dpi();
viewport_shift_pixels(dpi, w, viewport, x_diff, y_diff);
}
memcpy(viewport, &view_copy, sizeof(rct_viewport));

View File

@@ -560,6 +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_all(rct_drawpixelinfo *dpi, short left, short top, short right, short 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);