aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Visualization/vis_nsfs/linedraw.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Visualization/vis_nsfs/linedraw.cpp')
-rw-r--r--Src/Plugins/Visualization/vis_nsfs/linedraw.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/Src/Plugins/Visualization/vis_nsfs/linedraw.cpp b/Src/Plugins/Visualization/vis_nsfs/linedraw.cpp
new file mode 100644
index 00000000..a240cf65
--- /dev/null
+++ b/Src/Plugins/Visualization/vis_nsfs/linedraw.cpp
@@ -0,0 +1,86 @@
+#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;
+ }
+ }
+} \ No newline at end of file