Kaynağa Gözat

First version taking into account the cliprect for lines, needs improvement for the unnecessary loop
cf. paper Bresenham’s Line Generation Algorithm with Built - in Clipping, Yevgeny P. Kuzmin

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7215 8c9fc860-2736-0410-a75d-ab315db34111

felixf 8 yıl önce
ebeveyn
işleme
903de7558b
1 değiştirilmiş dosya ile 27 ekleme ve 1 silme
  1. 27 1
      source/WMGraphics.Mod

+ 27 - 1
source/WMGraphics.Mod

@@ -264,10 +264,11 @@ TYPE
 			(* Dummy. But is implemented in WMGraphicsGfx *)
 		END SetLineWidth;
 
+
 		(** draw a line within the current clipping rectangle *)
 		(** Override for improved speed *)
 		PROCEDURE Line*(x0, y0, x1, y1 : LONGINT; color : Color; mode : LONGINT);
-		VAR t, xi, mi, xf, mf, dt2 : LONGINT;
+		VAR t, xi, mi, xf, mf, dt2, ds2 : LONGINT; r: Rectangles.Rectangle;
 		BEGIN
 			IF y0 = y1 THEN (* horizontal case *)
 				IF x0 > x1 THEN t := x0; x0 := x1; x1 := t END;
@@ -279,6 +280,19 @@ TYPE
 				IF ABS(y1 - y0) > ABS(x1 - x0) THEN
 					IF y0 > y1 THEN t := y0; y0 := y1; y1 := t; t := x0; x0 := x1; x1 := t END;
 					xi := x0; xf :=	y0 - y1; mi := (x1 - x0) DIV (y1 - y0); mf := 2 * ( (x1 - x0) MOD (y1 - y0)); dt2 := 2 * (y1 - y0);
+					GetClipRect(r);
+					IF y0 < r.t THEN 
+						(* this loop should be replaced by a closed expression *)
+						FOR t := y0 TO r.t-1 DO
+							INC(xi, mi); INC(xf, mf);
+							IF xf > 0 THEN INC(xi); DEC(xf, dt2) END
+						END;
+						y0 := r.t;
+					END;
+					IF y1 > r.b THEN
+						y1 := r.b;
+					END;
+					
 					FOR t := y0 TO y1 DO
 						SetPixel(xi, t, color, mode);
 						INC(xi, mi); INC(xf, mf);
@@ -287,6 +301,18 @@ TYPE
 				ELSE
 					IF x0 > x1 THEN t := y0; y0 := y1; y1 := t; t := x0; x0 := x1; x1 := t END;
 					xi := y0; xf :=	x0 - x1; mi := (y1 - y0) DIV (x1 - x0); mf := 2 * ( (y1 - y0) MOD (x1 - x0)); dt2 := 2 * (x1 - x0);
+					GetClipRect(r);
+					IF x0 < r.l THEN 
+						(* this loop should be replaced by a closed expression *)
+						FOR t := x0 TO r.l-1 DO
+							INC(xi, mi); INC(xf, mf);
+							IF xf > 0 THEN INC(xi); DEC(xf, dt2) END
+						END;
+						x0 := r.l;
+					END;
+					IF x1 > r.r THEN
+						x1 := r.r;
+					END;
 					FOR t := x0 TO x1 DO
 						SetPixel(t, xi, color, mode);
 						INC(xi, mi); INC(xf, mf);