This is functional Bresenham algo for Line, I coded for Oberon system.
Code: Select all
PROCEDURE Line*(col, x, y, x0, y0, mode: INTEGER);
VAR w, h, x1, y1, d, u: INTEGER;
BEGIN
w := x0-x; h := y0-y;
IF w >= 0 THEN IF h >= 0 THEN (*north-east*) d := 1 ELSE (*south-east*) d := -1; u := y0; y0 := y; y := u END
ELSIF (*w < 0*) h >= 0 THEN (*north-west*) d := -1; u := x0; x0 := x; x := u
ELSE (*south-west*) d := 1; u := x0; x0 := x; x := u; u := y0; y0 := y; y := u END ;
w := ABS(w); h := ABS(h);
IF w = 0 THEN (*D.*)ReplConst(col, x, y, 1, h, mode)
ELSIF h = 0 THEN (*D.*)ReplConst(col, x, y, w, 1, mode)
ELSIF h < w THEN x1 := x+w; u := (h-w) DIV 2;
IF d = -1 THEN INC(y, h) END ;
WHILE x < x1 DO
Dot(col, x, y, mode); INC(x);
IF u < 0 THEN INC(u, h) ELSE INC(u, h-w); INC(y, d) END
END
ELSE (*h > w*) y1 := y+h; u := (w-h) DIV 2;
IF d = -1 THEN INC(x, w) END ;
WHILE y < y1 DO
Dot(col, x, y, mode); INC(y);
IF u < 0 THEN INC(u, w) ELSE INC(u, w-h); INC(x, d) END
END
END
END Line;
Code: Select all
line lea vars,a1 ;save vars
move.w d1,(a1)+ ;x
move.w d2,(a1)+ ;y
move.w d3,(a1)+ ;col
move.w d4,(a1)+ ;x0
move.w d5,(a1)+ ;y0
move.w #1,10(a1) ;d=1, south-east quadrant
sub.w d1,d4 ;d4=x0-x, width
sub.w d2,d5 ;d5=y0-y, height
move.w d4,(a1) ;w=d4
move.w d5,2(a1) ;h=d5
add.w d1,d4 ;d4=x+w
move.w d4,4(a1) ;x1=d4
move.w (a1),d4 ;d4=w
sub.w d4,d5 ;d5=h-w
asr.w #1,d5 ;d5=(h-w)/2
move.w d5,8(a1) ;u=d5
lea vars,a1 ;restore vars
loop move.w (a1),d1 ;d1=x
move.w 2(a1),d2 ;d2=y
move.w 4(a1),d3 ;d3=col
move.w 14(a1),d4 ;d4=x1
cmp.w d1,d4 ;x>=x1?
bls.s exit ;yes, exit
bsr plot4 ;put pixel at x,y,col=0,2,4,6
addq.w #1,(a1) ;x=x+1
move.w 12(a1),d5 ;d5=h
tst.w 18(a1) ;u<0?
bpl.s uplus ;no, uplus
uminus add.w d5,18(a1) ;u=u+h, yes uminus
bra.s loop
uplus move.w 10(a1),d4 ;d4=w
sub.w d4,d5 ;d5=h-w
add.w d5,18(a1) ;u=u+h-w
move.w 20(a1),d4 ;d4=d
add.w d4,2(a1) ;y=y+d
bra.s loop
; All complete
exit clr.l d0 ;No error code
rts ;Return to BASIC
; Variables
vars
x ds.w 1 ;$00
y ds.w 1 ;$02
col ds.w 1 ;$04
x0 ds.w 1 ;$06
y0 ds.w 1 ;$08
w ds.w 1 ;$0a
h ds.w 1 ;$0c
x1 ds.w 1 ;$0e
y1 ds.w 1 ;$10
u ds.w 1 ;$12
d ds.w 1 ;$14
dc.w 1
end