{ Copyright (C) 1986 Adam Fritz, 133 Main St., Afton, N.Y. 13730 } procedure Move ( x0, y0 : integer ) ; begin x0p := x0 ; y0p := y0 end ; {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~} function TestfPat ( x, y : integer ) : boolean ; begin if (x < xfPatn) or (x > xfPatx) or (y < yfPatn) or (y > yfPatx) then TestfPat := false else TestfPat := fPat[x,y] = 1 end ; {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~} function TestPad ( x, y : integer ) : boolean ; var iBit, iByte : integer ; begin if (x < xPadn) or (x > xPadx) or (y < yPadn) or (y > yPadx) then TestPad := false else begin iBit := (x-xPadn) * nPady + y - yPadn ; iByte := iBit shr 3 ; TestPad := (Pad[iByte] and BitMask[iBit and $0007]) <> 0 end end ; {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~} procedure SetPad ( x, y : integer ) ; var iBit, iByte : integer ; begin if not ((x < xPadn) or (x > xPadx) or (y < yPadn) or (y > yPadx)) then begin iBit := (x-xPadn) * nPady + y - yPadn ; iByte := iBit shr 3 ; Pad[iByte] := Pad[iByte] or BitMask[iBit and $0007] end end ; {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~} procedure PadOverlay ( x, y : integer ) ; var ix, iy : integer ; begin for ix := xfPatn to xfPatx do begin for iy := yfPatn to yfPatx do begin if TestfPat (ix,iy) then SetPad (x+ix,y+iy) end end end ; {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~} procedure Draw ( x1, y1 : integer ) ; { modified Bresenham algorithm } var dx, dy : integer ; t : integer ; d, ddx, ddy : integer ; x, y : integer ; begin x1p := x1 ; y1p := y1 ; dx := abs(x1p - x0p) ; dy := abs(y1p - y0p) ; { step in x } if dx >= dy then begin if x0p > x1p then begin t := x0p ; x0p := x1p ; x1p := t ; t := y0p ; y0p := y1p ; y1p := t end ; y := y0p ; if y1p > y0p then ddy := 1 else if y1p < y0p then ddy := -1 else ddy := 0 ; d := dx div (dy + 1) ; for x := x0p to x1p do begin d := d + dy ; if d > dx then begin y := y + ddy ; d := d - dx end ; PadOverlay (x,y) end end { step in y } else begin if y0p > y1p then begin t := x0p ; x0p := x1p ; x1p := t ; t := y0p ; y0p := y1p ; y1p := t end ; x := x0p ; if x1p > x0p then ddx := 1 else if x1p < x0p then ddx := -1 else ddx := 0 ; d := dy div (dx + 1) ; for y := y0p to y1p do begin d := d + dx ; if d > dy then begin x := x + ddx ; d := d - dy end ; PadOverlay (x,y) end end ; { update } x0p := x1 ; y0p := y1 end ; { Copyright (C) 1986 Adam Fritz, 133 Main St., Afton, N.Y. 13730 }