aboutsummaryrefslogtreecommitdiff
path: root/drawing/drawing.ha
diff options
context:
space:
mode:
Diffstat (limited to 'drawing/drawing.ha')
-rw-r--r--drawing/drawing.ha27
1 files changed, 25 insertions, 2 deletions
diff --git a/drawing/drawing.ha b/drawing/drawing.ha
index fc59e1b..54a877b 100644
--- a/drawing/drawing.ha
+++ b/drawing/drawing.ha
@@ -77,15 +77,38 @@ export fn circle(picture: *picture, c: pos, r: i32, color: u32) void = {
};
};
+export fn circle_hollow(picture: *picture, c: pos, r: i32, color: u32) void = {
+ const (cx,cy) = c;
+ const ymin = max(0, cy-r);
+ const ymax = min(picture.h:i32-1, cy+r);
+ const xmin = max(0, cx-r);
+ const xmax = min(picture.w:i32-1, cx+r);
+
+ const r2l = r*r - r;
+ const r2u = r*r + r;
+
+ for (let y = ymin; y<=ymax; y+=1) {
+ const yd = y-cy;
+ for (let x = xmin; x<=xmax; x+=1) {
+ const xd = x-cx;
+ const v = yd*yd + xd*xd;
+ if (r2l <= v && v <= r2u) {
+ pic_set(picture, (x,y), color);
+ };
+ };
+ };
+};
export fn perform(pictures: []picture, op: op) void = {
match (op) {
case op_other => abort("oopsy");
case let o: op_circle =>
- const x = o.0, y=o.1;
+ const x = o.pos.0, y=o.pos.1;
+ const r = o.radius;
+ const c = o.color & 0xffffff;
for (const pic &.. pictures) {
let pos_within_pic =
(x - pic.world_pos.0, y - pic.world_pos.1): pos;
- circle(pic, pos_within_pic, 20, 0xff0088);
+ circle(pic, pos_within_pic, r: i32, c);
};
};
};