mirror of https://github.com/OpenRCT2/OpenRCT2.git
Rewrote gfx_draw_line_on_buffer after realising how it works
This commit is contained in:
parent
cd8587243c
commit
45532da9c6
124
src/gfx.c
124
src/gfx.c
|
@ -99,43 +99,46 @@ void gfx_draw_pixel(rct_drawpixelinfo *dpi, int x, int y, int colour)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
* Draws a horizontal line of specified colour to a buffer.
|
||||||
* rct2: 0x68474C
|
* rct2: 0x68474C
|
||||||
*/
|
*/
|
||||||
void gfx_draw_line_on_buffer(int edi, int ebp, int esi)
|
void gfx_draw_line_on_buffer(rct_drawpixelinfo *dpi, char colour, int y, int x, int no_pixels)
|
||||||
{
|
{
|
||||||
//edi ebp
|
y -= dpi->y;
|
||||||
//int edi, ebp, esi;
|
|
||||||
edi -= RCT2_GLOBAL(0x9ABDBE, sint16);
|
|
||||||
|
|
||||||
if (edi < 0)return;
|
//Check to make sure point is in the y range
|
||||||
if (edi >= RCT2_GLOBAL(0x9ABDC2, sint16))return;
|
if (y < 0)return;
|
||||||
|
if (y >= dpi->height)return;
|
||||||
|
//Check to make sure we are drawing at least a pixel
|
||||||
|
if (!no_pixels) return;
|
||||||
|
|
||||||
if (!ebp) return;
|
no_pixels++;
|
||||||
|
x -= dpi->x;
|
||||||
|
|
||||||
ebp++;
|
//If x coord outside range leave
|
||||||
esi -= RCT2_GLOBAL(0x9ABDBC, sint16);
|
if (x < 0){
|
||||||
if (esi < 0){
|
//Unless the number of pixels is enough to be in range
|
||||||
ebp += esi;
|
no_pixels += x;
|
||||||
if (ebp <= 0)return;
|
if (no_pixels <= 0)return;
|
||||||
esi = 0;
|
//Resets starting point to 0 as we don't draw outside the range
|
||||||
|
x = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int eax = esi;
|
//Ensure that the end point of the line is within range
|
||||||
eax += ebp;
|
if (x + no_pixels - dpi->width > 0){
|
||||||
eax -= RCT2_GLOBAL(0x9ABDC0, sint16);
|
//If the end point has any pixels outside range
|
||||||
if (eax > 0){
|
//cut them off. If there are now no pixels return.
|
||||||
ebp -= eax;
|
no_pixels -= x + no_pixels - dpi->width;
|
||||||
return;
|
if (no_pixels <= 0)return;
|
||||||
}
|
}
|
||||||
eax = RCT2_GLOBAL(0x9ABDC4, sint16);
|
|
||||||
eax += RCT2_GLOBAL(0x9ABDC0, sint16);
|
char* bits_pointer;
|
||||||
edi *= eax;
|
//Get the buffer we are drawing to and move to the first coordinate.
|
||||||
edi += esi;
|
bits_pointer = dpi->bits + y*(dpi->pitch + dpi->width) + x;
|
||||||
edi += RCT2_GLOBAL(0x9ABDB8, sint32);
|
|
||||||
eax = RCT2_GLOBAL(0xEDF84A,uint16);
|
//Draw the line to the specified colour
|
||||||
for (int i = 0; i < ebp; ++i){
|
for (; no_pixels > 0; --no_pixels, ++bits_pointer){
|
||||||
*((uint8*)edi) = eax;
|
*((uint8*)bits_pointer) = colour;
|
||||||
edi++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -153,6 +156,7 @@ void gfx_draw_line_on_buffer(int edi, int ebp, int esi)
|
||||||
void gfx_draw_line(rct_drawpixelinfo *dpi, int x1, int y1, int x2, int y2, int colour)
|
void gfx_draw_line(rct_drawpixelinfo *dpi, int x1, int y1, int x2, int y2, int colour)
|
||||||
{
|
{
|
||||||
//RCT2_CALLPROC_X(0x00684466, x1, y1, x2, y2, 0, dpi, colour);
|
//RCT2_CALLPROC_X(0x00684466, x1, y1, x2, y2, 0, dpi, colour);
|
||||||
|
//return;
|
||||||
|
|
||||||
if ((x1 < dpi->x) && (x2 < dpi->x)){
|
if ((x1 < dpi->x) && (x2 < dpi->x)){
|
||||||
return;//jump to 0x68474B
|
return;//jump to 0x68474B
|
||||||
|
@ -162,11 +166,11 @@ void gfx_draw_line(rct_drawpixelinfo *dpi, int x1, int y1, int x2, int y2, int c
|
||||||
return;//jump to 0x68474B
|
return;//jump to 0x68474B
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((x1 <= (dpi->x + dpi->width)) && (x2 <= (dpi->x + dpi->width))){
|
if ((x1 > (dpi->x + dpi->width)) && (x2 > (dpi->x + dpi->width))){
|
||||||
return;//jump to 0x68474B
|
return;//jump to 0x68474B
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((y1 <= (dpi->y + dpi->height)) && (y2 <= (dpi->y + dpi->height))){
|
if ((y1 > (dpi->y + dpi->height)) && (y2 > (dpi->y + dpi->height))){
|
||||||
return;//jump to 0x68474B
|
return;//jump to 0x68474B
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,41 +188,67 @@ void gfx_draw_line(rct_drawpixelinfo *dpi, int x1, int y1, int x2, int y2, int c
|
||||||
int edi = y1;
|
int edi = y1;
|
||||||
int esi = x1;
|
int esi = x1;
|
||||||
int ebp = colour & 0xFFFF;
|
int ebp = colour & 0xFFFF;
|
||||||
int cx = x2 - x1;
|
int x_diff, y_diff;
|
||||||
if (cx < 0){
|
x_diff = x2 - x1;
|
||||||
//jump 0x684633
|
|
||||||
}
|
if (x1 > x2){
|
||||||
int ax = cx;
|
x_diff = -x_diff;
|
||||||
|
int ax = x_diff;
|
||||||
int dx = y2 - y1;
|
int dx = y2 - y1;
|
||||||
if (dx < 0){
|
if (dx < 0){
|
||||||
|
RCT2_CALLPROC_X(0x6846C5, ax, x2, x_diff, dx, esi, edi, ebp);
|
||||||
|
return;
|
||||||
|
//jump 0x6846C5
|
||||||
|
}
|
||||||
|
RCT2_GLOBAL(0xEDF846, uint16) = x_diff;
|
||||||
|
RCT2_GLOBAL(0xEDF848, uint16) = y2 - y1;
|
||||||
|
if (dx > x_diff){
|
||||||
|
RCT2_CALLPROC_X(0x684691, ax, x2, x_diff, dx, esi, edi, ebp);
|
||||||
|
return;
|
||||||
|
//jump 0x684691
|
||||||
|
}
|
||||||
|
ax--;
|
||||||
|
if (ax < 0)return;
|
||||||
|
x_diff /= 2;
|
||||||
|
x_diff = -x_diff;
|
||||||
|
ebp = 0;
|
||||||
|
return;//not finished
|
||||||
|
}
|
||||||
|
int ax = x_diff;
|
||||||
|
y_diff = y2 - y1;
|
||||||
|
if (y1 > y2){
|
||||||
|
RCT2_CALLPROC_X(0x6845AB, ax, x2, x_diff, y_diff, esi, edi, ebp);
|
||||||
|
return;
|
||||||
//jump 0x6845AB
|
//jump 0x6845AB
|
||||||
}
|
}
|
||||||
RCT2_GLOBAL(0xEDF846, uint16) = cx;
|
RCT2_GLOBAL(0xEDF846, uint16) = x_diff;
|
||||||
RCT2_GLOBAL(0xEDF848, uint16) = dx;
|
RCT2_GLOBAL(0xEDF848, uint16) = y_diff;
|
||||||
if (dx > cx){
|
if ((y2 - y1) > (x2 - x1)){
|
||||||
|
RCT2_CALLPROC_X(0x68456A, ax, x2, x_diff, y_diff, esi, edi, ebp);
|
||||||
|
return;
|
||||||
//jump 0x68456A
|
//jump 0x68456A
|
||||||
}
|
}
|
||||||
ax--;
|
ax--;
|
||||||
if (ax < 0){
|
if (ax < 0){
|
||||||
|
RCT2_CALLPROC_X(0x684568, ax, x2, x_diff, y_diff, esi, edi, ebp);
|
||||||
return;//jump 0x684568
|
return;//jump 0x684568
|
||||||
}
|
}
|
||||||
cx /= 2;
|
x_diff /= 2;
|
||||||
cx = -cx;
|
x_diff = -x_diff;
|
||||||
ebp = 0;
|
ebp = 0;
|
||||||
|
|
||||||
for (int i = ax; i >= 0; i--){
|
for (int i = ax; i >= 0; i--){
|
||||||
ebp++;
|
ebp++;
|
||||||
cx += RCT2_GLOBAL(0xEDF848, sint16);
|
x_diff += y_diff;
|
||||||
if (cx <= 0){
|
if (x_diff <= 0){
|
||||||
i--;
|
if (i-1 < 0){
|
||||||
if (i < 0){
|
gfx_draw_line_on_buffer(dpi, (uint16)(0xFFFF & colour), edi, ebp, esi);
|
||||||
gfx_draw_line_on_buffer(edi, ebp, esi);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
cx -= RCT2_GLOBAL(0xEDF846, sint16);
|
x_diff -= x2 - x1;
|
||||||
gfx_draw_line_on_buffer(edi, ebp, esi);
|
gfx_draw_line_on_buffer(dpi, (uint16)(0xFFFF & colour), edi, ebp, esi);
|
||||||
esi += ebp;
|
esi += ebp;
|
||||||
edi++;
|
edi++;
|
||||||
ebp = 0;
|
ebp = 0;
|
||||||
|
|
|
@ -2139,7 +2139,6 @@ static void window_park_graph_draw_months(rct_drawpixelinfo *dpi, uint8 *history
|
||||||
static void window_park_graph_draw_line_a(rct_drawpixelinfo *dpi, uint8 *history, int baseX, int baseY)
|
static void window_park_graph_draw_line_a(rct_drawpixelinfo *dpi, uint8 *history, int baseX, int baseY)
|
||||||
{
|
{
|
||||||
int i, x, y, lastX, lastY;
|
int i, x, y, lastX, lastY;
|
||||||
|
|
||||||
lastX = -1;
|
lastX = -1;
|
||||||
x = baseX;
|
x = baseX;
|
||||||
for (i = 31; i >= 0; i--) {
|
for (i = 31; i >= 0; i--) {
|
||||||
|
|
Loading…
Reference in New Issue