From: Sergio Masci (sergio@titan.demon.co.uk)
Date: Tue 01 Feb 2000 - 21:28:37 IST
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; } } }
This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:23 IST