home *** CD-ROM | disk | FTP | other *** search
- (*========================================================*)
- (* SAVER.PAS v. 1.1 *)
- (* (C) 1993 Jörg Braun & DMV-Verlag *)
- (* ****************************************************** *)
- (* Demoprogramm für die Unit XGRAPH *)
- (* Compiler: Turbo Pascal ab Version 5.0 *)
- (* ====================================================== *)
- (* Benötigt werden: *)
- (* Turbo Pascal ab 5.0, svga.bgi, trip.chr, litt.chr, *)
- (* die Units xgraph.pas und drivers.pas sowie die Stan- *)
- (* dard-BGI-Treiber (CGA, EGAVGA ....). *)
- (* Treiber und Fonts müssen mit BINOBJ umgewandelt sein. *)
- (* »Make« mit: MAKE -fSAVER.MAK *)
- (* ====================================================== *)
- (* NICHT FÜR BORLAND PASCAL 7.0 PROTECTED-MODE ! *)
- (*========================================================*)
- {$DEFINE DEBUG}
- {$I xgraph.h} {$M 16384, 0, 128000}
-
- PROGRAM Non_Resident_Graphics_Screen_Saver;
-
- USES
- Dos, Crt, Drivers, XGraph;
-
- TYPE
- tSaver = (Logo, Stars, Message, Empty);
-
- VAR
- result,
- GraphDriver,
- GraphMode : INTEGER;
- Help : BOOLEAN;
- Saver : tSaver;
-
- (*========================================================*)
-
- PROCEDURE SmallFontProc; EXTERNAL; {$L LITT.OBJ}
-
- (*========================================================*)
-
- PROCEDURE TriplexFontProc; EXTERNAL; {$L TRIP.OBJ}
-
- (*========================================================*)
-
- PROCEDURE SaveScreen;
- CONST
- msg : STRING[25] = 'Ende mit beliebiger Taste';
- XOld: INTEGER = 1;
- YOld: INTEGER = 1;
- VAR
- ch : CHAR;
- MaxX, MaxY: INTEGER;
- p, si : SHORTINT;
- p1, p2 : POINTER;
- FrameColor,
- PicSize,
- y, BarColor,
- BackColor,
- ShadeColor,
- DOSColor,
- BarStyle,
- BkStyle,
- txColor : WORD;
- FillInfo : FillSettingsType;
-
- PROCEDURE BuildLogo;
- CONST
- _Dos_ : STRING[ 3] = 'DOS';
- toolbox : STRING[ 7] = 'toolbox';
- Subtitle: STRING[46] = 'Das Programmierermagazin der '
- + 'DOS International';
-
- PROCEDURE IBM8514SolidBar(x1, y1, x2, y2: WORD);
- VAR
- i: WORD;
- BEGIN
- FOR i := y1 TO y2 DO Line(x1, i, x2, i);
- END;
-
- PROCEDURE IBM8514LinedBar(x1, y1, x2, y2: WORD);
- VAR
- i: WORD;
- l: LineSettingsType;
- BEGIN
- GetLineSettings(l);
- SetLineStyle(SolidLn, $C3, NormWidth);
- i := y1;
- WHILE i < y2 DO BEGIN
- Line(x1, i, x2, i);
- Inc(i, 2);
- END;
- SetLineStyle(l.LineStyle, l.Pattern, l.Thickness);
- END;
-
- BEGIN
- IF GraphDriver IN [HercMono, EGA, EGA64] THEN
- SetVisualPage(1);
- BkStyle := SolidFill; (* bei allen Karten gleich *)
- ShadeColor := Black;
- txColor := White;
- CASE GraphDriver OF
- CGA, MCGA, ATT400:
- BEGIN
- FrameColor := White;
- BarColor := Black;
- DOSColor := White;
- BackColor := Black;
- BarStyle := CloseDotFill;
- txColor := White;
- END;
- EGAMono, HercMono, PC3270:
- BEGIN
- FrameColor := Blue;
- BarColor := LightGray;
- DOSColor := LightGray;
- BackColor := Black;
- BarStyle := CloseDotFill;
- END;
- EGA, EGA64, VGA, SVGA:
- BEGIN
- FrameColor := LightBlue;
- BarColor := LightRed;
- DOSColor := Yellow;
- BackColor := Blue;
- SetPalette(FrameColor, 63); (* hellblau --> weiß *)
- BarStyle := SolidFill;
- END;
- ELSE (* IBM8514 *)
- FrameColor := Cyan;
- BarColor := Red;
- DOSColor := Yellow;
- BackColor := Blue;
- SetColor(BackColor); (*Ein Bug in *)
- SetLineStyle(SolidLn, 1, NormWidth); (*ibm8514.bgi*)
- IBM8514LinedBar(101, 91, 289, 149);
- SetColor(FrameColor);
- Rectangle(102, 92, 288, 148);
- SetColor(BarColor); (*Ein Bug in *)
- IBM8514SolidBar(103, 115, 287, 131); (*ibm8514.bgi*)
- END;
-
- IF GraphDriver <> IBM8514 THEN BEGIN
- SetLineStyle(SolidLn, $3C, ThickWidth);
- SetFillStyle(BkStyle, BackColor);
- Bar(101, 91, 289, 149);
- SetColor(FrameColor);
- Rectangle(102, 92, 288, 148);
- SetFillStyle(BarStyle, BarColor);
- Bar(103, 115, 287, 131)
- END;
-
- (* ======== für alle Grafikkarten identisch: ======== *)
- SetTextStyle(TriplexFont, HorizDir, 5);
- SetColor(ShadeColor); (* Schriftzug 'toolbox' *)
- FontAttr := Bold; (* FETT einschalten *)
- OutTextXY(128, 90, toolbox); (* Schatten ... *)
- OutTextXY(129, 91, toolbox); (* doppelt dick *)
- SetColor(txColor); (* Vordergrundschrift *)
- OutTextXY(131, 92, toolbox);
- OutTextXY(132, 91, toolbox); (* ... vierfach dick *)
- SetTextStyle(TriplexFont, VertDir, 1);(* Kleinschrift *)
- SetColor(ShadeColor); (* Schriftzug DOS senkr.*)
- OutTextXY(106, 105, _Dos_); (* Schatten *)
- SetColor(DOSColor);
- OutTextXY(105, 104, _Dos_); (* Vordergrund *)
- SetTextStyle(SmallFont, HorizDir, 1);(* außer Monochr.*)
- FontAttr := Normal; (* fett ausschalten *)
- SetColor(txColor); (* Farbe für den U-Titel*)
- OutTextXY(137, 140, Subtitle);
- SetLineStyle(SolidLn, $3C, NormWidth);
- Line(137, 147, 275, 147); (* ... unterstrichen *)
- PicSize := ImageSize(100, 90, 290, 150);(* Bitmapgröße*)
- GetMem(p1, PicSize); (* Speicher anfordern *)
- GetImage(100, 90, 290, 150, p1^);(* in Image speichern*)
- SetFillStyle(SolidFill, GetBkColor); (* Bild ... *)
- Bar(100, 90, 290, 150); (* schwärzen ... *)
- GetMem(p2, PicSize); (* und zweite Bitmap *)
- GetImage(100, 90, 290, 150, p2^);(* abspeichern *)
- IF GraphDriver IN [HercMono, EGA, EGA64] THEN
- SetVisualPage(0);
- END;
-
- PROCEDURE DisplayLogo;
- VAR
- x, y : WORD;
- BEGIN
- x := Random(MaxX - 191); (* x-Position und *)
- y := Random(MaxY - 61); (* y-Position = Zufallswert *)
- IF x = 0 THEN x := 190; (* ... aber > 0 *)
- IF y = 0 THEN y := 60;
- PutImage(XOld, YOld, p2^, NormalPut); (* Löschen alt *)
- PutImage(x, y, p1^, NormalPut); (* Setzen neu *)
- Delay(Random(1000) + 100); (* ... warten *)
- IF Saver = Logo THEN BEGIN
- IF GraphDriver IN [EGA, EGA64, VGA, SVGA] THEN BEGIN
- p := Random(64); (* Zufallspalette *)
- IF p MOD 8 = 0 THEN p := 63; (* Rahmenfarbe per *)
- SetPalette(FrameColor, p); (* Palette steuern *)
- END ELSE IF GraphDriver = IBM8514 THEN
- SetRGBPalette(FrameColor, (* IBM8514/A nicht *)
- Random(MaxInt), (* mit SetPalette *)
- Random(MaxInt), (* sondern RGB-Pa- *)
- Random(MaxInt)); (* lette *)
- END ELSE (* IF Saver = Message THEN *) BEGIN
- IF GraphDriver IN [EGA, EGA64, VGA, SVGA] THEN BEGIN
- p := Random(64); (* siehe oben *)
- IF p MOD 8 = 0 THEN p := 63;
- SetPalette(GetMaxColor, p)
- END ELSE IF GraphDriver = IBM8514 THEN(* siehe oben *)
- SetRGBPalette(GetMaxColor, Random(MaxInt),
- Random(MaxInt), Random(MaxInt));
- END;
- XOld := x; YOld := y; (* Position merken *)
- END;
-
- PROCEDURE DisplayStars;
- VAR
- x, y: INTEGER;
- c : WORD;
- v : INTEGER;
- BEGIN
- x := Random(MaxX); (* alle Anzeigen per *)
- y := Random(MaxY); (* Zufallsgenerator *)
- c := Random(Succ(GetMaxColor)); (* generieren *)
- v := Random(63);
- IF v MOD 5 = 0 THEN BEGIN
- SetColor(c);
- Circle(x, y, 1); (* dicker »Punkt« *)
- END ELSE IF v MOD 32 = 0 THEN BEGIN
- SetColor(c);
- Circle(x, y, 2);
- Line(x, y - 4, x, y + 4); (* Stern zeichnen *)
- Line(x + 4, y, x - 4, y);
- END ELSE PutPixel(x, y, c); (* einfacher Punkt *)
- (* nicht nur anzeigen, sondern auch wieder schwärzen: *)
- x := Random(MaxX);
- y := Random(MaxY);
- PutPixel(x, y, Black);
- PutPixel(x + 1, y + 1, Black);
- PutPixel(x - 1, y + 1, Black);
- PutPixel(x - 1, y - 1, Black);
- PutPixel(x + 1, y - 1, Black);
- x := Random(x);
- y := Random(y);
- PutPixel(x, y, Black);
- x := Random(x);
- y := Random(y);
- PutPixel(x, y, Black);
- Delay(1);
- END;
-
- PROCEDURE BuildMessage;
- VAR
- i : BYTE;
- x, x2,
- y, y2: INTEGER;
- Mess : STRING;
- Pal : PaletteType;
- BEGIN
- Mess := '';
- IF ParamCount > 1 THEN BEGIN
- FOR i := 2 TO ParamCount DO
- Mess := Mess + ParamStr(i) + ' ';
- Delete(Mess, Length(Mess), 1);
- END ELSE Mess := msg;
- IF GraphDriver IN [HercMono, EGA, EGA64] THEN
- SetVisualPage(1);
- x := 150;
- y := 150;
- FontAttr := Outline;
- GetDefaultPalette(Pal);
- SetAllPalette(Pal);
- SetColor(GetMaxColor);
- SetTextStyle(TriplexFont, HorizDir, 2);
- SetTextJustify(LeftText, TopText);
- x2 := TextWidth(Mess) + x;
- y2 := TextHeight(Mess) + y;
- OutTextXY(x, y, Mess);
- PicSize := ImageSize(x - 5, y - 5, x2 + 5, y2 + 5);
- GetMem(p1, PicSize);
- GetImage(x - 5, y - 5, x2 + 5, y2 + 5, p1^);
- SetColor(GetBkColor);
- OutTextXY(x, y, Mess);
- GetMem(p2, PicSize);
- GetImage(x - 5, y - 5, x2 + 5, y2 + 5, p2^);
- FontAttr := Normal;
- IF GraphDriver IN [HercMono, EGA, EGA64] THEN
- SetVisualPage(0);
- END;
-
- BEGIN
- CheckBreak := FALSE; (* Ctrl-Break abschalten *)
- GraphMode := GetMaxMode; (* max. Auflösung des Treibers *)
- SetBkColor(Black);
- MaxX := GetMaxX; (* grafikkartenunabhängige Auflösung *)
- MaxY := GetMaxY;
- CASE GraphDriver OF
- EGA, EGA64, VGA, SVGA:
- BEGIN
- SetPalette(Green, 127); (* Grün <<-->> Weiß *)
- SetColor(Green);
- END;
- IBM8514:
- BEGIN (* 8514/A: RBG-Palette *)
- SetRGBPalette(Green, MaxInt, MaxInt, MaxInt);
- SetColor(Green);
- END ELSE (* CGA, MCGA, EGAMono, HercMono, PC3270 *)
- SetColor(Succ(GetMaxColor));
- END;
- SetTextStyle(TriplexFont, HorizDir, 2); (* Info-Text *)
- FontAttr := Outline;
- OutTextXY(GetMaxX DIV 2 - TextWidth(msg) DIV 2,
- GetMaxY DIV 2 - TextHeight(msg) DIV 2, msg);
- Delay(1000); (* Eine Sekunde warten *)
- SetColor(Black);
- OutTextXY(GetMaxX DIV 2 - TextWidth(msg) DIV 2,
- GetMaxY DIV 2 - TextHeight(msg) DIV 2, msg);
-
- FontAttr := Normal;
- CASE Saver OF
- Logo : BuildLogo;
- Message: BuildMessage;
- END;
- Randomize; (* Zufallszähler init. *)
- REPEAT (* Tasteschleife ... *)
- CASE Saver OF
- Logo, (* Logo anzeigen *)
- Message: DisplayLogo; (* Meldung zeigen *)
- Stars : DisplayStars; (* Sterne anzeigen *)
- ELSE ; (* leerer Bildschirm *)
- END;
- UNTIL KeyPressed; (* ... bis beliebige Taste gedrückt *)
- CloseGraph; (* Textmodus einschalten *)
- IF Saver IN [Logo, Message] THEN BEGIN
- FreeMem(p1, PicSize); (* Speicher wieder frei- *)
- FreeMem(p2, PicSize); (* geben. *)
- END;
- ch := ReadKey;
- IF ch = #0 THEN ch := ReadKey;(* Tastaturpuffer löschen *)
- END;
-
- (*========================================================*)
-
- PROCEDURE CheckParameters(VAR Help: BOOLEAN);
- VAR
- p: STRING;
- b: BYTE;
-
- BEGIN
- Help := FALSE;
- IF ParamCount = 0 THEN Saver := Logo ELSE BEGIN
- p := ParamStr(1); (* ... auswerten *)
- FOR b := 1 TO Length(p) DO
- p[b] := UpCase(p[b]);
- IF (Pos('?', p) > 0) OR (* Hilfe mit /? und /h *)
- (Pos('H', p) > 0) THEN BEGIN
- TextAttr := Yellow;
- WriteLn(^M^J'Screensaver v1.0 (C) 1993 J. Braun & DMV'
- + 'Verlag');
- TextAttr := LightGray;
- WriteLn('Aufruf: SAVER [[-|/]star|[-|/]black|[-|/]log'
- + 'o]|[[-|/]mess [Meldung]]|[[-|/]?|h]] Vorei'
- + 'nstellung (ohne Parameter) ist das DOS-toolb'
- + 'ox-Logo.'^M^J' Das Programm verwendet imme'
- + 'r die höchstmögliche Grafikauflösung.'^J^M);
- Help := TRUE;
- END ELSE
- IF Pos('STAR', p) > 0 THEN Saver := Stars ELSE
- IF Pos('BLACK', p) > 0 THEN Saver := Empty ELSE
- IF Pos('MESS', p) > 0 THEN Saver := Message
- ELSE Saver := Logo;
- END;
- END;
-
- (*========================================================*)
-
- FUNCTION InitGraphics: INTEGER;
- VAR
- d : INTEGER;
- BEGIN
- d := RegisterBGIFont(@SmallFontProc);
- d := RegisterBGIFont(@TriplexFontProc);
- DetectGraph(GraphDriver, GraphMode);
- IF GraphDriver = HercMono THEN
- IF WORD(Ptr($C000, $0000)^) = $AA55 THEN BEGIN
- GraphDriver := EGAMono; (* Emulation unter *)
- GraphMode := EGAMonoHi; (* OS/2 2.0! *)
- END;
- InitGraph(GraphDriver, GraphMode, '');
- InitGraphics := GraphResult;
- END;
-
- (*========================================================*)
-
- BEGIN
- CheckParameters(Help);
- IF NOT Help THEN BEGIN
- result := InitGraphics;
- IF result = 0 THEN SaveScreen
- ELSE
- WriteLn('Grafikfehler:'#13#10, GraphErrorMsg(result));
- END;
- END.
-
- (*========================================================*)
- (* Ende von SAVER.PAS *)
-