You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
2.5 KiB
117 lines
2.5 KiB
fn draw-line screen: (addr screen), x0: int, y0: int, x1: int, y1: int, color: int { |
|
var dx: int |
|
var dy: int |
|
var sx: int |
|
var sy: int |
|
var err: int |
|
# dx = abs(x1-x0) |
|
var tmp2/ecx: int <- copy x1 |
|
tmp2 <- subtract x0 |
|
var tmp/eax: int <- abs tmp2 |
|
copy-to dx, tmp |
|
# sx = sgn(x1-x0) |
|
tmp <- sgn tmp2 |
|
copy-to sx, tmp |
|
# dy = -abs(y1-y0) |
|
tmp2 <- copy y1 |
|
tmp2 <- subtract y0 |
|
tmp <- abs tmp2 |
|
tmp <- negate |
|
copy-to dy, tmp |
|
# sy = sgn(y1-y0) |
|
tmp <- sgn tmp2 |
|
copy-to sy, tmp |
|
# err = dx + dy |
|
tmp <- copy dy |
|
tmp <- add dx |
|
copy-to err, tmp |
|
# |
|
var x/ecx: int <- copy x0 |
|
var y/edx: int <- copy y0 |
|
$draw-line:loop: { |
|
pixel screen, x, y, color |
|
# if (x == x1 && y == y1) break |
|
{ |
|
compare x, x1 |
|
break-if-!= |
|
compare y, y1 |
|
break-if-!= |
|
break $draw-line:loop |
|
} |
|
# e2 = err*2 |
|
var e2/ebx: int <- copy err |
|
e2 <- shift-left 1 |
|
# if (e2 >= dy) { err += dy; x += sx; } |
|
{ |
|
compare e2, dy |
|
break-if-< |
|
tmp <- copy dy |
|
add-to err, tmp |
|
x <- add sx |
|
} |
|
# if (e2 <= dx) { err += dx; y += sy; } |
|
{ |
|
compare e2, dx |
|
break-if-> |
|
tmp <- copy dx |
|
add-to err, tmp |
|
y <- add sy |
|
} |
|
loop |
|
} |
|
} |
|
|
|
fn draw-horizontal-line screen: (addr screen), y: int, x0: int, x1: int, color: int { |
|
var x/eax: int <- copy x0 |
|
{ |
|
compare x, x1 |
|
break-if->= |
|
pixel screen, x, y, color |
|
x <- increment |
|
loop |
|
} |
|
} |
|
|
|
fn draw-vertical-line screen: (addr screen), x: int, y0: int, y1: int, color: int { |
|
var y/eax: int <- copy y0 |
|
{ |
|
compare y, y1 |
|
break-if->= |
|
pixel screen, x, y, color |
|
y <- increment |
|
loop |
|
} |
|
} |
|
|
|
fn draw-rect screen: (addr screen), xmin: int, ymin: int, xmax: int, ymax: int, color: int { |
|
var y/eax: int <- copy ymin |
|
{ |
|
compare y, ymax |
|
break-if->= |
|
draw-horizontal-line screen, y, xmin, xmax, color |
|
y <- increment |
|
loop |
|
} |
|
} |
|
|
|
fn draw-rect2 screen: (addr screen), xmin: int, ymin: int, w: int, h: int, color: int { |
|
var xmax/eax: int <- copy xmin |
|
xmax <- add w |
|
var ymax/ecx: int <- copy ymin |
|
ymax <- add h |
|
draw-rect screen, xmin ymin, xmax ymax, color |
|
} |
|
|
|
# 0 <= u <= 1 |
|
fn line-point u: float, x0: int, x1: int -> _/eax: int { |
|
var one/eax: int <- copy 1 |
|
var u-prime/xmm0: float <- convert one |
|
u-prime <- subtract u |
|
var result/xmm1: float <- convert x0 |
|
result <- multiply u-prime |
|
var term2/xmm2: float <- convert x1 |
|
term2 <- multiply u |
|
result <- add term2 |
|
var result/eax: int <- convert result |
|
return result |
|
}
|
|
|