Help with antialiasing

Search this archive.

From: Jay Link (jlink@interlink-bbs.com)
Date: Thu 27 Jan 2000 - 17:36:05 IST


Hi! Can someone please give me some advice on the following program? I'm
trying to draw some antialiased lines, and if you'll run the program,
you'll see that they all work, EXCEPT for the one that runs from the upper
left to the lower right. Can anyone shed any light on what I'm doing
wrong?

Thanks!

-J

========================================================================

#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)
{
   vga_init();
   vga_setmode(G320x200x256);
   gl_setcontextvga(G320x200x256);
   gl_setrgbpalette();

   wu_line(300, 10, 70, 180, 255, 255, 255);
   wu_line(0, 10, 300, 185, 255, 255, 255);
   wu_line(100, 10, 70, 180, 255, 255, 255);
   wu_line(100, 10, 130, 180, 255, 255, 255);
   wu_line(0, 100, 300, 120, 255, 255, 255);
   vga_getch();

   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 temp;
    int dx, dy, ax, ay, sx, sy, x, y;
    int ox, oy, nx, ny;
    int r1, g1, b1, r2, g2, b2;
    int highr, lowr, highg, lowg, highb, lowb;
    int percent;

    if (x1 > x2)
    {
       temp = x1;
       x1 = x2;
       x2 = temp;
       temp = y1;
       y1 = y2;
       y2 = temp;
    }

    dx = x2 - x1;
    dy = y2 - y1;
    ax = ABS(dx) << 1;
    ay = ABS(dy) << 1;
    sx = (dx >= 0) ? 1 : -1;
    sy = (dy >= 0) ? 1 : -1;

    x = x1;
    y = y1;

    if (ax > ay)
    {
	int d = ay - (ax >> 1);
        oy = y;
	while (x != x2)
        {
	    gl_setpixelrgb(x, y, r, g, b);

	    if (d > 0 || (d == 0 && sx == 1))
            {
		y += sy;
                oy = y - 1;
		d -= ax;
            }
	    x += sx;
	    d += ay;
            ny = y + 1;
            percent = ((ABS(d) * 100) / ax);

            gl_getpixelrgb(x, oy, &r1, &g1, &b1);
            highr = (r > r1) ? r : r1;
            lowr = (r == highr) ? r1 : r;
            r2 = (((highr - lowr) * percent) / 100) + lowr;
            highg = (g > g1) ? g : g1;
            lowg = (g == highg) ? g1 : g;
            g2 = (((highg - lowg) * percent) / 100) + lowg;
            highb = (b > b1) ? b : b1;
            lowb = (b == highb) ? b1 : b;
            b2 = (((highb - lowb) * percent) / 100) + lowb;
            gl_setpixelrgb(x, oy, r2, g2, b2);            

            gl_getpixelrgb(x, ny, &r1, &g1, &b1);
            highr = (r > r1) ? r : r1;
            lowr = (r == highr) ? r1 : r;
            r2 = 255 - ((((highr - lowr) * percent) / 100) + lowr);
            highg = (g > g1) ? g : g1;
            lowg = (g == highg) ? g1 : g;
            g2 = 255 - ((((highg - lowg) * percent) / 100) + lowg);
            highb = (b > b1) ? b : b1;
            lowb = (b == highb) ? b1 : b;
            b2 = 255 - ((((highb - lowb) * percent) / 100) + lowb);
            gl_setpixelrgb(x, ny, r2, g2, b2);
	}
    } else {
	int d = ax - (ay >> 1);
        ox = x;
	while (y != y2)
        {
	    gl_setpixelrgb(x, y, r, g, b);

	    if (d > 0 || (d == 0 && sy == 1))
            {
		x += sx;
                ox = x - 1;
		d -= ay;
            }
	    y += sy;
	    d += ax;
            nx = x + 1;
            percent = ((ABS(d) * 100) / ay);

            gl_getpixelrgb(ox, y, &r1, &g1, &b1);
            highr = (r > r1) ? r : r1;
            lowr = (r == highr) ? r1 : r;
            r2 = (((highr - lowr) * percent) / 100) + lowr;
            highg = (g > g1) ? g : g1;
            lowg = (g == highg) ? g1 : g;
            g2 = (((highg - lowg) * percent) / 100) + lowg;
            highb = (b > b1) ? b : b1;
            lowb = (b == highb) ? b1 : b;
            b2 = (((highb - lowb) * percent) / 100) + lowb;
            gl_setpixelrgb(ox, y, r2, g2, b2);

            gl_getpixelrgb(nx, y, &r1, &g1, &b1);
            highr = (r > r1) ? r : r1;
            lowr = (r == highr) ? r1 : r;
            r2 = 255 - ((((highr - lowr) * percent) / 100) + lowr);
            highg = (g > g1) ? g : g1;
            lowg = (g == highg) ? g1 : g;
            g2 = 255 - ((((highg - lowg) * percent) / 100) + lowg);
            highb = (b > b1) ? b : b1;
            lowb = (b == highb) ? b1 : b;
            b2 = 255 - ((((highb - lowb) * percent) / 100) + lowb);
            gl_setpixelrgb(nx, 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