winamp/Src/Plugins/Visualization/vis_nsfs/linedraw.cpp

86 lines
1.5 KiB
C++

#include <windows.h>
static void __inline DrawPixel(int color, unsigned char *fb)
{
int a=*fb;
a+=color;
if (a>255)a=255;
*fb=(unsigned char)a;
}
// based on abrash's wu antialiasing routine
void line(unsigned char *fb, int X0, int Y0, int X1, int Y1, int w, int h)
{
unsigned int ErrorAdj=0, ErrorAcc;
int DeltaX, DeltaY, XDir=1;
if (Y0 > Y1)
{
int t = Y0; Y0 = Y1; Y1 = t;
t = X0; X0 = X1; X1 = t;
}
DeltaY = Y1 - Y0;
DeltaX = X1 - X0;
if (DeltaX < 0)
{
XDir = -1;
DeltaX = -DeltaX;
}
if (DeltaY > DeltaX) {
ErrorAcc = (X0&0xffff);
Y0>>=16;
X0>>=16;
DeltaY += 65535;
DeltaY >>= 16;
if (DeltaY) ErrorAdj = DeltaX/DeltaY;
fb+=Y0*w+X0;
while (DeltaY-- >= 0) {
if (X0 > 0 && Y0 >= 0 && X0 < w-1 && Y0 < h)
{
int Weighting = ErrorAcc >> 10;
DrawPixel(Weighting^63,fb);
DrawPixel(Weighting,fb+XDir);
}
ErrorAcc += ErrorAdj;
if (ErrorAcc >= 65536) {
X0 += XDir;
fb += XDir;
ErrorAcc -= 65536;
}
fb+=w;
Y0++;
}
}
else
{
ErrorAcc = (Y0&0xffff);
X0>>=16;
Y0>>=16;
DeltaX += 65535;
DeltaX >>= 16;
if (DeltaX) ErrorAdj = DeltaY/DeltaX;
fb+=Y0*w+X0;
while (DeltaX-- >= 0) {
if (Y0 >= 0 && Y0 < h-1 && X0 >= 0 && X0 < w)
{
int Weighting = ErrorAcc >> 10;
DrawPixel(Weighting^63,fb);
DrawPixel(Weighting,fb+w);
}
ErrorAcc += ErrorAdj;
if (ErrorAcc >= 65536) {
Y0++;
fb+=w;
ErrorAcc-=65536;
}
fb+=XDir;
X0+=XDir;
}
}
}