package main
clamp :: proc(a, min, max: int) -> int {
t := (a < min ? min : a)
return t > max ? max : t
}
draw_line :: proc(bitmap: ^Bitmap, x1, y1, x2, y2: int, color: u32) {
xx1 := clamp(x1, 0, bitmap.width - 1)
yy1 := clamp(y1, 0, bitmap.height - 1)
xx2 := clamp(x2, 0, bitmap.width - 1)
yy2 := clamp(y2, 0, bitmap.height - 1)
sx := (xx1 < xx2 ? 1 : -1)
sy := (yy1 < yy2 ? 1 : -1)
dx := abs(xx2 - xx1)
dy := -abs(yy2 - yy1)
x := xx1
y := yy1
e := dx + dy
buffer := transmute([]u32)(bitmap.buffer)
for {
i := (y * bitmap.width) + x
buffer[i] = color
if x == xx2 && y == yy2 {
break
}
e2 := e * 2
if e2 >= dy {
e += dy
x += sx
}
if e2 <= dx {
e += dx
y += sy
}
}
}
draw_rect :: proc(bitmap: ^Bitmap, x1, y1, x2, y2: int, color: u32) {
xx1 := clamp(x1, 0, bitmap.width - 1)
yy1 := clamp(y1, 0, bitmap.height - 1)
xx2 := clamp(x2, 0, bitmap.width - 1)
yy2 := clamp(y2, 0, bitmap.height - 1)
buffer := transmute([]u32)(bitmap.buffer)
for y in yy1 ..= yy2 {
i := y * bitmap.width
buffer[i + xx1] = color
buffer[i + xx2] = color
}
iy1 := yy1 * bitmap.width
iy2 := yy2 * bitmap.width
for x in xx1 ..= xx2 {
buffer[iy1 + x] = color
buffer[iy2 + x] = color
}
}
draw_rect_filled :: proc(bitmap: ^Bitmap, x1, y1, x2, y2: int, stroke_color, fill_color: u32) {
xx1 := clamp(x1, 0, bitmap.width - 1)
yy1 := clamp(y1, 0, bitmap.height - 1)
xx2 := clamp(x2, 0, bitmap.width - 1)
yy2 := clamp(y2, 0, bitmap.height - 1)
buffer := transmute([]u32)(bitmap.buffer)
for y in yy1 ..= yy2 {
i := y * bitmap.width
buffer[i + xx1] = stroke_color
draw_line(bitmap, xx1 + 1, y, xx2 - 1, y, fill_color)
buffer[i + xx2] = stroke_color
}
iy1 := yy1 * bitmap.width
iy2 := yy2 * bitmap.width
for x in xx1 ..= xx2 {
buffer[iy1 + x] = stroke_color
buffer[iy2 + x] = stroke_color
}
}