I thought I had a version that accounted for alpha values but couldn't find it. So I updated my snippet that Neuro posted. I'll need to include this into my graphics library, which currently has rounded boxes and circles which also utilize the same AA effect.
REM *************************************
REM * Title: Anti-aliased lines (alpha) *
REM * Author: Phaelax *
REM * Date: May 29, 2011 *
REM *************************************
for i = 1 to 100
x = rnd(640)
y = rnd(480)
ink rgb(rnd(255),rnd(255),rnd(255)), 0
box x, y, x+rnd(200)+50, y+rnd(200)+50
next i
get image 1, 0, 0, 639, 479
hide mouse
sync on
DO
cls
paste image 1, 0, 0
mx = mousex()
my = mousey()
wuline(0, 0,mx,my, rgb(255,255,255))
sync
loop
REM Xiaolin Wu's line algorithm
function wuline(x1, y1, x2, y2, color as dword)
local dx as float
local dy as float
local xend as float
local yend as float
local xgap as float
local ygap as float
local xpxl1 as float
local ypxl1 as float
local xpxl2 as float
local ypxl2 as float
local intery as float
local interx as float
red = rgbr(color)
green = rgbg(color)
blue = rgbb(color)
dx = x2-x1
dy = y2-y1
if abs(dx) > abs(dy)
rem handle horizontal lines
if x2 < x1
ax = x1
x1 = x2
x2 = ax
ay = y1
y1 = y2
y2 = ay
endif
gradient# = dy / dx
rem handle first endpoint
xend = ceil(x1)
yend = y1 + gradient# * (xend-x1)
xgap = 1.0 - fract#(x1 + 0.5)
xpxl1 = xend : `used in main loop
ypxl1 = int(yend)
f# = 1-fract#(yend)*xgap : `brightness
alpha = 255*f#
c = E2DC_ARGB(alpha, red, green, blue)
box xpxl1, ypxl1, xpxl1+1, ypxl1+1, c, c, c, c
rem brightness: fract#(yend)*xgap
f# = fract#(yend)*xgap : `brightness
alpha = 255*f#
c = E2DC_ARGB(alpha, red, green, blue)
box xpxl1, ypxl1+1, xpxl1+1, ypxl1+2, c, c, c, c
intery = yend + gradient# : `first y-intersection for main loop
rem handle second endpoint
xend = ceil(x2)
yend = y2 + gradient# * (xend-x2)
xgap = 1.0 - fract#(x2 + 0.5)
xpxl2 = xend : `used in main loop
ypxl2 = int(yend)
f# = 1-fract#(yend)*xgap : `brightness
alpha = 255*f#
c = E2DC_ARGB(alpha, red, green, blue)
box xpxl2, ypxl2, xpxl2+1, ypxl2+1, c, c, c, c
f# = fract#(yend)*xgap : `brightness
alpha = 255*f#
c = E2DC_ARGB(alpha, red, green, blue)
box xpxl2, ypxl2+1, xpxl2+1, ypxl2+2, c, c, c, c
rem main loop
a = xpxl1+1
b = xpxl2-1
for x = a to b
f# = 1-fract#(intery) : `brightness
alpha = 255*f#
c = E2DC_ARGB(alpha, red, green, blue)
box x, intery, x+1, intery+1, c, c, c, c
f# = fract#(intery) : `brightness
alpha = 255*f#
c = E2DC_ARGB(alpha, red, green, blue)
box x, intery+1, x+1, intery+2, c, c, c, c
intery = intery + gradient#
next x
else
rem handle vertical lines
if y2 < y1
ax = x1
x1 = x2
x2 = ax
ay = y1
y1 = y2
y2 = ay
endif
gradient# = dx / dy
rem handle first endpoint
yend = ceil(y1)
xend = x1 + gradient# * (yend-y1)
ygap = 1.0 - fract#(y1 + 0.5)
xpxl1 = int(xend)
ypxl1 = yend
f# = 1-fract#(xend)*ygap : `brightness
alpha = 255*f#
c = E2DC_ARGB(alpha, red, green, blue)
box xpxl1, ypxl1, xpxl1+1, ypxl1+1, c, c, c, c
intery = intery + gradient#
f# = fract#(xend)*ygap : `brightness
alpha = 255*f#
c = E2DC_ARGB(alpha, red, green, blue)
box xpxl1, ypxl1+1, xpxl1+1, ypxl1+2, c, c, c, c
interx = xend + gradient# : `first y-intersection for main loop
rem handle second endpoint
yend = ceil(y2)
xend = x2 + gradient# * (yend-y2)
ygap = fract#(y2 + 0.5)
xpxl2 = int(xend)
ypxl2 = yend
f# = 1-fract#(xend)*ygap : `brightness
alpha = 255*f#
c = E2DC_ARGB(alpha, red, green, blue)
box xpxl2, ypxl2, xpxl2+1, ypxl2+1, c, c, c, c
f# = fract#(xend)*ygap : `brightness
alpha = 255*f#
c = E2DC_ARGB(alpha, red, green, blue)
box xpxl2, ypxl2+1, xpxl2+1, ypxl2+2, c, c, c, c
rem main loop
a = ypxl1+1
b = ypxl2-1
for y = a to b
f# = 1-fract#(interx) : `brightness
alpha = 255*f#
c = E2DC_ARGB(alpha, red, green, blue)
box interx, y, interx+1, y+1, c, c, c, c
f# = fract#(interx) : `brightness
alpha = 255*f#
c = E2DC_ARGB(alpha, red, green, blue)
box interx+1, y, interx+2, y+1, c, c, c, c
interx = interx + gradient#
next y
endif
endfunction
REM **************************************************
REM Returns a color with an alpha value
REM **************************************************
function E2DC_ARGB(a,r,g,b)
local c as dword
c = (a*16777216)+(r*65536)+(g*256)+b
endfunction c
REM **************************************************
REM Just a little helper function
REM **************************************************
function fract#(x as float)
a# = x - int(x)
endfunction a#
