From 47a307d50a300b7cf5b932b0030c733feef06e94 Mon Sep 17 00:00:00 2001 From: halfbro Date: Sat, 29 Nov 2014 00:40:53 -0500 Subject: [PATCH 1/3] Fix rain not drawing on high resolutions --- src/drawing/drawing.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index c206a26834..f28f24bb35 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -437,20 +437,21 @@ void gfx_draw_rain(int left, int top, int width, int height, sint32 x_start, sin uint8 pattern_y_space = *pattern++; uint8 pattern_start_x_offset = x_start % pattern_x_space; - uint8 pattern_start_y_offset = y_start % pattern_y_space;; + uint8 pattern_start_y_offset = y_start % pattern_y_space; rct_drawpixelinfo* dpi = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo); uint32 pixel_offset = (dpi->pitch + dpi->width)*top + left; - uint8 pattern_y_pos = pattern_start_y_offset; + uint8 pattern_y_pos = pattern_start_y_offset % pattern_y_space; //Stores the colours of changed pixels uint32* pixel_store = RCT2_ADDRESS(RCT2_ADDRESS_RAIN_PIXEL_STORE, uint32); pixel_store += RCT2_GLOBAL(RCT2_ADDRESS_NO_RAIN_PIXELS, uint32); for (; height != 0; height--){ + uint8 pattern_x = pattern[pattern_y_pos * 2]; if (pattern_x != 0xFF){ - if (RCT2_GLOBAL(0x9AC00C, uint32) <= 0x1F38){ + if (RCT2_GLOBAL(RCT2_ADDRESS_NO_RAIN_PIXELS, uint32) <= 0x4000){ int final_pixel_offset = width + pixel_offset; @@ -465,6 +466,7 @@ void gfx_draw_rain(int left, int top, int width, int height, sint32 x_start, sin //Store colour and position *pixel_store++ = (x_pixel_offset << 8) | current_pixel; + } } } From 242bee9a0714051f87df960c5f02cc0e2edce16d Mon Sep 17 00:00:00 2001 From: halfbro Date: Thu, 4 Dec 2014 00:51:58 -0500 Subject: [PATCH 2/3] Update rain pixels to use own global variable --- src/addresses.h | 1 + src/drawing/drawing.c | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 3348f94360..e937141f15 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -213,6 +213,7 @@ //Every pixel changed by rain is stored. //32bit (pixel_offset 24 bit)(pixel_colour 8 bit) +//Use the rainPixels[] global in drawing.c from now on #define RCT2_ADDRESS_RAIN_PIXEL_STORE 0x00EDF850 #define RCT2_ADDRESS_UNCOMPLETED_RESEARCH_TYPES 0x00EE787C diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index f28f24bb35..2c246ddb5b 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -37,6 +37,8 @@ int gLastDrawStringY; uint8 _screenDirtyBlocks[5120]; +uint32 rainPixels[0x4000]; + //Originally 0x9ABE0C, 12 elements from 0xF3 are the peep top colour, 12 elements from 0xCA are peep trouser colour const uint8 peep_palette[0x100] = { 0x00, 0xF3, 0xF4, 0xF5, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, @@ -444,7 +446,7 @@ void gfx_draw_rain(int left, int top, int width, int height, sint32 x_start, sin uint8 pattern_y_pos = pattern_start_y_offset % pattern_y_space; //Stores the colours of changed pixels - uint32* pixel_store = RCT2_ADDRESS(RCT2_ADDRESS_RAIN_PIXEL_STORE, uint32); + uint32* pixel_store = rainPixels; pixel_store += RCT2_GLOBAL(RCT2_ADDRESS_NO_RAIN_PIXELS, uint32); for (; height != 0; height--){ @@ -505,7 +507,7 @@ void redraw_peep_and_rain() rct_window *window = window_get_main(); uint32 numPixels = window->width * window->height; - uint32 *rain_pixels = RCT2_ADDRESS(RCT2_ADDRESS_RAIN_PIXEL_STORE, uint32); + uint32 *rain_pixels = rainPixels; if (rain_pixels) { uint8 *screen_pixels = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo)->bits; for (int i = 0; i < rain_no_pixels; i++) { From c5c9609b375e26a101a2b46c79a4565fdf6bd1fe Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Thu, 4 Dec 2014 20:39:49 +0000 Subject: [PATCH 3/3] Fixed the buffer overflow. Increased the number of pixels again --- src/drawing/drawing.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index 9af2bda0c7..9dceb89a9a 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -31,7 +31,8 @@ int gLastDrawStringY; uint8 _screenDirtyBlocks[5120]; -uint32 rainPixels[0x4000]; +#define MAX_RAIN_PIXELS 0x9000 +uint32 rainPixels[MAX_RAIN_PIXELS]; //Originally 0x9ABE0C, 12 elements from 0xF3 are the peep top colour, 12 elements from 0xCA are peep trouser colour const uint8 peep_palette[0x100] = { @@ -447,7 +448,7 @@ void gfx_draw_rain(int left, int top, int width, int height, sint32 x_start, sin uint8 pattern_x = pattern[pattern_y_pos * 2]; if (pattern_x != 0xFF){ - if (RCT2_GLOBAL(RCT2_ADDRESS_NO_RAIN_PIXELS, uint32) <= 0x4000){ + if (RCT2_GLOBAL(RCT2_ADDRESS_NO_RAIN_PIXELS, uint32) < (MAX_RAIN_PIXELS - (uint32)width)){ int final_pixel_offset = width + pixel_offset;