浏览代码

massively improved speed for 24-bit X11 display!

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6985 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 年之前
父节点
当前提交
b683b6dd30
共有 1 个文件被更改,包括 19 次插入30 次删除
  1. 19 30
      source/Unix.XDisplay.Mod

+ 19 - 30
source/Unix.XDisplay.Mod

@@ -476,28 +476,24 @@ VAR
 	BEGIN
 	BEGIN
 		CASE xformat OF
 		CASE xformat OF
 		| index8:
 		| index8:
-				FOR i := 1 TO width DO
-					S.GET( bp, byte );  S.PUT( ip, byte );  INC( bp );  INC( ip )
-				END;
+				S.MOVE(bp, ip, width);
 		| color565, color555, color664:
 		| color565, color555, color664:
+				S.MOVE(bp, ip, 2*width);
+		| color888: (* x-format (destination) is 888, A ignored (?) , Aos Format (source) is 8888 *)
+				S.MOVE(bp, ip, 4*width);
+				(*
 				FOR i := 1 TO width DO
 				FOR i := 1 TO width DO
-					S.GET( bp, byte );  S.PUT( ip, byte );  INC( bp );  INC( ip );
-					S.GET( bp, byte );  S.PUT( ip, byte );  INC( bp );  INC( ip )
-				END;
-		| color888:
-				FOR i := 1 TO width DO
+					S.MOVE(bp,ip,3); INC(bp,3); INC(ip,3);
+					(*
 					S.GET( bp, byte );  S.PUT( ip, byte );  INC( bp );  INC( ip );   (* B *)
 					S.GET( bp, byte );  S.PUT( ip, byte );  INC( bp );  INC( ip );   (* B *)
 					S.GET( bp, byte );  S.PUT( ip, byte );  INC( bp );  INC( ip );   (* G *)
 					S.GET( bp, byte );  S.PUT( ip, byte );  INC( bp );  INC( ip );   (* G *)
 					S.GET( bp, byte );  S.PUT( ip, byte );  INC( bp );  INC( ip );   (* R *)
 					S.GET( bp, byte );  S.PUT( ip, byte );  INC( bp );  INC( ip );   (* R *)
+					*)
 					byte := 0X;  S.PUT( ip, byte );  INC( ip )
 					byte := 0X;  S.PUT( ip, byte );  INC( ip )
 				END;
 				END;
+				*)
 		ELSE  (* color8888 *)
 		ELSE  (* color8888 *)
-				FOR i := 1 TO width DO
-					S.GET( bp, byte );  S.PUT( ip, byte );  INC( bp );  INC( ip );   (* B *)
-					S.GET( bp, byte );  S.PUT( ip, byte );  INC( bp );  INC( ip );   (* G *)
-					S.GET( bp, byte );  S.PUT( ip, byte );  INC( bp );  INC( ip );   (* R *)
-					S.GET( bp, byte );  S.PUT( ip, byte );  INC( bp );  INC( ip );   (* X *)
-				END
+				S.MOVE(bp, ip, 4*width);
 		END
 		END
 	END PutLine;
 	END PutLine;
 
 
@@ -508,28 +504,21 @@ VAR
 	BEGIN			
 	BEGIN			
 		CASE xformat OF
 		CASE xformat OF
 		| index8:
 		| index8:
-				FOR i := 1 TO width DO
-					S.GET( ip, byte );  S.PUT( bp, byte );  INC( ip );  INC( bp )
-				END;
+				S.MOVE(ip, bp, width);
 		| color565, color555, color664:
 		| color565, color555, color664:
-				FOR i := 1 TO width DO
-					S.GET( ip, byte );  S.PUT( bp, byte );  INC( ip );  INC( bp );
-					S.GET( ip, byte );  S.PUT( bp, byte );  INC( ip );  INC( bp )
-				END
+				S.MOVE(ip, bp, 2*width);
 		| color888:
 		| color888:
+				S.MOVE(ip, bp, 4*width);
+				(*
 				FOR i := 1 TO width DO
 				FOR i := 1 TO width DO
 					S.GET( ip, byte );  S.PUT( bp, byte );  INC( ip );  INC( bp );   (* B *)
 					S.GET( ip, byte );  S.PUT( bp, byte );  INC( ip );  INC( bp );   (* B *)
 					S.GET( ip, byte );  S.PUT( bp, byte );  INC( ip );  INC( bp );   (* G *)
 					S.GET( ip, byte );  S.PUT( bp, byte );  INC( ip );  INC( bp );   (* G *)
 					S.GET( ip, byte );  S.PUT( bp, byte );  INC( ip );  INC( bp );   (* R *)
 					S.GET( ip, byte );  S.PUT( bp, byte );  INC( ip );  INC( bp );   (* R *)
 					INC( ip )
 					INC( ip )
 				END
 				END
+				*)
 		ELSE  (* color8888 *)
 		ELSE  (* color8888 *)
-				FOR i := 1 TO width DO
-					S.GET( ip, byte );  S.PUT( bp, byte );  INC( ip );  INC( bp );   (* B *)
-					S.GET( ip, byte );  S.PUT( bp, byte );  INC( ip );  INC( bp );   (* G *)
-					S.GET( ip, byte );  S.PUT( bp, byte );  INC( ip );  INC( bp );   (* R *)
-					S.GET( ip, byte );  S.PUT( bp, byte );  INC( ip );  INC( bp );   (* X *)
-				END
+				S.MOVE(ip, bp, 4*width);
 		END;
 		END;
 	END GetLine;
 	END GetLine;
 
 
@@ -550,11 +539,11 @@ VAR
 				END
 				END
 		| color888:
 		| color888:
 				FOR i := 1 TO width DO
 				FOR i := 1 TO width DO
-					byte := 0X;  S.PUT( ip, byte );  INC( ip );
+					S.PUT8( ip, 0X );  INC( ip );
 					S.GET( bp + 2, byte );  S.PUT( ip, byte );  INC( ip );   (* B *)
 					S.GET( bp + 2, byte );  S.PUT( ip, byte );  INC( ip );   (* B *)
 					S.GET( bp + 1, byte );  S.PUT( ip, byte );  INC( ip );   (* G *)
 					S.GET( bp + 1, byte );  S.PUT( ip, byte );  INC( ip );   (* G *)
 					S.GET( bp + 0, byte );  S.PUT( ip, byte );  INC( ip );   (* R *)
 					S.GET( bp + 0, byte );  S.PUT( ip, byte );  INC( ip );   (* R *)
-					INC( bp, 3 )
+					INC( bp, 4 )
 				END
 				END
 		ELSE  (* color8888 *)
 		ELSE  (* color8888 *)
 				FOR i := 1 TO width DO
 				FOR i := 1 TO width DO
@@ -767,7 +756,7 @@ VAR
 			ELSE  d.xformat := color565
 			ELSE  d.xformat := color565
 			END
 			END
 		ELSIF d.depth = 24 THEN  
 		ELSIF d.depth = 24 THEN  
-			d.format := Displays.color888;
+			d.format := Displays.color8888;
 			d.xformat := color888
 			d.xformat := color888
 		ELSIF d.depth = 32 THEN  
 		ELSIF d.depth = 32 THEN  
 			d.format := Displays.color8888;
 			d.format := Displays.color8888;