From: Jay Link (jlink@interlink-bbs.com)
Date: Sun 30 Jan 2000 - 20:56:54 IST
Yet another improvement. Now, the antialiased line reads the existing
colors before it writes, to ensure a better blend with the background.
However, some of the diagonal lines still look crappy, especially in
320 x 200 modes. This does mostly disappear in 640 x 480 and up.
#include <stdlib.h>
#include <vga.h>
#include <vgagl.h>
void wu_line(int x1, int y1, int x2, int y2, int r, int g, int b);
int main(void)
{
int i;
vga_init();
vga_setmode(G320x200x256);
gl_setcontextvga(G320x200x256);
gl_setrgbpalette();
gl_clearscreen(0);
for (i = 60; i < 260; i++)
{
wu_line(160, 100, i, 199, 255, 255, 255);
vga_getch();
gl_clearscreen(0);
}
for (i = 199; i >= 0; i--)
{
wu_line(160, 100, 259, i, 255, 255, 255);
vga_getch();
gl_clearscreen(0);
}
for (i = 259; i >= 60; i--)
{
wu_line(160, 100, i, 0, 255, 255, 255);
vga_getch();
gl_clearscreen(0);
}
for (i = 0; i < 200; i++)
{
wu_line(160, 100, 60, i, 255, 255, 255);
vga_getch();
gl_clearscreen(0);
}
vga_setmode(TEXT);
return 0;
}
void wu_line(int x1, int y1, int x2, int y2, int r, int g, int b)
{
#define ABS(a) (((a)<0) ? -(a) : (a))
int dx, dy, ax, ay, ax2, ay2, sx, sy, x, y;
int r1, g1, b1, r2, g2, b2;
int highr, lowr, highg, lowg, highb, lowb;
int percent, compliment;
int color;
dx = x2 - x1;
dy = y2 - y1;
ax = ABS(dx) << 1;
ax2 = ax * 2;
ay = ABS(dy) << 1;
ay2 = ay * 2;
sx = (dx >= 0) ? 1 : -1;
sy = (dy >= 0) ? 1 : -1;
if (x1 == x2)
{
color = gl_rgbcolor(r, g, b);
gl_line(x1, y1, x2, y2, color);
return;
} else if (y1 == y2) {
color = gl_rgbcolor(r, g, b);
gl_hline(x1, y1, x2, color);
return;
} else if (ax == ay) {
color = gl_rgbcolor(r, g, b);
gl_line(x1, y1, x2, y2, color);
return;
}
x = x1;
y = y1;
gl_setpixelrgb(x, y, r, g, b);
if (ax > ay)
{
int d = ay - (ax >> 1);
while (x != x2)
{
if (d > 0 || (d == 0 && sx == 1))
{
y += sy;
d -= ax;
}
x += sx;
d += ay;
percent = ((ABS(d) * 100) / ax);
compliment = 100 - percent;
gl_getpixelrgb(x, y, &r1, &g1, &b1);
highr = (r > r1) ? r : r1;
lowr = (r == highr) ? r1 : r;
r2 = (((highr - lowr) * percent) / 100);
r2 = (r > r1) ? r2 : (255 - r2);
highg = (g > g1) ? g : g1;
lowg = (g == highg) ? g1 : g;
g2 = (((highg - lowg) * percent) / 100) + lowg;
g2 = (g > g1) ? g2 : (255 - g2);
highb = (b > b1) ? b : b1;
lowb = (b == highb) ? b1 : b;
b2 = (((highb - lowb) * percent) / 100) + lowb;
b2 = (b > b1) ? b2 : (255 - b2);
gl_setpixelrgb(x, y, r2, g2, b2);
if (ay2 > ax)
{
gl_getpixelrgb(x, (y - sy), &r1, &g1, &b1);
highr = (r > r1) ? r : r1;
lowr = (r == highr) ? r1 : r;
r2 = (((highr - lowr) * compliment) / 100) + lowr;
r2 = (r > r1) ? r2 : (255 - r2);
highg = (g > g1) ? g : g1;
lowg = (g == highg) ? g1 : g;
g2 = (((highg - lowg) * compliment) / 100) + lowg;
g2 = (g > g1) ? g2 : (255 - g2);
highb = (b > b1) ? b : b1;
lowb = (b == highb) ? b1 : b;
b2 = (((highb - lowb) * compliment) / 100) + lowb;
b2 = (b > b1) ? b2 : (255 - b2);
gl_setpixelrgb(x, (y - sy), r2, g2, b2);
} else {
gl_getpixelrgb(x, (y + sy), &r1, &g1, &b1);
highr = (r > r1) ? r : r1;
lowr = (r == highr) ? r1 : r;
r2 = (((highr - lowr) * compliment) / 100) + lowr;
r2 = (r > r1) ? r2 : (255 - r2);
highg = (g > g1) ? g : g1;
lowg = (g == highg) ? g1 : g;
g2 = (((highg - lowg) * compliment) / 100) + lowg;
g2 = (g > g1) ? g2 : (255 - g2);
highb = (b > b1) ? b : b1;
lowb = (b == highb) ? b1 : b;
b2 = (((highb - lowb) * compliment) / 100) + lowb;
b2 = (b > b1) ? b2 : (255 - b2);
gl_setpixelrgb(x, (y + sy), r2, g2, b2);
}
}
} else {
int d = ax - (ay >> 1);
while (y != y2)
{
if (d > 0 || (d == 0 && sy == 1))
{
x += sx;
d -= ay;
}
y += sy;
d += ax;
percent = ((ABS(d) * 100) / ay);
compliment = 100 - percent;
gl_getpixelrgb(x, y, &r1, &g1, &b1);
highr = (r > r1) ? r : r1;
lowr = (r == highr) ? r1 : r;
r2 = (((highr - lowr) * percent) / 100) + lowr;
r2 = (r > r1) ? r2 : (255 - r2);
highg = (g > g1) ? g : g1;
lowg = (g == highg) ? g1 : g;
g2 = (((highg - lowg) * percent) / 100) + lowg;
g2 = (g > g1) ? g2 : (255 - g2);
highb = (b > b1) ? b : b1;
lowb = (b == highb) ? b1 : b;
b2 = (((highb - lowb) * percent) / 100) + lowb;
b2 = (b > b1) ? b2 : (255 - b2);
gl_setpixelrgb(x, y, r2, g2, b2);
if (ax2 > ay)
{
gl_getpixelrgb((x - sx), y, &r1, &g1, &b1);
highr = (r > r1) ? r : r1;
lowr = (r == highr) ? r1 : r;
r2 = (((highr - lowr) * compliment) / 100) + lowr;
r2 = (r > r1) ? r2 : (255 - r2);
highg = (g > g1) ? g : g1;
lowg = (g == highg) ? g1 : g;
g2 = (((highg - lowg) * compliment) / 100) + lowg;
g2 = (g > g1) ? g2 : (255 - g2);
highb = (b > b1) ? b : b1;
lowb = (b == highb) ? b1 : b;
b2 = (((highb - lowb) * compliment) / 100) + lowb;
b2 = (b > b1) ? b2 : (255 - b2);
gl_setpixelrgb((x - sx), y, r2, g2, b2);
} else {
gl_getpixelrgb((x + sx), y, &r1, &g1, &b1);
highr = (r > r1) ? r : r1;
lowr = (r == highr) ? r1 : r;
r2 = (((highr - lowr) * compliment) / 100) + lowr;
r2 = (r > r1) ? r2 : (255 - r2);
highg = (g > g1) ? g : g1;
lowg = (g == highg) ? g1 : g;
g2 = (((highg - lowg) * compliment) / 100) + lowg;
g2 = (g > g1) ? g2 : (255 - g2);
highb = (b > b1) ? b : b1;
lowb = (b == highb) ? b1 : b;
b2 = (((highb - lowb) * compliment) / 100) + lowb;
b2 = (b > b1) ? b2 : (255 - b2);
gl_setpixelrgb((x + sx), y, r2, g2, b2);
}
}
}
gl_setpixelrgb(x, y, r, g, b);
return;
}
This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:23 IST