Rewrote gfx_draw_line_on_buffer after realising how it works

This commit is contained in:
Duncan Frost 2014-05-11 20:10:32 +01:00
parent cd8587243c
commit 45532da9c6
2 changed files with 78 additions and 49 deletions

126
src/gfx.c
View File

@ -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){
x_diff = -x_diff;
int ax = x_diff;
int dx = y2 - y1;
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 = cx; int ax = x_diff;
int dx = y2 - y1; y_diff = y2 - y1;
if (dx < 0){ 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;

View File

@ -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--) {