about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-05-09 17:40:14 -0700
committerKartik K. Agaram <vc@akkartik.com>2021-05-09 17:40:14 -0700
commit4bfc80ce9aeea7faf6bccdcfac540f8cc49c17fd (patch)
tree9f15e3886c5c6b1524e8c726d6896071f9ee1190
parentcd6412129f91d907e94ddb69c4e3386aa25f0859 (diff)
downloadmu-4bfc80ce9aeea7faf6bccdcfac540f8cc49c17fd.tar.gz
bugfix in mandelbrot-fixed
Thanks to comparing regular ints with fixed-point ints, I was computing
iterations for many screenfuls of pixels to the right of the current one.
(Y-axis behaved similarly, but there it was just doing other work instead
of busy-looping forever. If you don't have anything else to do, it doesn't
matter what you do.)
-rw-r--r--mandelbrot-fixed.mu32
1 files changed, 19 insertions, 13 deletions
diff --git a/mandelbrot-fixed.mu b/mandelbrot-fixed.mu
index ac9bbc28..e51f5ff5 100644
--- a/mandelbrot-fixed.mu
+++ b/mandelbrot-fixed.mu
@@ -112,20 +112,20 @@ fn mandelbrot screen: (addr screen) {
   var a/eax: int <- copy 0
   var b/ecx: int <- copy 0
   a, b <- screen-size screen
-  var width-f/esi: int <- copy a
-  width-f <- shift-left 0xb/log2-font-width-and-fixed-precision  # 3 + 8 = 11
-  var height-f/edi: int <- copy b
-  height-f <- shift-left 0xc/log2-font-height-and-fixed-precision  # 4 + 8 = 12
+  var width/esi: int <- copy a
+  width <- shift-left 3/log2-font-width
+  var height/edi: int <- copy b
+  height <- shift-left 4/log2-font-height
   var y/ecx: int <- copy 0
   {
-    compare y, height-f
+    compare y, height
     break-if->=
-    var imaginary-f/ebx: int <- viewport-to-imaginary-f y, width-f, height-f
+    var imaginary-f/ebx: int <- viewport-to-imaginary-f y, width, height
     var x/eax: int <- copy 0
     {
-      compare x, width-f
+      compare x, width
       break-if->=
-      var real-f/edx: int <- viewport-to-real-f x, width-f
+      var real-f/edx: int <- viewport-to-real-f x, width
       var iterations/esi: int <- mandelbrot-iterations-for-point real-f, imaginary-f, 0x400/max
       compare iterations, 0x400/max
       {
@@ -202,10 +202,12 @@ fn mandelbrot-y x-f: int, y-f: int, imaginary-f: int -> _/ebx: int {
 # ranges from -2 to +2. Viewport height just follows the viewport's aspect
 # ratio.
 
-fn viewport-to-real-f x: int, width-f: int -> _/edx: int {
+fn viewport-to-real-f x: int, width: int -> _/edx: int {
   # (x - width/2)*4/width
   var result-f/eax: int <- int-to-fixed x
-  var half-width-f/ecx: int <- copy width-f
+  var width-f/ecx: int <- copy width
+  width-f <- shift-left 8/fixed-precision
+  var half-width-f/edx: int <- copy width-f
   half-width-f <- shift-right-signed 1/log2
   result-f <- subtract half-width-f
   result-f <- shift-left 2/log4
@@ -213,12 +215,16 @@ fn viewport-to-real-f x: int, width-f: int -> _/edx: int {
   return result-f
 }
 
-fn viewport-to-imaginary-f y: int, width-f: int, height-f: int -> _/ebx: int {
+fn viewport-to-imaginary-f y: int, width: int, height: int -> _/ebx: int {
   # (y - height/2)*4/width
   var result-f/eax: int <- int-to-fixed y
-  shift-right-signed height-f, 1/log2
-  result-f <- subtract height-f
+  var half-height-f/ecx: int <- copy height
+  half-height-f <- shift-left 8/fixed-precision
+  half-height-f <- shift-right-signed 1/log2
+  result-f <- subtract half-height-f
   result-f <- shift-left 2/log4
+  var width-f/ecx: int <- copy width
+  width-f <- shift-left 8/fixed-precision
   result-f <- divide-fixed result-f, width-f
   return result-f
 }