about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-07-11 15:13:55 -0700
committerKartik K. Agaram <vc@akkartik.com>2021-07-11 15:31:15 -0700
commitc76ac49f8f7ce65a778b2f1ab414fd3a8be19cb9 (patch)
tree7a8a02d116e24e69364cb72160439eff5cf6e921
parente8b85847967c1a1a38fc72e2eb92c917b35db1f1 (diff)
downloadmu-c76ac49f8f7ce65a778b2f1ab414fd3a8be19cb9.tar.gz
forget HSL conversion for now, stick to RGB
It looks like seeking the nearest neighbor in HSL space leads to more
saturated colors.
-rw-r--r--505colors.mu46
-rw-r--r--img.mu17
2 files changed, 50 insertions, 13 deletions
diff --git a/505colors.mu b/505colors.mu
index d4c297b3..b45b33e0 100644
--- a/505colors.mu
+++ b/505colors.mu
@@ -1,3 +1,49 @@
+fn nearest-color-euclidean r: int, g: int, b: int -> _/eax: int {
+  var result/edi: int <- copy 0x100/invalid
+  var max-distance/esi: int <- copy 0x30000/max  # 3 * 0x100*0x100
+  var r2/ecx: int <- copy 0
+  var g2/edx: int <- copy 0
+  var b2/ebx: int <- copy 0
+  var color/eax: int <- copy 0
+  {
+    compare color, 0x100
+    break-if->=
+    $nearest-color-euclidean:body: {
+      r2, g2, b2 <- color-rgb color
+      {
+        var curr-distance/eax: int <- euclidean-distance-squared r, g, b, r2, g2, b2
+        compare curr-distance, max-distance
+        break-if->= $nearest-color-euclidean:body
+        max-distance <- copy curr-distance
+      }
+      result <- copy color
+    }
+    color <- increment
+    loop
+  }
+  return result
+}
+
+fn euclidean-distance-squared r1: int, g1: int, b1: int, r2: int, g2: int, b2: int -> _/eax: int {
+  var result/edi: int <- copy 0
+  # red
+  var tmp/eax: int <- copy r1
+  tmp <- subtract r2
+  tmp <- multiply tmp
+  result <- add tmp
+  # green
+  tmp <- copy g1
+  tmp <- subtract g2
+  tmp <- multiply tmp
+  result <- add tmp
+  # blue
+  tmp <- copy b1
+  tmp <- subtract b2
+  tmp <- multiply tmp
+  result <- add tmp
+  return result
+}
+
 # Hue/saturation/luminance for an rgb triple.
 # rgb are in [0, 256)
 # hsl are also returned in [0, 256)
diff --git a/img.mu b/img.mu
index cca03989..2016f571 100644
--- a/img.mu
+++ b/img.mu
@@ -27,7 +27,7 @@ fn main screen: (addr screen), keyboard: (addr keyboard), data-disk: (addr disk)
   var img-storage: image
   var img/esi: (addr image) <- address img-storage
   load-image img, data-disk
-  render-image screen, img, 0/x, 0/y, 0x400/width, 0x400/height
+  render-image screen, img, 0/x, 0/y, 0x100/width, 0x100/height
 #?   render-image screen, img, 0x20/x, 0x180/y, 0x12c/width=300, 0xc8/height=200
 #?   render-pgm-image screen, img, 0x220/x, 0x180/y, 0x12c/width=300, 0xc8/height=200
 #?   render-image screen, img, 0x320/x, 0x280/y, 0x60/width=96, 0x1c/height=28
@@ -833,22 +833,13 @@ fn render-ppm-image screen: (addr screen), _img: (addr image), xmin: int, ymin:
         copy-to b, src
       }
       idx <- increment
-      # color-int = nearest-hsl(r, g, b)
-      var color-int: int
-      {
-        var h/ecx: int <- copy 0
-        var s/edx: int <- copy 0
-        var l/ebx: int <- copy 0
-        h, s, l <- hsl r, g, b
-        var tmp/eax: int <- nearest-color-euclidean-hsl h, s, l
-        copy-to color-int, tmp
-      }
-      #
+      # plot nearest color
+      var color/eax: int <- nearest-color-euclidean r, g, b
       var screenx/ecx: int <- convert x
       screenx <- add xmin
       var screeny/edx: int <- convert y
       screeny <- add ymin
-      pixel screen, screenx, screeny, color-int
+      pixel screen, screenx, screeny, color
       x <- add one-f
       loop
     }
m> 2009-12-13 19:42:51 +0100 updated / added tests' href='/akspecs/ranger/commit/test/tc_displayable.py?h=v1.9.1&id=1159f9ec182496ddc5324f23fb1d5eae73fe63e3'>1159f9ec ^
dd4a4145 ^
1159f9ec ^
dd4a4145 ^





1159f9ec ^
dd4a4145 ^


1159f9ec ^
dd4a4145 ^


1159f9ec ^
1159f9ec ^


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159