Metropoli BBS
VIEWER: progp088.pas MODE: TEXT (ASCII)
{**********************************************************************}
{ Draw a line with a pattern using the 'slow' algorithm                }
{**********************************************************************}

procedure slow_pattern_line(x0, y0, x1, y1, color,pattern:word);
const
mask : array[0..15] of word = (
				$8000,$4000,$2000,$1000,
				$0800,$0400,$0200,$0100,
				$0080,$0040,$0020,$0010,
				$0008,$0004,$0002,$0001);
var
i,x,y : integer;
l : longint;
begin
	{--- Draw degenerate line (pixel)			}
	i := x0 - x1;
	if i = 0 then i := y0 - y1;
	if i = 0 then
	begin				{ Draw a single pixel	}
	    if (mask[x0 and $0F] and pattern)>0 then pixel_write(x0,y0,color);
	end

	{--- Draw lines with dx > dy				}
	else if abs(x1 - x0) >= abs(y1 - y0) then
	begin
		if x1 < x0 then begin	{ Swap end points	}
			x := x1;
			y := y1;
			x1 := x0;
			y1 := y0;
			x0 := x;
			y0 := y;
		end;
		for x := x0 to x1 do begin	{ Loop over x coord	}
		    				{ Compute y using x	}

		{	y := y0 + ((x - x0)*longint(y1 - y0)) div (x1 - x0);}
			y := x - x0;
			l := y1;
			l := l - y0;
			l := l * y;
			l := l div (x1 - x0);
			y := y0 + l;
			
			if (mask[x and $0f] and pattern) > 0 then
				pixel_write(x,y,color); { Draw next point}
		end;
	end

	{--- Draw lines with dy > dx				}
	else begin
		if y1 < y0 then begin	{ Swap end points	}
			x := x1;
			y := y1;
			x1 := x0;
			y1 := y0;
			x0 := x;
			y0 := y;
		end;
		for y := y0 to y1 do
		begin		{ Loop over y coord	}
		    				{ Compute x using y	}
		{x := x0 + ((y - y0)*longint(x1 - x0)) div (y1 - y0);}
			x := y - y0;
			l := x1;
			l := l - x0;
			l := l * x;
			l := l div (y1 - y0);
			x := x0 + l;
		if (mask[y and $0f] and pattern) > 0 then 
			pixel_write(x,y,color);  { Draw next point	 }
		end;
	end;
end;
[ RETURN TO DIRECTORY ]