From a18808fae657bd005f7bd76e54cdf56a0ddf74cd Mon Sep 17 00:00:00 2001
From: Erik Hofman <erik@ehofman.com>
Date: Tue, 28 Feb 2023 13:31:23 +0100
Subject: [PATCH] Add a Canvas test pattern dialog

---
 Aircraft/ufo/{ => Nasal}/cam.nas           |   0
 Aircraft/ufo/Nasal/canvas_test_pattern.nas | 188 +++++++++++++++++++++
 Aircraft/ufo/{ => Nasal}/ufo.nas           |   0
 Aircraft/ufo/mibs-set.xml                  |   2 +-
 Aircraft/ufo/ufo-set.xml                   |  22 ++-
 5 files changed, 210 insertions(+), 2 deletions(-)
 rename Aircraft/ufo/{ => Nasal}/cam.nas (100%)
 create mode 100644 Aircraft/ufo/Nasal/canvas_test_pattern.nas
 rename Aircraft/ufo/{ => Nasal}/ufo.nas (100%)

diff --git a/Aircraft/ufo/cam.nas b/Aircraft/ufo/Nasal/cam.nas
similarity index 100%
rename from Aircraft/ufo/cam.nas
rename to Aircraft/ufo/Nasal/cam.nas
diff --git a/Aircraft/ufo/Nasal/canvas_test_pattern.nas b/Aircraft/ufo/Nasal/canvas_test_pattern.nas
new file mode 100644
index 000000000..58055b2c5
--- /dev/null
+++ b/Aircraft/ufo/Nasal/canvas_test_pattern.nas
@@ -0,0 +1,188 @@
+var testDialog = {
+  
+  shape : func(cDefaultGroup) {
+    cDefaultGroup.createChild("path")
+                 .setColorFill(0,0,0)
+                 .setColor(0,0,0);
+  },
+  create_tbl : func(needle_tbl) {
+    # hash table for needle positions
+    for (var i=1; i<21; i = i+1) {
+        var r0 = 150; var r1 = 350;
+        var a0 = (i*4.5 - 1.5) * 0.0174533;
+        var a1 = (i*4.5 + 1.5) * 0.0174533;
+
+        var r3 = r1+8;
+        var a3 = (a0 + a1)/2;
+
+        var x1 = -r0 * math.cos(a0);
+        var y1 = r0 * math.sin(a0);
+
+        var x2 = -r1 * math.cos(a0);
+        var y2 = r1 * math.sin(a0);
+
+        var x3 = -r3 * math.cos(a3);
+        var y3 = r3 * math.sin(a3);
+
+        var x4 = -r1 * math.cos(a1);
+        var y4 = r1 * math.sin(a1);
+
+        var x5 = -r0 * math.cos(a1);
+        var y5 = r0 * math.sin(a1);
+
+        append(needle_tbl, [x1, y1, x2, y2, x3, y3, x4, y4, x5, y5]);
+    }
+  },
+
+  draw_vario: func(needles,needle_tbl,cx,cy) {
+    var min = 0;
+    var max = 20;
+
+    needles.reset();
+    for (var i=min; i<max; i = i+1) {
+      var x = cx - needle_tbl[i][0];
+      var y = cy + needle_tbl[i][1];
+      needles.moveTo(x, y);
+
+      var x = cx - needle_tbl[i][2];
+      var y = cy + needle_tbl[i][3];
+      needles.lineTo(x, y);
+
+      var x = cx - needle_tbl[i][4];
+      var y = cy + needle_tbl[i][5];
+      needles.lineTo(x, y);
+
+      var x = cx - needle_tbl[i][6];
+      var y = cy + needle_tbl[i][7];
+      needles.lineTo(x, y);
+
+      var x = cx - needle_tbl[i][8];
+      var y = cy + needle_tbl[i][9];
+      needles.lineTo(x, y);
+      needles.close();
+    }
+
+    for (var i=min; i<max; i = i+1) {
+      var x = cx + needle_tbl[i][0];
+      var y = cy + needle_tbl[i][1];
+      needles.moveTo(x, y);
+
+      var x = cx + needle_tbl[i][2];
+      var y = cy + needle_tbl[i][3];
+      needles.lineTo(x, y);
+
+      var x = cx + needle_tbl[i][4];
+      var y = cy + needle_tbl[i][5];
+      needles.lineTo(x, y);
+
+      var x = cx + needle_tbl[i][6];
+      var y = cy + needle_tbl[i][7];
+      needles.lineTo(x, y);
+
+      var x = cx + needle_tbl[i][8];
+      var y = cy + needle_tbl[i][9];
+      needles.lineTo(x, y);
+      needles.close();
+    }
+
+    for (var i=min; i<max; i = i+1) {
+      var x = cx - needle_tbl[i][0];
+      var y = cy - needle_tbl[i][1];
+      needles.moveTo(x, y);
+
+      var x = cx - needle_tbl[i][2];
+      var y = cy - needle_tbl[i][3];
+      needles.lineTo(x, y);
+
+      var x = cx - needle_tbl[i][4];
+      var y = cy - needle_tbl[i][5];
+      needles.lineTo(x, y);
+
+      var x = cx - needle_tbl[i][6];
+      var y = cy - needle_tbl[i][7];
+      needles.lineTo(x, y);
+
+      var x = cx - needle_tbl[i][8];
+      var y = cy - needle_tbl[i][9];
+      needles.lineTo(x, y);
+      needles.close();
+    }
+
+    max = 4;
+    for (var i=min; i<max; i = i+1) {
+      var x = cx + needle_tbl[i][0];
+      var y = cy - needle_tbl[i][1];
+      needles.moveTo(x, y);
+
+      var x = cx + needle_tbl[i][2];
+      var y = cy - needle_tbl[i][3];
+      needles.lineTo(x, y);
+
+      var x = cx + needle_tbl[i][4];
+      var y = cy - needle_tbl[i][5];
+      needles.lineTo(x, y);
+
+      var x = cx + needle_tbl[i][6];
+      var y = cy - needle_tbl[i][7];
+      needles.lineTo(x, y);
+
+      var x = cx + needle_tbl[i][8];
+      var y = cy - needle_tbl[i][9];
+      needles.lineTo(x, y);
+      needles.close();
+    }
+  },
+  new: func(width=400,height=500)
+  {
+    var m = {
+      parents: [testDialog],
+      _dlg: canvas.Window.new([width, height], "dialog")
+                         .set("title", "test-pattern"),
+    };
+
+    var cDisplay = canvas.new({
+      "name": "test-pattern",
+      "size": [1024, 1024],
+      "view": [800, 1000],
+      "mipmapping": 1
+    });
+    cDisplay.addPlacement({"node": "iq_display"});
+    cDisplay.set("background", canvas.style.getColor("bg_color"));
+
+    m._dlg.setCanvas(cDisplay);
+
+    var cDefaultGroup = cDisplay.createGroup();
+
+    var arrow = testDialog.shape(cDefaultGroup);
+    arrow.moveTo(0,0);
+    arrow.lineTo(400,550);
+    arrow.lineTo(400,500);
+    arrow.lineTo(450,500);
+    arrow.close();
+
+    var sqbl = testDialog.shape(cDefaultGroup);
+    sqbl.moveTo(0,1000);
+    sqbl.lineTo(20,900);
+    sqbl.lineTo(100,980);
+    sqbl.close();
+
+    var sqbr = testDialog.shape(cDefaultGroup);
+    sqbr.moveTo(800,1000);
+    sqbr.lineTo(780,900);
+    sqbr.lineTo(700,980);
+    sqbr.close();
+
+    var sqtr = testDialog.shape(cDefaultGroup);
+    sqtr.moveTo(800,0);
+    sqtr.lineTo(780,100);
+    sqtr.lineTo(700,20);
+    sqtr.close();
+
+    var needle_tbl = [[0,0,0,0,0,0,0,0,0,0]];
+    testDialog.create_tbl(needle_tbl);
+    var needles = testDialog.shape(cDefaultGroup);
+    testDialog.draw_vario(needles,needle_tbl,400,500);
+ 
+    return m;
+  },
+};
diff --git a/Aircraft/ufo/ufo.nas b/Aircraft/ufo/Nasal/ufo.nas
similarity index 100%
rename from Aircraft/ufo/ufo.nas
rename to Aircraft/ufo/Nasal/ufo.nas
diff --git a/Aircraft/ufo/mibs-set.xml b/Aircraft/ufo/mibs-set.xml
index cfd16baeb..64abe1953 100644
--- a/Aircraft/ufo/mibs-set.xml
+++ b/Aircraft/ufo/mibs-set.xml
@@ -82,7 +82,7 @@
 
     <nasal>
         <cam>
