about summary refs log tree commit diff stats
path: root/507line.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-05-15 19:49:52 -0700
committerKartik K. Agaram <vc@akkartik.com>2021-05-15 19:49:52 -0700
commit74151efc043c984ae328be599417570a8b75ff0f (patch)
treecef52e95620cfc4311f6b125b3558f25eeb42156 /507line.mu
parentc4475d83b747475663ad089b63169df88842be51 (diff)
downloadmu-74151efc043c984ae328be599417570a8b75ff0f.tar.gz
reimplement Bresenham line in Mu
Diffstat (limited to '507line.mu')
-rw-r--r--507line.mu62
1 files changed, 62 insertions, 0 deletions
diff --git a/507line.mu b/507line.mu
new file mode 100644
index 00000000..7afdf9cc
--- /dev/null
+++ b/507line.mu
@@ -0,0 +1,62 @@
+fn draw-line screen: (addr screen), x0: int, y0: int, x1: int, y1: int, color: int {
+  var dx: int
+  var dy: int
+  var sx: int
+  var sy: int
+  var err: int
+  # dx = abs(x1-x0)
+  var tmp2/ecx: int <- copy x1
+  tmp2 <- subtract x0
+  var tmp/eax: int <- abs tmp2
+  copy-to dx, tmp
+  # sx = sgn(x1-x0)
+  tmp <- sgn tmp2
+  copy-to sx, tmp
+  # dy = -abs(y1-y0)
+  tmp2 <- copy y1
+  tmp2 <- subtract y0
+  tmp <- abs tmp2
+  tmp <- negate
+  copy-to dy, tmp
+  # sy = sgn(y1-y0)
+  tmp <- sgn tmp2
+  copy-to sy, tmp
+  # err = dx + dy
+  tmp <- copy dy
+  tmp <- add dx
+  copy-to err, tmp
+  #
+  var x/ecx: int <- copy x0
+  var y/edx: int <- copy y0
+  $draw-line:loop: {
+    pixel screen, x, y, color
+    # if (x == x1 && y == y1) break
+    {
+      compare x, x1
+      break-if-!=
+      compare y, y1
+      break-if-!=
+      break $draw-line:loop
+    }
+    # e2 = err*2
+    var e2/ebx: int <- copy err
+    e2 <- shift-left 1
+    # if (e2 >= dy) { err += dy; x += sx; }
+    {
+      compare e2, dy
+      break-if-<
+      tmp <- copy dy
+      add-to err, tmp
+      x <- add sx
+    }
+    # if (e2 <= dx) { err += dx; y += sy; }
+    {
+      compare e2, dx
+      break-if->
+      tmp <- copy dx
+      add-to err, tmp
+      y <- add sy
+    }
+    loop
+  }
+}