home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* GRAFSYS.PAS *)
- (* Grafik-Initialisierungs- und -Abschlussprozeduren, Punkt- und Farb- *)
- (* setzung fuer die Grafikserie *)
- (* *)
- (* Hier implementiert mit Turbo-Pascal auf einem MS-DOS Rechner mit der *)
- (* Color-Graphikkarte CGA *)
- (*-------------------------------------------------------------------------*)
- (* Zeichenfarbe setzen: *)
-
- PROCEDURE Set_Pen_Color (color: Sys_Colors);
-
- BEGIN
- Pen_Color := Color;
- HiResColor(color);
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Hintergrundfarbe setzen: *)
-
- PROCEDURE Set_Background (color: Sys_Colors);
-
- BEGIN
- GraphBackground(color);
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Grafikmodus aktivieren: *)
-
- PROCEDURE Enter_Graphic;
-
- BEGIN
- HiRes; (* Aufloesung hier 640x200 Punkte, 2 Farben *)
- Set_Background(Black); (* Farbbezeichner sind in *)
- Set_Pen_Color(White); (* Turbo-Pascal vordefiniert *)
- Pen_Xpos := 0; (* 'Zeichenstift' auf definierte Position *)
- Pen_Ypos := 0;
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Grafikmodus verlassen: *)
-
- PROCEDURE Exit_Graphic;
-
- BEGIN
- TextMode;
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Punkt auf die vom System vorgegebenen Bildschirmkoordinaten setzen: *)
-
- PROCEDURE Point_System (x: x_Koord_Sys; y: y_Koord_Sys);
-
- BEGIN
- Plot(x, y, Ord(Pen_Color>0));
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Punkt aus unserem Koordinatensystem (Ursprung (0,0) links unten!) in
- Bildschirmkoordinaten uebertragen. Falls beide Systeme gleich, sollten
- aus Geschwindigkeitsgruenden die Fallunterscheidung sowie die Additionen
- von 'ScreenXmin_Sys' und 'ScreenYmin_Sys' weggelassen werden! *)
-
- PROCEDURE Point (x: x_Koord; y: y_Koord);
-
- BEGIN
- IF Origin_is_Top THEN
- Point_System(x + ScreenXmin_Sys, ScreenYmax - y + ScreenYmin_Sys)
- ELSE
- Point_System(x + ScreenXmin_Sys, y + ScreenYmin_Sys);
- Pen_Xpos := x;
- Pen_Ypos := y;
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Point-SWAP fuer die Graphikserie. Vertauscht die Koord. zweier Punkte. *)
-
- PROCEDURE point_swap (VAR x1, y1, x2, y2: INTEGER);
-
- VAR hilf: INTEGER;
-
- BEGIN
- hilf := x1; x1 := x2; x2 := hilf;
- hilf := y1; y1 := y2; y2 := hilf;
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Punkt auf den vom System vorgegebenen Bildschirm-Koordinaten testen: *)
- (* TRUE, wenn Punkt die akt. Farbe von Pen_Color hat, sonst FALSE! *)
- (* Hier muß die entsprechende Funktion der verw. Implementation entspr. *)
- (* gegen die Turbo Pascal-Funktion ausgetauscht werden! *)
-
- function GetPixel_System (x: x_Koord_Sys;
- y: y_Koord_Sys;
- Color: Sys_Colors): boolean;
-
- begin
- GetPixel_System := (GetDotColor(x,y) > 0) AND (Color = Pen_Color)
- end;
-
- (*-------------------------------------------------------------------------*)
- (* Punkt unseres Koordinaten-Systems testen: *)
-
- function GetPixel (x: x_Koord; y: y_Koord; Color: Sys_Colors): boolean;
-
- begin
- if Origin_is_Top then
- GetPixel := GetPixel_System(x + ScreenXmin_Sys,
- ScreenYmax - Y + ScreenYmin_Sys,
- Color)
- else
- GetPixel := GetPixel_System(x + ScreenXmin_Sys,
- y + ScreenYmin_Sys,
- color)
- end;
-
-
- (*-------- Erweiterung zu GRAFSYS.PAS um Fensterinhalte speichern und ---- *)
- (* rekonstruieren zu können. *)
-
- (*------------------- Systemabhaengiger Teil --------------------------*)
- (* Implementation für Turbo Pascal auf MS-DOS Rechner mit CGA-Karte. *)
- (* !!!! GRAPH.P muss im Hauptprogramm included werden !!!! *)
-
- procedure StoreArea(x1 : x_Koord_Sys;
- y1 : y_Koord_Sys;
- x2 : x_Koord_Sys;
- y2 : y_Koord_Sys;
- var Inhalt : WinBackGround );
-
- begin
- (* Ggf. pruefen, ob noch genug Platz auf dem Heap vorhanden ist ! *)
- new(Inhalt); (* Speicherplatz anfordern *)
- GetPic(Inhalt^,x1,y1,x2,y2) (* <--- Hier anpassen *)
- end;
-
-
-
- procedure RestoreArea(var Inhalt : WinBackGround;
- x : x_Koord_Sys;
- y : y_Koord_Sys );
-
- begin
- PutPic(Inhalt^,x,y); (* <--- Hier anpassen *)
- Dispose(Inhalt)
- end;
-
- (* *)
- (*-------------- Ende des systemabhaengigen Teils ---------------------*)
-
-
-
- procedure StoreViewport( x1 : x_Koord; (* Viewport- *)
- y1 : y_Koord; (* Ausschnitt *)
- x2 : x_Koord;
- y2 : y_Koord;
- var Inhalt : WinBackground );
-
- begin
- if Origin_is_Top then
- StoreArea(x1 + ScreenXmin_Sys,
- ScreenYmax - y1 + ScreenYmin_Sys,
- x2 + ScreenXmin_Sys,
- ScreenYmax - y2 + ScreenYmin_Sys,
- Inhalt )
- else
- StoreArea(x1 + ScreenXmin_Sys, y1 + ScreenYmin_Sys,
- x2 + ScreenXmin_Sys, y2 + ScreenYmin_Sys,
- Inhalt )
- end;
-
-
- procedure RestoreViewport( var Inhalt : WinBackground;
- x : x_Koord; y : y_Koord );
- (* Untere linke Ecke *)
-
- begin
- if Origin_is_Top then
- RestoreArea(Inhalt,
- x + ScreenXmin_Sys, ScreenYmax - y + ScreenYmin_Sys )
- else
- RestoreArea(Inhalt,
- x + ScreenXmin_Sys, y + ScreenYmin_Sys)
- end;
-
- (*------------ Prozedur zum Vertauschen zweier Werte ---------------------*)
-
- procedure RealSwap( var a,b : real ); (* Zum vertauschen zweier Realwerte *)
-
- var hilf : real;
-
- begin
- hilf := a; a := b; b := hilf
- end;
-
-
- (*-------------------------------------------------------------------------*)
- (* Ende von GRAFSYS.PAS *)