fm77av: greatly simplified ALU line drawing. Might even be a bit faster, too. (no whatsnew)

This commit is contained in:
mahlemiut 2014-07-01 08:19:05 +00:00
parent 98eac17316
commit 19e5e53a28

View File

@ -517,110 +517,42 @@ void fm7_state::fm77av_line_draw()
int x2 = m_alu.x1; int x2 = m_alu.x1;
int y1 = m_alu.y0; int y1 = m_alu.y0;
int y2 = m_alu.y1; int y2 = m_alu.y1;
int horiz,vert;
int dirx,diry; int dx = abs(x2 - x1);
int rep; int dy = abs(y2 - y1);
int stepx, stepy;
int err,err2;
int byte_count = 0; int byte_count = 0;
UINT16 old_addr = 0xffff;
UINT16 addr;
m_alu.busy = 1; if(x1 < x2)
stepx = 1;
horiz = x2 - x1;
vert = y2 - y1;
if(horiz < 0)
{
dirx = -1;
horiz = -horiz;
}
else else
dirx = 1; stepx = -1;
if(vert < 0) if(y1 < y2)
{ stepy = 1;
diry = -1;
vert = -vert;
}
else else
diry = 1; stepy = -1;
if(horiz == 0 && vert == 0) err = dx - dy;
for(;;)
{ {
fm7_line_set_pixel(x1, y1); fm7_line_set_pixel(x1, y1);
byte_count = 1;
}
else if(horiz == 0)
{
for(;;)
{
addr = fm7_line_set_pixel(x1, y1);
if(addr != old_addr)
{
byte_count++; byte_count++;
old_addr = addr;
} if(x1 == x2 && y1 == y2)
if(y1 == y2)
break; break;
y1 += diry;
} err2 = 2*err;
} if(err2 > -dy)
else if(vert == 0)
{ {
for(;;) err -= dy;
{ x1 += stepx;
addr = fm7_line_set_pixel(x1, y1);
if(addr != old_addr)
{
byte_count++;
old_addr = addr;
} }
if(x1 == x2) if(err2 < dx)
break;
x1 += dirx;
}
}
else if(horiz >= vert)
{ {
rep = horiz >> 1; err += dx;
for(;;) y1 += stepy;
{
addr = fm7_line_set_pixel(x1, y1);
if(addr != old_addr)
{
byte_count++;
old_addr = addr;
}
if(x1 == x2)
break;
x1 += dirx;
rep -= vert;
if(rep < 0)
{
rep += horiz;
y1 += diry;
}
}
}
else
{
rep = vert >> 1;
for(;;)
{
addr = fm7_line_set_pixel(x1, y1);
if(addr != old_addr)
{
byte_count++;
old_addr = addr;
}
if(y1 == y2)
break;
y1 += diry;
rep -= horiz;
if(rep < 0)
{
rep += vert;
x1 += dirx;
}
} }
} }