diff --git a/platform/bin/platform.uw8 b/platform/bin/platform.uw8 index a96c6f0..b51d958 100644 Binary files a/platform/bin/platform.uw8 and b/platform/bin/platform.uw8 differ diff --git a/platform/src/platform.cwa b/platform/src/platform.cwa index a7eb506..85f0c76 100644 --- a/platform/src/platform.cwa +++ b/platform/src/platform.cwa @@ -136,6 +136,58 @@ export fn circle(cx: f32, cy: f32, radius: f32, col: i32) { } } +export fn circle_outline(cx: f32, cy: f32, radius: f32, col: i32) { + let prev_w: f32; + let y = clamp(nearest(cy - radius) as i32, -1, 241); + let maxY = clamp(nearest(cy + radius) as i32, -1, 241); + + loop lines { + let lazy dy = y as f32 - cy + 0.5; + let inline q = radius * radius - dy * dy; + let w = sqrt(max(0 as f32, q)); + + let xlp = nearest(cx - prev_w) as i32; + let xl = nearest(cx - w) as i32; + let xrp = nearest(cx + prev_w) as i32; + let xr = nearest(cx + w) as i32; + if w >= prev_w { + if xl < xlp { + hline(xl, xlp, y, col); + } else { + if xl < xr { + setPixel(xl, y, col); + } + } + if xr > xrp { + hline(xrp, xr, y, col); + } else { + if xl < xr { + setPixel(xr - 1, y, col); + } + } + } else { + if xl > xlp { + hline(xlp, xl, y - 1, col); + } else { + if xlp < xrp { + setPixel(xlp, y - 1, col); + } + } + if xr < xrp { + hline(xr, xrp, y - 1, col); + } else { + if xlp < xrp { + setPixel(xrp - 1, y - 1, col); + } + } + } + + y = y + 1; + prev_w = w; + branch_if y <= maxY: lines; + } +} + export fn line(x1: f32, y1: f32, x2: f32, y2: f32, col: i32) { let swapTmp: f32; if x1 > x2 {