Here's some code I knocked up to draw anti-aliased lines. I hope it helps.
It uses 32 bit fixed point arithmatic and only allows 8 levels of
brightness, but its really simple. I've also produced a simple picture
showing lines that are drawn with it as pairs of anti-aliased and 
non-anti-aliased lines.

The original line drawing code was taken from IPAD and hacked to removed
IPAD dependentcies.

Sergio Masci
http://www.demon.co.uk/titan




for a simple test define colour_tbl as

int     colour_tbl[] =
        {
// standard VGA palette grey scale
                30, 29, 28, 27, 26, 25, 24, 23, 22
        };


/*----------------------------------------------------------------------*/
// colour_tbl should contain 9 entries corresponding to the
// brightnesses of the required colour in steps of 1/8 from 0 to 8
//
// colour_tbl[0] = colour * 8/8
// colour_tbl[1] = colour * 7/8
// colour_tbl[2] = colour * 6/8
// ...
// colour_tbl[7] = colour * 1/8
// colour_tbl[8] = colour * 0/8
/*----------------------------------------------------------------------*/
void draw_line(int x1, int y1, int x2, int y2, int colour_tbl[])
{
        int     j, cnt,
                ixstep, iystep;

        long    fx1, fy1,
                xstep, ystep;

        int     p1, p2;


        dx = x2 - x1;
        dy = y2 - y1;
        
        ixstep = sign(dx);
        iystep = sign(dy);

        xstep = ixstep << 16;
        ystep = iystep << 16;

        if (abs(dx) <= abs(dy))
        {
                xstep = (dx << 16) / abs(dy);
        }
        else
        {       ystep = (dy << 16) / abs(dx);
        }

        fx1 = x1 << 16;
        fy1 = y1 << 16;


        // include end point i.e. x2-x1+1 where cnt = x2-x1
        cnt++;

>>>>>>
>>>>>>  replace this section of code
>>>>>>  

        int colour = colour_tbl[0];

        for (j=cnt; j>0; j--)
        {
                x1 = fx1 >> 16;
                y1 = fy1 >> 16;

                set_xpixel_colour(x1, y1, colour);

                fx1 += xstep;
                fy1 += ystep;
        }

>>>>>>
>>>>>>  with this
>>>>>>

        if (abs(dx) <= abs(dy))
        {
                for (j=cnt; j>0; j--)
                {
                        x1 = fx1 >> 16;

                        // fraction of pixel between x and x+1
                        // as n/8 and n1/8

                        p1 = (fx1 >> 13) & 7;

                        p2 = 9 - p1;

                        set_xpixel_colour(x1,   y1, colour_tbl[p1]);
                        set_xpixel_colour(x1+1, y1, colour_tbl[p2]);

                        fx1 += xstep;
                        y1  += iystep;
                }
        }
        else
        {
                for (j=cnt; j>0; j--)
                {
                        y1 = fy1 >> 16;

                        // fraction of pixel between y and y+1
                        // as n/8 and n1/8

                        p1 = (fy1 >> 13) & 7;

                        p2 = 8 - p1;

                        set_xpixel_colour(x1, y1,   colour_tbl[p1]);
                        set_xpixel_colour(x1, y1+1, colour_tbl[p2]);

                        x1  += ixstep;
                        fy1 += ystep;
                }
        }
}

PNG image data, 608 x 431, 8-bit colormap, non-interlaced

Reply via email to