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
let outside_rgb = 0x808080
let frame_rgb = 0xff0000
let outline (fb : Framebuffer.t) ~x0 ~y0 ~x1 ~y1 ~rgb =
Framebuffer.fill_span fb ~y:y0 ~x0 ~x1:(x1 + 1) ~rgb ~alpha:1.;
Framebuffer.fill_span fb ~y:y1 ~x0 ~x1:(x1 + 1) ~rgb ~alpha:1.;
for y = y0 to y1 do
Framebuffer.fill_span fb ~y ~x0 ~x1:(x0 + 1) ~rgb ~alpha:1.;
Framebuffer.fill_span fb ~y ~x0:x1 ~x1:(x1 + 1) ~rgb ~alpha:1.
done
let draw ?(size = 32) ?(zoom = 8) (fb : Framebuffer.t) ~cx ~cy =
let ax = cx - (size / 2) and ay = cy - (size / 2) in
let area =
Array.init size (fun j ->
Array.init size (fun i ->
let x = ax + i and y = ay + j in
if x >= 0 && x < fb.width && y >= 0 && y < fb.height then Framebuffer.get_rgb fb ~x ~y
else outside_rgb))
in
let inset = size * zoom and margin = 10 in
let ix = fb.width - inset - margin and iy = margin in
for j = 0 to size - 1 do
for i = 0 to size - 1 do
for dy = 0 to zoom - 1 do
Framebuffer.fill_span fb ~y:(iy + (j * zoom) + dy) ~x0:(ix + (i * zoom))
~x1:(ix + ((i + 1) * zoom)) ~rgb:area.(j).(i) ~alpha:1.
done
done
done;
for k = 1 to size - 1 do
Framebuffer.fill_span fb ~y:(iy + (k * zoom)) ~x0:ix ~x1:(ix + inset) ~rgb:0 ~alpha:0.2;
for y = iy to iy + inset - 1 do
Framebuffer.fill_span fb ~y ~x0:(ix + (k * zoom)) ~x1:(ix + (k * zoom) + 1) ~rgb:0 ~alpha:0.2
done
done;
outline fb ~x0:(ix - 1) ~y0:(iy - 1) ~x1:(ix + inset) ~y1:(iy + inset) ~rgb:frame_rgb;
outline fb ~x0:(ax - 1) ~y0:(ay - 1) ~x1:(ax + size) ~y1:(ay + size) ~rgb:frame_rgb;
let px = ix + ((cx - ax) * zoom) and py = iy + ((cy - ay) * zoom) in
outline fb ~x0:px ~y0:py ~x1:(px + zoom) ~y1:(py + zoom) ~rgb:frame_rgb