-            <file>Aircraft/ufo/cam.nas</file>
+            <file>Aircraft/ufo/Nasal/cam.nas</file>
         </cam>
     </nasal>
 
diff --git a/Aircraft/ufo/ufo-set.xml b/Aircraft/ufo/ufo-set.xml
index ee38c86ba..129a8da66 100644
--- a/Aircraft/ufo/ufo-set.xml
+++ b/Aircraft/ufo/ufo-set.xml
@@ -127,6 +127,23 @@
 			</config>
 		</view>
 
+		<menubar>
+			<default>
+				<menu n="100">
+				<label>UFO</label>
+					<item>
+						<label>Show Test Pattern</label>
+						<binding>
+							<command>nasal</command>
+							<script>
+							canvas_test_pattern.testDialog.new();
+							</script>
+						</binding>
+					</item>
+				</menu>
+			</default>
+		</menubar>
+
 		<help>
 			<title>UFO</title>
 			<key>
@@ -627,12 +644,15 @@
 
 	<nasal>
 		<ufo>
-			<file>Aircraft/ufo/ufo.nas</file>
+			<file>Aircraft/ufo/Nasal/ufo.nas</file>
 		</ufo>
 
 		<aar>
 			<file>Aircraft/Generic/aar.nas</file>
 		</aar>
+		<canvas_test_pattern>
+			<file>Aircraft/ufo/Nasal/canvas_test_pattern.nas</file>
+		</canvas_test_pattern>
 	</nasal>
 
 	<systems>