1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-21 14:02:59 +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

@@ -43,9 +43,11 @@ interface IDrawingEngine
virtual void Invalidate(sint32 left, sint32 top, sint32 right, sint32 bottom) abstract;
virtual void Draw() abstract;
virtual void CopyRect(sint32 x, sint32 y, sint32 width, sint32 height, sint32 dx, sint32 dy) abstract;
virtual sint32 Screenshot() abstract;
virtual IDrawingContext * GetDrawingContext(rct_drawpixelinfo * dpi) abstract;
virtual IDrawingContext * GetDrawingContext(rct_drawpixelinfo * dpi) abstract;
virtual rct_drawpixelinfo * GetDrawingPixelInfo() abstract;
virtual DRAWING_ENGINE_FLAGS GetFlags() abstract;
};

View File

@@ -60,12 +60,26 @@ extern "C"
_drawingEngine->Draw();
}
void drawing_engine_copy_rect(int x, int y, int width, int height, int dx, int dy)
{
if (_drawingEngine != nullptr)
{
_drawingEngine->CopyRect(x, y, width, height, dx, dy);
}
}
void drawing_engine_dispose()
{
delete _drawingEngine;
_drawingEngine = nullptr;
}
rct_drawpixelinfo * drawing_engine_get_dpi()
{
assert(_drawingEngine != nullptr);
return _drawingEngine->GetDrawingPixelInfo();
}
bool drawing_engine_has_dirty_optimisations()
{
bool result = false;

View File

@@ -25,8 +25,10 @@ void drawing_engine_init();
void drawing_engine_resize();
void drawing_engine_set_palette(SDL_Color * colours);
void drawing_engine_draw();
void drawing_engine_copy_rect(int x, int y, int width, int height, int dx, int dy);
void drawing_engine_dispose();
rct_drawpixelinfo * drawing_engine_get_dpi();
bool drawing_engine_has_dirty_optimisations();
#ifdef _cplusplus

View File

@@ -27,8 +27,6 @@
int gLastDrawStringX;
int gLastDrawStringY;
rct_drawpixelinfo gScreenDPI;
uint8 gGamePalette[256 * 4];
uint32 gPaletteEffectFrame;
@@ -177,17 +175,15 @@ void gfx_invalidate_screen()
* right (dx)
* bottom (bp)
*/
void gfx_redraw_screen_rect(short left, short top, short right, short bottom)
void window_draw_all(rct_drawpixelinfo *dpi, short left, short top, short right, short bottom)
{
rct_drawpixelinfo *screenDPI = &gScreenDPI;
rct_drawpixelinfo windowDPI;
windowDPI.bits = screenDPI->bits + left + ((screenDPI->width + screenDPI->pitch) * top);
windowDPI.bits = dpi->bits + left + ((dpi->width + dpi->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.pitch = dpi->width + dpi->pitch + left - right;
windowDPI.zoom_level = 0;
for (rct_window *w = g_window_list; w < gWindowNextSlot; w++) {

View File

@@ -113,13 +113,10 @@ extern sint32 gPickupPeepY;
extern rct_g1_element *g1Elements;
extern rct_gx g2;
extern rct_drawpixelinfo gScreenDPI;
//
bool clip_drawpixelinfo(rct_drawpixelinfo *dst, rct_drawpixelinfo *src, int x, int y, int width, int height);
void gfx_set_dirty_blocks(sint16 left, sint16 top, sint16 right, sint16 bottom);
void gfx_draw_all_dirty_blocks();
void gfx_redraw_screen_rect(short left, short top, short right, short bottom);
void gfx_invalidate_screen();
// palette

View File

@@ -180,7 +180,7 @@ public:
intro_draw(&_bitsDPI);
} else {
window_update_all_viewports();
gfx_redraw_screen_rect(0, 0, _width - 1, _height - 1);
window_draw_all(&_bitsDPI, 0, 0, _width - 1, _height - 1);
window_update_all();
gfx_draw_pickedup_peep(&_bitsDPI);
@@ -196,12 +196,22 @@ public:
return -1;
}
void CopyRect(sint32 x, sint32 y, sint32 width, sint32 height, sint32 dx, sint32 dy) override
{
// Not applicable for this engine
}
IDrawingContext * GetDrawingContext(rct_drawpixelinfo * dpi) override
{
_drawingContext->SetDPI(dpi);
return _drawingContext;
}
rct_drawpixelinfo * GetDrawingPixelInfo() override
{
return &_bitsDPI;
}
DRAWING_ENGINE_FLAGS GetFlags() override
{
return DEF_NONE;
@@ -262,8 +272,6 @@ private:
dpi->width = width;
dpi->height = height;
dpi->pitch = _pitch - width;
gScreenDPI = *dpi;
}
void Display()

View File

@@ -316,6 +316,45 @@ public:
Display();
}
void CopyRect(sint32 x, sint32 y, sint32 width, sint32 height, sint32 dx, sint32 dy) override
{
if (dx == 0 && dy == 0) return;
// Originally 0x00683359
// 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 = Math::Min(x - dx, 0);
int rmargin = Math::Min((sint32)_width - (x - dx + width), 0);
int tmargin = Math::Min(y - dy, 0);
int bmargin = Math::Min((sint32)_height - (y - dy + height), 0);
x -= lmargin;
y -= tmargin;
width += lmargin + rmargin;
height += tmargin + bmargin;
sint32 stride = _bitsDPI.width + _bitsDPI.pitch;
uint8 * to = _bitsDPI.bits + y * stride + x;
uint8 * from = _bitsDPI.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 bytes
for (int i = 0; i < height; i++)
{
memmove(to, from, width);
to += stride;
from += stride;
}
}
sint32 Screenshot() override
{
return screenshot_dump_png(&_bitsDPI);
@@ -327,6 +366,11 @@ public:
return _drawingContext;
}
rct_drawpixelinfo * GetDrawingPixelInfo() override
{
return &_bitsDPI;
}
DRAWING_ENGINE_FLAGS GetFlags() override
{
return DEF_DIRTY_OPTIMISATIONS;
@@ -388,8 +432,6 @@ private:
dpi->height = height;
dpi->pitch = _pitch - width;
gScreenDPI = *dpi;
ConfigureDirtyGrid();
}
@@ -480,7 +522,7 @@ private:
}
// Draw region
gfx_redraw_screen_rect(left, top, right, bottom);
window_draw_all(&_bitsDPI, left, top, right, bottom);
}
void Display()

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);