home *** CD-ROM | disk | FTP | other *** search
- (*========================================================*)
- (* XGRAPH.PAS Version 1.01 *)
- (* (C) 1993 Jörg Braun & DMV-Verlag *)
- (* Compiler: Turbo Pascal ab Vers. 5.0, Borland Pascal 7 *)
- (* Nicht für Turbo Pascal 4.0 *)
- (* Nicht für Borland Pascal 7.0 DOS-Protected-Mode! *)
- (*========================================================*)
- (* XGRAPH ist ein SVGA-16-Color-Interface zur Unit Graph *)
- (* und kann beliebig erweitert werden. Da alle Standard- *)
- (* Bezeichner und Prozeduren/Funktionen integriert sind, *)
- (* ist der weitere Aufruf von »Graph« überflüssig. *)
- (* Beim Ersetzen durch eigene Routinen müssen nur die *)
- (* GRAPH.-Aufrufe entfernt werden. *)
- (* ACHTUNG: Es ist zwar nicht mehr notwendig, die Unit *)
- (* Graph einzubinden, falls es aber doch gemacht wird, *)
- (* muß XGraph UNBEDINGT nach Graph eingebunden werden! *)
- (* Voreingestellter Grafikmodus ist 800*600, 16-Color. Es *)
- (* ist möglich, auch andere Grafikmodi mit 16 Farben und *)
- (* einer maximalen Bildgröße von 64 kByte einzustellen. *)
- (* hierzu müssen nur die entsprechenden Werte im Imple- *)
- (* mentationsteil geändert werden. *)
- (* Bei Turbo Pascal 5.X gibt es Probleme mit den Zusatz- *)
- (* fonts, falls sie nicht mit XFONTS.PAS eingelinkt sind! *)
- (*========================================================*)
- {$I xgraph.h} (* <- Compilerschalter, Conditional defines *)
-
- UNIT XGraph; (* eXtended Graph *)
-
- INTERFACE
-
- CONST
- TopOn = TRUE; (* für Bar3D *)
- TopOff = FALSE; (* für Bar3D *)
-
- NormalPut = 0; (* Überschreiben *)
- CopyPut = 0; (* Überschreiben *)
- XORPut = 1; (* XOR-Operation *)
- OrPut = 2; (* ODER-Verknüpfung *)
- AndPut = 3; (* UND-Verknüpfung *)
- NotPut = 4; (* invertiertes Überschreiben *)
-
- ClipOn = TRUE; (* Clipping-Konstanten *)
- ClipOff = FALSE; (* Clipping-Konstanten *)
-
- Black = 0; (* Die Farbkonstanten *)
- Blue = 1;
- Green = 2;
- DarkGray = 8;
- Cyan = 3;
- Red = 4;
- Magenta = 5;
- Brown = 6;
- LightGray = 7;
- LightBlue = 9;
- LightGreen = 10;
- LightCyan = 11;
- LightRed = 12;
- LightMagenta = 13;
- Yellow = 14;
- White = 15;
- Blink = 128;
-
- EGABlack = 0; (* Farben für EGA, VGA, 8514 *)
- EGABlue = 1;
- EGAGreen = 2;
- EGACyan = 3;
- EGARed = 4;
- EGAMagenta = 5;
- EGABrown = 20;
- EGALightgray = 7;
- EGADarkgray = 56;
- EGALightBlue = 57;
- EGALightGreen = 58;
- EGALightcyan = 59;
- EGALightRed = 60;
- EGALightMagenta= 61;
- EGAYellow = 62;
- EGAWhite = 63; (* EGA: 16 Farben aus 64 (0..63) *)
-
- EmptyFill = 0; (* Füllen mit Hintergrundfarbe *)
- SolidFill = 1; (* Füllen mit der Zeichenfarbe *)
- LineFill = 2; (* ─── *)
- LtSlashFill = 3; (* /// *)
- SlashFill = 4; (* /// mit dicken Linien *)
- BkSlashFill = 5; (* \\\ mit dicken Linien *)
- LtBkSlashFill = 6; (* \\\ *)
- HatchFill = 7; (* leicht schraffiert *)
- XHatchFill = 8; (* XXX *)
- InterleaveFill = 9; (* abwechselnde Linien *)
- WideDotFill = 10; (* ∙∙∙ weit auseinanderliegend *)
- CloseDotFill = 11; (* ∙∙∙ eng beieinander *)
- UserFill = 12; (* benutzerdef.: SetFillStyle() *)
-
- CurrentDriver =-128; (* für GetModeRange *)
-
- Detect = 0; (* automatische Erkennung *)
- CGA = 1; (* Die *)
- MCGA = 2; (* verschiedenen *)
- EGA = 3; (* Grafikkarten *)
- EGA64 = 4; (* als *)
- EGAMono = 5; (* Voreinstellungen *)
- IBM8514 = 6; (* Mit AUTODETECT! *)
- HercMono = 7; (* keine Untersch. zu MDA *)
- ATT400 = 8; (* nicht getestet! *)
- VGA = 9; (* *)
- PC3270 = 10; (* nicht getestet! *)
-
- (* neu: *)
- {$IFDEF VER60} (* Turbo Pascal 6.0, 7.0: *)
- SVGA = 16;
- {$ELSE} (* Turbo Pascal 5.0, 5.5: *)
- SVGA = 11;
- {$ENDIF}
- CGAC0 = 0; (* 320 x 200 4 Farben Palette 0 *)
- CGAC1 = 1; (* 320 x 200 4 Farben Palette 1 *)
- CGAC2 = 2; (* 320 x 200 4 Farben Palette 2 *)
- CGAC3 = 3; (* 320 x 200 4 Farben Palette 3 *)
- CGAHi = 4; (* 640 x 200 2 Farben *)
- MCGAC0 = 0; (* 320 x 200 4 Farben Palette 0 *)
- MCGAC1 = 1; (* 320 x 200 4 Farben Palette 1 *)
- MCGAC2 = 2; (* 320 x 200 4 Farben Palette 2 *)
- MCGAC3 = 3; (* 320 x 200 4 Farben Palette 3 *)
- MCGAMed = 4; (* 640 x 200 2 Farben *)
- MCGAHi = 5; (* 640 x 480 2 Farben *)
-
- HercMonoHi = 0; (* 720 x 348 2 Farben *)
-
- ATT400C0 = 0; (* 320 x 200 4 Farben Palette 0 *)
- ATT400C1 = 1; (* 320 x 200 4 Farben Palette 1 *)
- ATT400C2 = 2; (* 320 x 200 4 Farben Palette 2 *)
- ATT400C3 = 3; (* 320 x 200 4 Farben Palette 3 *)
- ATT400Med = 4; (* 640 x 200 2 Farben *)
- ATT400Hi = 5; (* 640 x 400 2 Farben *)
-
- IBM8514Lo = 0; (* 640 x 480 16 Farben *)
- IBM8514Hi = 1; (*1024 x 768 16 Farben *)
-
- PC3270Hi = 0; (* 720 x 350 2 Farben *)
-
- EGALo = 0; (* 640 x 200 16 Farben *)
- EGAHi = 1; (* 640 x 350 16 Farben *)
- EGA64Lo = 0; (* 640 x 200 16 Farben *)
- EGA64Hi = 1; (* 640 x 350 4 Farben *)
- EGAMonoHi = 3; (* 640 x 350 2 Farben *)
- VGALo = 0; (* 640 x 200 16 Farben *)
- VGAMed = 1; (* 640 x 350 16 Farben *)
- VGAHi = 2; (* 640 x 480 16 Farben *)
- (* neu: *)
- EGA320 : BYTE = $FF;
- SVGAHi = 0; (* 800 x 600 16 Farben *)
- (* kartenabhängige Initialisier. *)
-
- LeftText = 0; (* Textausrichtungen *)
- BottomText = 0; (* für SetTextJustify *)
- CenterText = 1;
- RightText = 2;
- TopText = 2;
-
- SolidLn = 0; (* Linientypen *)
- DottedLn = 1;
- CenterLn = 2;
- DashedLn = 3;
- UserBitLn = 4; (* benutzerdef.: SetLineStyle *)
-
- NormWidth = 1; (* Liniendicken *)
- ThickWidth = 3;
-
- DefaultFont = 0; (* 8x8 Bitmusterzeichensatz (ROM)*)
- TriplexFont = 1; (* Vektorzeichensatz Standard TRIP*)
- SmallFont = 2; (* Vektorzeichensatz Standard LCOM*)
- SansSerifFont = 3; (* Vektorzeichensatz Standard SANS*)
- GothicFont = 4; (* Vektorzeichensatz Standard GOTH*)
-
- (* neu: *)
- ScriptFont = 5; (* Vektorzeichensatz Script SCRI*)
- SimplexFont = 6; (* Vektorzeichensatz Simplex SIMP*)
- TSCRFont = 7; (* Vektorzs. Triplex-Script TSCR*)
- LightFont = 8; (* Vektorzs. Triplex-Light LITT*)
- EuroFont = 9; (* Vektorzeichensatz Eurofont EURO*)
-
- (* bold.chr ist bis Turbo Pascal 7 nicht aufgenommen und *)
- (* muß mit RegisterUserFont eingebunden werden. Die Datei *)
- (* kann deshalb auch nicht ins Programm eingelinkt werden *)
-
- HorizDir = 0; (* von links nach rechts *)
- VertDir = 1; (* von unten nach oben *)
- UserCharSize = 0; (* benutzerdef.: SetUserCharSize()*)
- MaxColors = 15; (* vordefinierte Konstante! *)
-
- grOk = 0; (* fehlerfreie Ausführung *)
- grNoInitGraph = -1; (* BGI-Treiber nicht geladen *)
- grNotDetected = -2; (* Grafikkarte nicht erkannt *)
- grFileNotFound = -3; (* Grafiktreiber nicht gefunden *)
- grInvalidDriver= -4; (* Grafiktreiber defekt *)
- grNoLoadMem = -5; (* nicht genug Speicher, um *)
- (* Treiber zu laden *)
- grNoScanMem = -6; (* nicht genug Speicher für *)
- (* Zeichenoperation *)
- grNoFloodMem = -7; (* nicht genug Speicher für Füll- *)
- (* operation *)
- grFontNotFound = -8; (* Fontdatei nicht gefunden *)
- grNoFontMem = -9; (* nicht genug Speicher für Font *)
- grInvalidMode = -10; (* Grafikmodus vom Treiber nicht *)
- (* unterstützt *)
- grError = -11; (* nicht näher klassifizierbarer *)
- (* Fehler *)
- grIOerror = -12; (* Fehler bei Daten-Ein-/Ausgabe *)
- grInvalidFont = -13; (* Zeichensatz-Datei ungültig *)
- grInvalidFontNum=-14; (* Kennziffer für Zeichensatz *)
- (* nicht definiert *)
- (* neu: *)
- grInvalidAttr = -15; (* Ungült. Fontattribut tFontAttr *)
-
- TYPE
- ArcCoordsType = RECORD
- x, y, XStart, YStart, XEnd, YEnd: INTEGER;
- END;
-
- FillPatternType = ARRAY[1..8] OF BYTE;
-
- FillSettingsType = RECORD
- Pattern: WORD;
- Color : WORD;
- END;
-
- LineSettingsType = RECORD
- LineStyle: WORD;
- Pattern : WORD;
- Thickness: WORD;
- END;
-
- PaletteType = RECORD
- Size : BYTE;
- Colors: ARRAY[0..MaxColors] OF SHORTINT;
- END;
-
- PointType = RECORD
- x, y: INTEGER;
- END;
-
- TextSettingsType = RECORD
- Font : WORD;
- Direction: WORD;
- CharSize : WORD;
- Horiz : WORD;
- Vert : WORD;
- END;
-
- ViewPortType = RECORD
- x1, y1, x2, y2: INTEGER;
- Clip : BOOLEAN;
- END;
-
- (* neu: Schriftattribute zusammen mit allen Fonts: *)
- tFontAttr = (Normal, (* Standardschrift *)
- Bold, (* Fettschrift *)
- Shadow, (* Schattenschrift *)
- OutLine); (* Outline-Schrift *)
-
- CONST
- FontAttr : tFontAttr = Normal; (* Schriftattribut *)
- (* Voreinstellung *)
- VAR
- GraphGetMemPtr : POINTER;
- GraphFreeMemPtr: POINTER;
-
- PROCEDURE Arc(x, y: INTEGER; SA, EA, Radius: WORD);
- PROCEDURE Bar(x1, y1, x2, y2 : INTEGER);
- PROCEDURE Bar3D(x1,y1,x2,y2: INTEGER; d: WORD; t: BOOLEAN);
- PROCEDURE Circle(x,y: INTEGER; Radius: WORD);
- PROCEDURE ClearDevice;
- PROCEDURE ClearViewPort;
- PROCEDURE CloseGraph;
- PROCEDURE DetectGraph(VAR GraphDriver, GraphMode: INTEGER);
- PROCEDURE DrawPoly(NumPoints: WORD; VAR PolyPoints);
- PROCEDURE Ellipse(x, y : INTEGER; SA, EA, XR, YR : WORD);
- PROCEDURE FillEllipse(x, y : INTEGER; XR, YR: WORD);
- PROCEDURE FillPoly(NumPoints: WORD; VAR PolyPoints);
- PROCEDURE FloodFill(x, y: INTEGER; Border: WORD);
- PROCEDURE GetArcCoords(VAR ArcCoords: ArcCoordsType);
- PROCEDURE GetAspectRatio(VAR XAsp, YAsp: WORD);
- FUNCTION GetBkColor: WORD;
- FUNCTION GetColor: WORD;
- PROCEDURE GetDefaultPalette(VAR Palette: PaletteType);
- FUNCTION GetDriverName: STRING;
- PROCEDURE GetFillPattern(VAR FillPattern: FillPatternType);
- PROCEDURE GetFillSettings(VAR FillInfo: FillSettingsType);
- FUNCTION GetGraphMode: INTEGER;
- PROCEDURE GetImage(x1, y1, x2, y2: INTEGER; VAR BitMap);
- PROCEDURE GetLineSettings(VAR LineInfo: LineSettingsType);
- FUNCTION GetMaxColor: WORD;
- FUNCTION GetMaxMode: INTEGER;
- FUNCTION GetMaxX: INTEGER;
- FUNCTION GetMaxY: INTEGER;
- FUNCTION GetModeName(ModeNumber: INTEGER): STRING;
- PROCEDURE GetModeRange(GD: INTEGER; VAR Lo, Hi: INTEGER);
- PROCEDURE GetPalette(VAR Palette: PaletteType);
- FUNCTION GetPaletteSize: INTEGER;
- FUNCTION GetPixel(x, y: INTEGER): WORD;
- PROCEDURE GetTextSettings(VAR TextInfo: TextSettingsType);
- PROCEDURE GetViewSettings(VAR ViewPort: ViewPortType);
- FUNCTION GetX: INTEGER;
- FUNCTION GetY: INTEGER;
- PROCEDURE GraphDefaults;
- FUNCTION GraphErrorMsg(ErrorCode: INTEGER): STRING;
- FUNCTION GraphResult: INTEGER;
- FUNCTION ImageSize(x1, y1, x2, y2: INTEGER): WORD;
- PROCEDURE InitGraph(VAR GraphDriver, GraphMode: INTEGER;
- PathToDriver : STRING);
- FUNCTION InstallUserDriver(n: STRING; p: POINTER): INTEGER;
- FUNCTION InstallUserFont(FFName: STRING): INTEGER;
- PROCEDURE Line(x1, y1, x2, y2: INTEGER);
- PROCEDURE LineRel(dx, dy: INTEGER);
- PROCEDURE LineTo(x, y: INTEGER);
- PROCEDURE MoveRel(dx, dy: INTEGER);
- PROCEDURE MoveTo(x, y: INTEGER);
- PROCEDURE OutText(TextString: STRING);
- PROCEDURE OutTextXY(x, y: INTEGER; TextString: STRING);
- PROCEDURE PieSlice (x, y: INTEGER; SA, EA, R: WORD);
- PROCEDURE PutImage (x, y: INTEGER; VAR BM; BitBlt: WORD);
- PROCEDURE PutPixel (x, y: INTEGER; Pixel: WORD);
- PROCEDURE Rectangle(x1, y1, x2, y2: INTEGER);
- FUNCTION RegisterBGIDriver(Driver: POINTER): INTEGER;
- FUNCTION RegisterBGIFont(Font: POINTER): INTEGER;
- PROCEDURE RestoreCrtMode;
- PROCEDURE Sector(x, y: INTEGER; SA, EA, XR, YR: WORD);
- PROCEDURE SetActivePage(Page: WORD);
- PROCEDURE SetAllPalette(VAR Palette);
- PROCEDURE SetAspectRatio(XAsp, YAsp: WORD);
- PROCEDURE SetBkColor(ColorNum: WORD);
- PROCEDURE SetColor(Color: WORD);
- PROCEDURE SetFillPattern(Pat: FillPatternType; Col: WORD);
- PROCEDURE SetFillStyle(Pattern: WORD; Color: WORD);
- PROCEDURE SetGraphBufSize(BufSize: WORD);
- PROCEDURE SetGraphMode(Mode: INTEGER);
- PROCEDURE SetLineStyle(L, P, T: WORD);
- PROCEDURE SetPalette(ColorNum: WORD; Color: SHORTINT);
- PROCEDURE SetRGBPalette(ColorNum, R, G, B: INTEGER);
- PROCEDURE SetTextJustify(Horiz, Vert: WORD);
- PROCEDURE SetTextStyle(Font, Direction, CharSize: WORD);
- PROCEDURE SetUserCharSize(MultX, DivX, MultY, DivY: WORD);
- PROCEDURE SetViewPort(x1,y1, x2,y2: INTEGER; Clip: BOOLEAN);
- PROCEDURE SetVisualPage(Page: WORD);
- PROCEDURE SetWriteMode(WriteMode: INTEGER);
- FUNCTION TextHeight(TextString: STRING): WORD;
- FUNCTION TextWidth(TextString: STRING): WORD;
-
- IMPLEMENTATION
-
- USES
- Dos, Graph;
-
- CONST
- GrafTable: ARRAY[128..255] OF ARRAY[0..7] OF BYTE = (
- (* Der komplette Grafikzeichensatz für die Grafikmodi *)
- (* von Grafikkarten, bei denen er nicht im BIOS liegt. *)
- (* Erspart den Aufruf des Programms Graftabl für die *)
- (* Systemschrift (»DefaultFont«). *)
- ($3C, $66, $60, $66, $3C, $0C, $06, $3C), (* #128 *)
- ($00, $66, $00, $66, $66, $66, $3F, $00), (* #129 *)
- ($0E, $00, $3C, $66, $7E, $60, $3C, $00), (* #130 *)
- ($7E, $C3, $3C, $06, $3E, $66, $3F, $00), (* #131 *)
- ($66, $00, $3C, $06, $3E, $66, $3F, $00), (* #132 *)
- ($70, $00, $3C, $06, $3E, $66, $3F, $00), (* #133 *)
- ($18, $18, $3C, $06, $3E, $66, $3F, $00), (* #134 *)
- ($00, $00, $3C, $60, $60, $3C, $06, $1C), (* #135 *)
- ($7E, $C3, $3C, $66, $7E, $60, $3C, $00), (* #136 *)
- ($66, $00, $3C, $66, $7E, $60, $3C, $00), (* #137 *)
- ($70, $00, $3C, $66, $7E, $60, $3C, $00), (* #138 *)
- ($66, $00, $38, $18, $18, $18, $3C, $00), (* #139 *)
- ($7C, $C6, $38, $18, $18, $18, $3C, $00), (* #140 *)
- ($70, $00, $38, $18, $18, $18, $3C, $00), (* #141 *)
- ($63, $1C, $36, $63, $7F, $63, $63, $00), (* #142 *)
- ($18, $18, $00, $3C, $66, $7E, $66, $00), (* #143 *)
- ($0E, $00, $7E, $30, $3C, $30, $7E, $00), (* #144 *)
- ($00, $00, $7F, $0C, $7F, $CC, $7F, $00), (* #145 *)
- ($1F, $36, $66, $7F, $66, $66, $67, $00), (* #146 *)
- ($38, $66, $00, $3C, $66, $66, $3C, $00), (* #147 *)
- ($00, $66, $00, $3C, $66, $66, $3C, $00), (* #148 *)
- ($00, $70, $00, $3C, $66, $66, $3C, $00), (* #149 *)
- ($3C, $66, $00, $66, $66, $66, $3F, $00), (* #150 *)
- ($00, $70, $00, $66, $66, $66, $3F, $00), (* #151 *)
- ($60, $66, $00, $66, $66, $3E, $06, $7C), (* #152 *)
- ($C3, $18, $3C, $66, $66, $3C, $18, $00), (* #153 *)
- ($66, $00, $66, $66, $66, $66, $3C, $00), (* #154 *)
- ($18, $18, $7E, $C0, $C0, $7E, $18, $18), (* #155 *)
- ($1C, $36, $32, $78, $30, $73, $7E, $00), (* #156 *)
- ($66, $66, $3C, $7E, $18, $7E, $18, $18), (* #157 *)
- ($F8, $CC, $CC, $FA, $C6, $CF, $C6, $C7), (* #158 *)
- ($0E, $1B, $18, $3C, $18, $18, $D8, $70), (* #159 *)
- ($0E, $00, $3C, $06, $3E, $66, $3F, $00), (* #160 *)
- ($1C, $00, $38, $18, $18, $18, $3C, $00), (* #161 *)
- ($00, $0E, $00, $3C, $66, $66, $3C, $00), (* #162 *)
- ($00, $0E, $00, $66, $66, $66, $3F, $00), (* #163 *)
- ($00, $7C, $00, $7C, $66, $66, $66, $00), (* #164 *)
- ($7E, $00, $66, $76, $7E, $6E, $66, $00), (* #165 *)
- ($3C, $6C, $6C, $3E, $00, $7E, $00, $00), (* #166 *)
- ($38, $6C, $6C, $38, $00, $7C, $00, $00), (* #167 *)
- ($18, $00, $18, $30, $60, $66, $3C, $00), (* #168 *)
- ($00, $00, $00, $7E, $60, $60, $00, $00), (* #169 *)
- ($00, $00, $00, $7E, $06, $06, $00, $00), (* #170 *)
- ($C3, $C6, $CC, $DE, $33, $66, $CC, $0F), (* #171 *)
- ($C3, $C6, $CC, $DB, $37, $6F, $CF, $03), (* #172 *)
- ($18, $18, $00, $18, $18, $18, $18, $00), (* #173 *)
- ($00, $33, $66, $CC, $66, $33, $00, $00), (* #174 *)
- ($00, $CC, $66, $33, $66, $CC, $00, $00), (* #175 *)
- ($22, $88, $22, $88, $22, $88, $22, $88), (* #176 *)
- ($55, $AA, $55, $AA, $55, $AA, $55, $AA), (* #177 *)
- ($DB, $77, $DB, $EE, $DB, $77, $DB, $EE), (* #178 *)
- ($18, $18, $18, $18, $18, $18, $18, $18), (* #179 *)
- ($18, $18, $18, $18, $F8, $18, $18, $18), (* #180 *)
- ($18, $18, $F8, $18, $F8, $18, $18, $18), (* #181 *)
- ($36, $36, $36, $36, $F6, $36, $36, $36), (* #182 *)
- ($00, $00, $00, $00, $FE, $36, $36, $36), (* #183 *)
- ($00, $00, $F8, $18, $F8, $18, $18, $18), (* #184 *)
- ($36, $36, $F6, $06, $F6, $36, $36, $36), (* #185 *)
- ($36, $36, $36, $36, $36, $36, $36, $36), (* #186 *)
- ($00, $00, $FE, $06, $F6, $36, $36, $36), (* #187 *)
- ($36, $36, $F6, $06, $FE, $00, $00, $00), (* #188 *)
- ($36, $36, $36, $36, $FE, $00, $00, $00), (* #189 *)
- ($18, $18, $F8, $18, $F8, $00, $00, $00), (* #190 *)
- ($00, $00, $00, $00, $F8, $18, $18, $18), (* #191 *)
- ($18, $18, $18, $18, $1F, $00, $00, $00), (* #192 *)
- ($18, $18, $18, $18, $FF, $00, $00, $00), (* #193 *)
- ($00, $00, $00, $00, $FF, $18, $18, $18), (* #194 *)
- ($18, $18, $18, $18, $1F, $18, $18, $18), (* #195 *)
- ($00, $00, $00, $00, $FF, $00, $00, $00), (* #196 *)
- ($18, $18, $18, $18, $FF, $18, $18, $18), (* #197 *)
- ($18, $18, $1F, $18, $1F, $18, $18, $18), (* #198 *)
- ($36, $36, $36, $36, $37, $36, $36, $36), (* #199 *)
- ($36, $36, $37, $30, $3F, $00, $00, $00), (* #200 *)
- ($00, $00, $3F, $30, $37, $36, $36, $36), (* #201 *)
- ($36, $36, $F7, $00, $FF, $00, $00, $00), (* #202 *)
- ($00, $00, $FF, $00, $F7, $36, $36, $36), (* #203 *)
- ($36, $36, $37, $30, $37, $36, $36, $36), (* #204 *)
- ($00, $00, $FF, $00, $FF, $00, $00, $00), (* #205 *)
- ($36, $36, $F7, $00, $F7, $36, $36, $36), (* #206 *)
- ($18, $18, $FF, $00, $FF, $00, $00, $00), (* #207 *)
- ($36, $36, $36, $36, $FF, $00, $00, $00), (* #208 *)
- ($00, $00, $FF, $00, $FF, $18, $18, $18), (* #209 *)
- ($00, $00, $00, $00, $FF, $36, $36, $36), (* #210 *)
- ($36, $36, $36, $36, $3F, $00, $00, $00), (* #211 *)
- ($18, $18, $1F, $18, $1F, $00, $00, $00), (* #212 *)
- ($00, $00, $1F, $18, $1F, $18, $18, $18), (* #213 *)
- ($00, $00, $00, $00, $3F, $36, $36, $36), (* #214 *)
- ($36, $36, $36, $36, $FF, $36, $36, $36), (* #215 *)
- ($18, $18, $FF, $18, $FF, $18, $18, $18), (* #216 *)
- ($18, $18, $18, $18, $F8, $00, $00, $00), (* #217 *)
- ($00, $00, $00, $00, $1F, $18, $18, $18), (* #218 *)
- ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF), (* #219 *)
- ($00, $00, $00, $00, $FF, $FF, $FF, $FF), (* #220 *)
- ($F0, $F0, $F0, $F0, $F0, $F0, $F0, $F0), (* #221 *)
- ($0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F), (* #222 *)
- ($FF, $FF, $FF, $FF, $00, $00, $00, $00), (* #223 *)
- ($00, $00, $3B, $6E, $64, $6E, $3B, $00), (* #224 *)
- ($00, $3C, $66, $7C, $66, $7C, $60, $60), (* #225 *)
- ($00, $7E, $66, $60, $60, $60, $60, $00), (* #226 *)
- ($00, $7F, $36, $36, $36, $36, $36, $00), (* #227 *)
- ($7E, $66, $30, $18, $30, $66, $7E, $00), (* #228 *)
- ($00, $00, $3F, $6C, $6C, $6C, $38, $00), (* #229 *)
- ($00, $33, $33, $33, $33, $3E, $30, $60), (* #230 *)
- ($00, $3B, $6E, $0C, $0C, $0C, $0C, $00), (* #231 *)
- ($7E, $18, $3C, $66, $66, $3C, $18, $7E), (* #232 *)
- ($1C, $36, $63, $7F, $63, $36, $1C, $00), (* #233 *)
- ($1C, $36, $63, $63, $36, $36, $77, $00), (* #234 *)
- ($0E, $18, $0C, $3E, $66, $66, $3C, $00), (* #235 *)
- ($00, $00, $7E, $DB, $DB, $7E, $00, $00), (* #236 *)
- ($06, $0C, $7E, $DB, $DB, $7E, $60, $C0), (* #237 *)
- ($1C, $60, $C0, $FC, $C0, $60, $1C, $00), (* #238 *)
- ($3C, $66, $66, $66, $66, $66, $66, $00), (* #239 *)
- ($00, $7E, $00, $7E, $00, $7E, $00, $00), (* #240 *)
- ($18, $18, $7E, $18, $18, $00, $7E, $00), (* #241 *)
- ($30, $18, $0C, $18, $30, $00, $7E, $00), (* #242 *)
- ($0C, $18, $30, $18, $0C, $00, $7E, $00), (* #243 *)
- ($0E, $1B, $1B, $18, $18, $18, $18, $18), (* #244 *)
- ($18, $18, $18, $18, $18, $D8, $D8, $70), (* #245 *)
- ($18, $18, $00, $7E, $00, $18, $18, $00), (* #246 *)
- ($00, $76, $DC, $00, $76, $DC, $00, $00), (* #247 *)
- ($38, $6C, $6C, $38, $00, $00, $00, $00), (* #248 *)
- ($00, $00, $00, $18, $18, $00, $00, $00), (* #249 *)
- ($00, $00, $00, $00, $18, $00, $00, $00), (* #250 *)
- ($0F, $0C, $0C, $0C, $EC, $6C, $3C, $1C), (* #251 *)
- ($78, $6C, $6C, $6C, $6C, $00, $00, $00), (* #252 *)
- ($70, $18, $30, $60, $78, $00, $00, $00), (* #253 *)
- ($00, $00, $3C, $3C, $3C, $3C, $00, $00), (* #254 *)
- ($00, $00, $00, $00, $00, $00, $00, $00)); (* #255 *)
-
- ModeTableBufSize: WORD = $FFF0;(* 64 kByte großer Puffer*)
-
- VGAPalette : PaletteType = ( (* Standard-VGA-Palette; *)
- Size : 16; (* hier nach Belieben ändern *)
- Colors: (EGABlack, EGABlue, EGAGreen, EGACyan,
- EGARed, EGAMagenta, EGABrown,
- EGALightgray, EGADarkgray,
- EGALightBlue, EGALightGreen,
- EGALightcyan, EGALightRed,
- EGALightMagenta, EGAYellow, EGAWhite));
-
- PatchExtDrv : BOOLEAN = TRUE; (* Ext.-/Int.-Patch *)
- AlreadyPatched: BOOLEAN = FALSE;
- CharSetted : BOOLEAN = FALSE;
- ScreenDriver : INTEGER = Detect; (* globale Variab- *)
- ScreenMode : BYTE = $00; (* len in der Unit *)
- SVGACard : BYTE = $FF;
- Result : INTEGER = $00;
- SVGAMode : BYTE = SVGAHi;
- InitMode : BYTE = $03;
- Int1FSave : POINTER = NIL;
- SVGADriverPtr : POINTER = NIL;
- SVGADriverName: STRING[8] = 'SVGA'; (* Treiber-ID *)
-
- (* Liste der unterstützten Grafikkarten, u.a. bei der *)
- (* Autodetect-Routine verwendet. Die Reihenfolge darf *)
- (* nicht geändert werden. Zusätzliche Karten müssen an- *)
- (* gehängt und die Konstante »SumOfCards« entsprechend *)
- (* angepaßt werden: *)
- ET3000 = $00; (* Tseng ET 3000, Sigma ... *)
- ET4000 = $01; (* Tseng ET 4000, Sigma ... *)
- Paradise = $02; (* Paradise Professional, WD *)
- Trident = $03; (* Trident-Chipsatz *)
- Oak = $04; (* OTI-Chipsatz (OAK-Karte) *)
- Video7 = $05; (* Video Seven VRAM *)
- Genoa = $06; (* Genoa HiRES EGA, VGA+ *)
- ATI = $07; (* ATI VGA Wonder *)
- VESA = $08; (* VESA-Standard *)
- Tecmar = $09; (* Tecmar-BIOS *)
- ATTVGA = $0A; (* AT&T-BIOS *)
- (* weitere Karten hier entsprechend ergänzen (!!!) *)
- SumOfCards = ATTVGA; (* nach Ergänzungen anpassen (!!!) *)
-
- (* Für GetModeName zur Identifizierung der Karte: *)
- SVGAModeID: ARRAY[0..SumOfCards] OF STRING[22] = (
- '800 x 600 Tseng ET3000', (* 0 *)
- '800 x 600 Tseng ET4000', (* 1 *)
- '800x600 Paradise SVGA', (* 2 *)
- '800 x 600 Trident SVGA', (* 3 *)
- '800 x 600 OAK Chipset', (* 4 *)
- '800 x 600 Video Seven', (* 5 *)
- '800 x 600 Genoa VGA+', (* 6 *)
- '800x600 ATI VGA-Wonder', (* 7 *)
- '800x600 VESA Standard', (* mit Treiber !!! *) (* 8 *)
- '800 x 600 Tecmar SVGA', (* 9 *)
- '800x600 AT&T/Olivetti'); (* 10 *)
- (* hier entsprechend für weitere Karten ergänzen (!!!) *)
-
- (* X-Auflösung des mit SVGAInit eingestellten Modus: *)
- SVGAResX: ARRAY[0..SumOfCards] OF WORD = (
- 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799);
- (* Für andere Auflösungen entsprechend anpassen (!!!) *)
-
- (* Y-Auflösung des mit SVGAInit eingestellten Modus: *)
- SVGAResY: ARRAY[0..SumOfCards] OF WORD = (
- 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599);
- (* Für andere Auflösungen entsprechend anpassen (!!!) *)
-
- (* Aspectratio (Wert für X-Achse, Y = 1000) für 800*600 *)
- SVGAAspect: ARRAY[0..SumOfCards] OF WORD = (7000, 7000,
- 7000, 7000, 7000, 7000, 7000, 7000, 7000, 7000, 7000);
- (* Für andere Auflösungen entsprechend anpassen (!!!) *)
-
- SVGAInit: ARRAY[0..SumOfCards] OF BYTE = (
- (* Der Initalisierungswert (AL) für den Modus 800x600 *)
- $29, $29, $58, $5B, $52, $62, $79, $54, $6A, $16, $47);
-
- SVGAID: ARRAY[0..SumOfCards + 2] OF STRING[11] = (
- 'TSENG LAB', 'TSENG LAB', 'PARADISE', 'TRIDENT',
- 'OAK', 'VIDEO SEVEN', 'GENOA', '761295520'
- (* <- ATI *), 'VESA', 'TECMAR', 'OLIVETTI',
- (* hier ergänzen !!! *) 'WESTERN', 'SIGMA');
-
- BGIFileLen = 5363; (* Größe von »svga.bgi« = gepachter *)
- (* »egavga.bgi« von Turbo Pascal 5.0 *)
-
- GraphInitDone: BOOLEAN = FALSE; (* wurde InitGraph() *)
- (* bereits aufgerufen? *)
- VAR
- OrgExitProc: POINTER;
- Buffer : ARRAY[0..Pred(BGIFileLen)] OF CHAR;
- (* Filebuffer für Blockread(BGIFile) *)
- Regs : Registers;
-
- (*========================================================*)
- (* Alle Prozeduren und Funktionen rufen die Routinen der *)
- (* Unit GRAPH auf. Eventuelle Änderungen und Ergänzungen *)
- (* können direkt in diesen Dummies vorgenommen werden: *)
-
- (* Ein ordentlicher Ausstieg falls noch im Grafikmodus: *)
- PROCEDURE GraphExitProc;
- BEGIN
- IF BYTE(Ptr($0040, $0049)^) <> InitMode THEN CloseGraph;
- IF CharSetted THEN SetIntVec($1F, Int1FSave);
- ExitProc := OrgExitProc;
- Halt(ExitCode);
- END;
-
- PROCEDURE Arc(x, y : INTEGER; SA, EA, Radius: WORD);
- BEGIN Graph.Arc(x,y, SA, EA, Radius); END;
-
- PROCEDURE Bar(x1, y1, x2, y2: INTEGER);
- BEGIN Graph.Bar(x1, y1, x2, y2); END;
-
- PROCEDURE Bar3D(x1,y1,x2,y2: INTEGER; d: WORD; t: BOOLEAN);
- BEGIN Graph.Bar3D(x1, y1, x2, y2, d, t); END;
-
- PROCEDURE Circle(x, y: INTEGER; Radius: WORD);
- BEGIN Graph.Circle(x, y, Radius); END;
-
- PROCEDURE ClearDevice;
- BEGIN Graph.ClearDevice; END;
-
- PROCEDURE ClearViewPort;
- BEGIN Graph.ClearViewPort; END;
-
- PROCEDURE CloseGraph;
- BEGIN
- IF ScreenDriver = SVGA THEN BEGIN
- Regs.AL := InitMode;
- Regs.AH := 0;
- Intr($10, Regs);
- END ELSE
- Graph.CloseGraph;
- (* Falls der Zeichensatz geändert wurde, Zeiger zurück: *)
- IF CharSetted THEN SetIntVec($1F, Int1FSave);
- END;
-
- (* Ermittlung der (Standard-)Grafikkarte. Im Gegensatz zu *)
- (* Graph.Detectgraph findet keine Überprüfung auf MDA/ *)
- (* Hercules statt, allerdings wird IBM8514 erkennt. *)
- PROCEDURE Autodetect(VAR GD, GM: INTEGER);
- VAR
- Dummy: BYTE;
- Int7F: POINTER;
- Int1F: POINTER;
- BEGIN
- GetIntVec($7F, Int7F);
- IF LONGINT(Int7F) <> 0 THEN GD := IBM8514 (*8514/A Interface*)
- ELSE WITH Regs DO BEGIN
- GD := grNotDetected;
- AL := BYTE(Ptr($0040, $0049)^);
- AH := $0F;
- Intr($10, Regs);
- IF AL = $07 THEN GD := HercMono ELSE BEGIN
- GetIntVec($1F, Int1F);
- IF Seg(Int1F) > $B000 THEN BEGIN
- AL := $06; (* Zeichensatz im ROM *)
- CX := $00;
- dx := $00;
- AH := $30; (* undokumentiert! *)
- Intr($10, Regs);
- AX := CX;
- IF AX = dx THEN AX := 0;
- DS := CX;
- BX := dx;
- AL := BYTE(Ptr(DS, BX + 2)^);
- AL := AL OR AL;
- IF fZero AND 1 = 1 THEN BEGIN
- IF Port[$0188] = $04 THEN GD := PC3270
- ELSE GD := CGA
- END ELSE GD := CGA;
- END ELSE BEGIN
- AX := $0010;
- Intr($10, Regs);
- IF BYTE(Ptr($0040, $0049)^) <> $10 THEN
- GD := CGA (* EGA in CGA-Emulation *)
- ELSE BEGIN
- AL := InitMode;
- AH := 0;
- Intr($10, Regs);
- AX := $1200;
- BL := $10;
- BH := $FF;
- CL := $0C;
- Intr($10, Regs);
- IF BH = $01 THEN GD := EGAMono
- ELSE BEGIN
- IF BL < $03 THEN GD := EGA64
- ELSE BEGIN
- AH := $1A;
- AL := $00;
- BL := $34;
- Intr($10, Regs);
- IF AL <> $1A THEN GD := EGA ELSE CASE BL OF
- $00: GD := grNotDetected; (* kein Monitor! *)
- $01: GD := HercMono;(* Emulation / PS2 *)
- $02: GD := CGA; (* Emulation / PS2 *)
- $04: GD := EGA; (* Emulation / PS2 *)
- $05: GD := EGAMono; (* Emulation / PS2 *)
- $06: GD := EGA; (* Emulation / PS2 *)
- $07: GD := EGAMono; (* Emulation / PS2 *)
- $08: GD := VGA;
- $0A: GD := EGA; (* Emulation / PS2 *)
- $0B: GD := MCGA; (* Mono-Display *)
- $0C: GD := MCGA; (* Color-Display *)
- $FF: GD := grNotDetected; (* unbekannt! *)
- END
- END
- END
- END
- END;
- END;
- IF GD = CGA THEN BEGIN
- Dummy := BYTE(Ptr($0040, $0049)^);
- AX := $0048;
- Intr($10, Regs);
- IF BYTE(Ptr($0040, $0049)^) = $48 THEN BEGIN
- AL := Dummy;
- Intr($10, Regs);
- GD := ATT400;
- END ELSE GD := CGA;
- END;
- END;
- CASE GD OF
- CGA : GM := CGAHi;
- MCGA : GM := MCGAHi;
- EGA : GM := EGAHi;
- EGA64 : GM := EGA64Hi;
- EGAMono : GM := EGAMonoHi;
- IBM8514 : GM := IBM8514Hi;
- HercMono: GM := HercMonoHi;
- ATT400 : GM := ATT400Hi;
- VGA : GM := VGAHi;
- PC3270 : GM := PC3270Hi;
- SVGA : GM := SVGAHi;
- END;
- ScreenDriver := GD;
- END;
-
- PROCEDURE DetectGraph(VAR GraphDriver, GraphMode: INTEGER);
- (* ------------------------------------------------------ *)
- (* Erweitert: Ermittelt bei VGA-Karten ob es sich um eine *)
- (* dem System bekannte SVGA-Karte handelt. Falls ja, wird *)
- (* versucht, die Karte zu ermitteln und dann 800x600 *)
- (* initialisiert. *)
- (* Bleibt die Suche nach der Karte erfolglos (StandardVGA *)
- (* oder unbekannte Karte), wird als Treiber in VGA zurück-*)
- (* geschaltet und VGAHi als Bildschirmauflösung gewählt. *)
- (* ------------------------------------------------------ *)
- TYPE
- NullStr = ARRAY[0..254] OF CHAR;
- VAR
- CardBIOS: NullStr ABSOLUTE $C000:$0005;
- B, t : BYTE;
- s : STRING;
-
- FUNCTION CheckIntr(InitCode: BYTE): BYTE;
- (* Interruptaufruf überprüfen. Es wird nur getestet, ob *)
- (* die Karte den entsprechenden Aufruf durchführt und *)
- (* nicht, ob das auch der richtige Modus ist (Über- *)
- (* schneidungen bei den Sondermodi diverser Karten!) *)
- VAR
- drv,
- InitMode: BYTE;
- BEGIN
- InitMode := BYTE(Ptr($0040, $0049)^);
- Regs.AH := 0;
- Regs.AL := InitCode;
- Intr($10, Regs);
- IF BYTE(Ptr($0040, $0049)^) = InitCode THEN BEGIN
- drv := InitCode;
- Regs.AL := InitMode;
- Regs.AH := 0;
- Intr($10, Regs);
- END ELSE drv := $FF;
- CheckIntr := drv;
- END;
-
- FUNCTION CheckSVGADriver: INTEGER;
- VAR
- GraphDriver: INTEGER;
-
- FUNCTION ReadBIOS: BYTE; (* im BIOS Copyright suchen *)
- VAR
- s : STRING;
- B : BYTE;
- BEGIN
- s[0] := #255;
- FOR B := 1 TO 255 DO s[B] := UpCase(CardBIOS[B - 1]);
- FOR B := 0 TO SumOfCards + 2 DO
- IF Pos(SVGAID[B], s) > 0 THEN BEGIN
- ReadBIOS := B;
- IF B = Succ(SumOfCards) THEN B := Paradise;
- IF B = SumOfCards + 2 THEN B := ET3000;
- IF (B = ET3000) AND (Port[$3CD] AND $C0 = 0) THEN
- B := ET4000; (* Test, ob es eine ET4000 ist *)
- ReadBIOS := B;
- Exit;
- END;
- IF B > SumOfCards + 2 THEN
- ReadBIOS := VGA; (* Karte nicht erkannt (!) *)
- END;
-
- BEGIN
- Regs.AX := $1A00;
- Intr($10, Regs);
- IF Regs.AL = $1A THEN BEGIN
- Regs.AX := $6F00;
- Regs.BX := $0000;
- Intr($10, Regs);
- IF Regs.BX = $5637 (* 'V7' *) THEN GraphDriver := Video7
- ELSE BEGIN
- (* VESA-Überprüfung: daß der Aufruf mit 6Ah klappt *)
- (* (beispielsweise BOCA mit ET4000) heißt noch lange *)
- (* nicht, daß es eine VESA-kompatible Karte ist bzw. *)
- (* bei älteren Karten der VESA-Gerätetreiber in der *)
- (* »config.sys« einbunden ist *)
- Regs.AX := $4F00;
- Intr($10, Regs);
- END;
- IF Lo(Regs.AX) = $4F THEN
- IF (Chr(BYTE(Ptr(Regs.ES, Regs.DI)^ )) = 'V') AND
- (Chr(BYTE(Ptr(Regs.ES, Regs.DI+1)^)) = 'E') AND
- (Chr(BYTE(Ptr(Regs.ES, Regs.DI+2)^)) = 'S') AND
- (Chr(BYTE(Ptr(Regs.ES, Regs.DI+3)^)) = 'A') THEN
- GraphDriver := VESA
- ELSE
- GraphDriver := ReadBIOS (* keine VESA-ID: *)
- ELSE (* BIOS-Copyright suchen *)
- GraphDriver := ReadBIOS;
- END; (* sonst das BIOS-Copyright suchen *)
- IF GraphDriver = VGA THEN WITH Regs DO BEGIN
- (* letzter Check auf AT&T VDC600 / Paradise VGA *)
- AX := $007F; (* get current mode *)
- BH := $02; (* query mode *)
- Intr($10, Regs);
- IF AL = $7F THEN GraphDriver := ATTVGA ELSE
- IF BH = $7F THEN GraphDriver := Paradise
- ELSE GraphDriver := VGA;
- END;
- CheckSVGADriver := GraphDriver;
- END;
-
- BEGIN
- IF GraphDriver IN [CGA..PC3270] THEN
- ScreenDriver := GraphDriver
- ELSE
- Autodetect(GraphDriver, GraphMode);
-
- IF GraphDriver = EGA THEN BEGIN
- FOR B := 1 TO 255 DO s[B] := UpCase(CardBIOS[Pred(B)]);
- IF Pos(SVGAID[Genoa], s) > 0 THEN BEGIN
- GraphDriver := SVGA; (* Genoa HiRes mit *)
- GraphMode := SVGAHi; (* 800x600 als VGA *)
- SVGAMode := SVGAInit[Genoa];
- END; (* initialisieren *)
- END;
-
- IF GraphDriver = VGA THEN BEGIN
- GraphDriver := CheckSVGADriver;
- IF GraphDriver <> VGA THEN BEGIN
- SVGACard := GraphDriver; (* ok, SVGA-Karte *)
- IF GraphDriver IN [ET3000..SumOfCards] THEN BEGIN
- SVGAMode := SVGAInit[GraphDriver];
- GraphDriver := SVGA; (* vorerst ist *)
- ScreenDriver := GraphDriver;
- END ELSE BEGIN
- GraphDriver := VGA; (* unbekannte Karten auf *)
- GraphMode := VGAHi; (* VGA runterdrücken und *)
- ScreenDriver := VGA; (* dann raus! *)
- Exit;
- END;
- END;
-
- IF SVGAMode <> CheckIntr(SVGAMode) THEN BEGIN
- GraphDriver := VGA; (* letzter Test gescheitert! *)
- GraphMode := VGAHi; (* die Karte kannte den Modus *)
- END; (* nicht! *)
- END;
-
- ScreenDriver := GraphDriver; (* wird noch gebraucht ... *)
- END;
-
-
- PROCEDURE DrawPoly(NumPoints: WORD; VAR PolyPoints);
- BEGIN Graph.DrawPoly(NumPoints, PolyPoints); END;
-
- PROCEDURE Ellipse(x, y: INTEGER; SA, EA, XR, YR : WORD);
- BEGIN Graph.Ellipse(x, y, SA, EA, XR, YR); END;
-
- PROCEDURE FillEllipse(x, y: INTEGER; XR, YR : WORD);
- BEGIN Graph.FillEllipse(x,y, XR, YR); END;
-
- PROCEDURE FillPoly(NumPoints: WORD; VAR PolyPoints);
- BEGIN Graph.FillPoly(NumPoints, PolyPoints); END;
-
- PROCEDURE FloodFill(x, y: INTEGER; Border: WORD);
- BEGIN Graph.FloodFill(x, y, Border); END;
-
- PROCEDURE GetArcCoords(VAR ArcCoords: ArcCoordsType);
- BEGIN
- Graph.GetArcCoords(Graph.ArcCoordsType(ArcCoords));
- END;
-
- PROCEDURE GetAspectRatio(VAR XAsp, YAsp: WORD);
- BEGIN Graph.GetAspectRatio(XAsp, YAsp); END;
-
- FUNCTION GetBkColor: WORD;
- BEGIN GetBkColor := Graph.GetBkColor; END;
-
- FUNCTION GetColor: WORD;
- BEGIN GetColor := Graph.GetColor; END;
-
- PROCEDURE GetDefaultPalette(VAR Palette: PaletteType);
- BEGIN
- Graph.GetDefaultPalette(Graph.PaletteType(Palette));
- END;
-
- FUNCTION GetDriverName: STRING;
- BEGIN
- IF ScreenDriver = SVGA THEN
- GetDriverName := SVGADriverName
- ELSE
- GetDriverName := Graph.GetDriverName;
- END;
-
- PROCEDURE GetFillPattern(VAR FillPattern: FillPatternType);
- BEGIN
- Graph.GetFillPattern(Graph.FillPatternType(FillPattern));
- END;
-
- PROCEDURE GetFillSettings(VAR FillInfo: FillSettingsType);
- BEGIN
- Graph.GetFillSettings(Graph.FillSettingsType(FillInfo));
- END;
-
- FUNCTION GetGraphMode: INTEGER;
- BEGIN
- IF ScreenDriver = SVGA THEN
- GetGraphMode := SVGAHi
- ELSE
- GetGraphMode := Graph.GetGraphMode;
- END;
-
- PROCEDURE GetImage(x1, y1, x2, y2: INTEGER; VAR BitMap);
- BEGIN Graph.GetImage(x1, y1, x2, y2, BitMap); END;
-
- PROCEDURE GetLineSettings(VAR LineInfo: LineSettingsType);
- BEGIN
- Graph.GetLineSettings(Graph.LineSettingsType(LineInfo));
- END;
-
- FUNCTION GetMaxColor: WORD;
- BEGIN GetMaxColor := Graph.GetMaxColor; END;
-
- FUNCTION GetMaxMode: INTEGER;
- BEGIN
- IF ScreenDriver = SVGA THEN GetMaxMode := SVGAHi
- ELSE GetMaxMode := Graph.GetMaxMode;
- END;
-
- FUNCTION GetMaxX: INTEGER;
- BEGIN GetMaxX := Graph.GetMaxX; END;
-
- FUNCTION GetMaxY: INTEGER;
- BEGIN GetMaxY := Graph.GetMaxY; END;
-
- FUNCTION GetModeName(ModeNumber: INTEGER): STRING;
- (* Im Gegensatz zur Original-Funktion werden Leerzeichen *)
- (* am Ende des Namens entfernt! *)
- VAR
- ModeName: STRING;
- BEGIN
- ModeName := Graph.GetModeName(ModeNumber);
- WHILE ModeName[Length(ModeName)] = #32 DO
- Delete(ModeName, Length(ModeName), 1);
- GetModeName := ModeName;
- END;
-
- PROCEDURE GetModeRange(GD: INTEGER; VAR Lo, Hi: INTEGER);
- BEGIN
- IF GD = CurrentDriver THEN
- IF ScreenDriver = SVGA THEN GD := SVGA;
- IF GD = SVGA THEN BEGIN
- Lo := SVGAHi; (* es steht nur ein *)
- Hi := SVGAHi; (* Modus zur Verfügung *)
- END ELSE
- Graph.GetModeRange(GD, Lo, Hi);
- END;
-
- PROCEDURE GetPalette(VAR Palette: PaletteType);
- BEGIN Graph.GetPalette(Graph.PaletteType(Palette)); END;
-
- FUNCTION GetPaletteSize:INTEGER;
- BEGIN GetPaletteSize := Graph.GetPaletteSize; END;
-
- FUNCTION GetPixel(x, y: INTEGER): WORD;
- BEGIN GetPixel := Graph.GetPixel(x, y); END;
-
- PROCEDURE GetTextSettings(VAR TextInfo: TextSettingsType);
- BEGIN
- Graph.GetTextSettings(Graph.TextSettingsType(TextInfo));
- END;
-
- PROCEDURE GetViewSettings(VAR ViewPort: ViewPortType);
- BEGIN
- Graph.GetViewSettings(Graph.ViewPortType(ViewPort));
- END;
-
- FUNCTION GetX: INTEGER; BEGIN GetX := Graph.GetX; END;
-
- FUNCTION GetY: INTEGER; BEGIN GetY := Graph.GetY; END;
-
- PROCEDURE GraphDefaults; BEGIN Graph.GraphDefaults; END;
-
- FUNCTION GraphErrorMsg(ErrorCode: INTEGER): STRING;
- VAR
- m : STRING;
- BEGIN
- CASE ErrorCode OF
- grOk : m := 'Kein Fehler';
- grNoInitGraph : m := 'BGI-Grafik nicht installiert';
- grNotDetected : m := 'Grafikhardware nicht ermittelt';
- grFileNotFound : m := 'Grafiktreiber nicht gefunden';
- grInvalidDriver : m := 'Falsches Grafiktreiberformat';
- grNoLoadMem : m := 'Nicht genug Speicher um '
- + 'Treiber zu laden';
- grNoScanMem : m := 'Speichermangel bei Scan-Fill';
- grNoFloodMem : m := 'Speichermangel bei Floodfill';
- grFontNotFound : m := 'Fontdatei nicht gefunden';
- grNoFontMem : m := 'Nicht genug Speicher um Font'
- + ' zu laden';
- grInvalidMode : m := 'Falscher Grafikmodus für den '
- + 'ausgewählten Treiber';
- grError : m := 'Allgemeiner Grafikfehler';
- grIOerror : m := 'Graphik-Ein-/Ausgabefehler';
- grInvalidFont : m := 'Falsche Fontdatei';
- grInvalidFontNum: m := 'Falsche Fontnummer';
- grInvalidAttr : m := 'Unbekanntes Schriftattribut';
- ELSE m := 'Unerwarteter Fehler im Modul '
- + 'XGraph'; (* nicht bei Borland *)
- END;
- GraphErrorMsg := m + '.';
- END;
-
- FUNCTION GraphResult: INTEGER;
- BEGIN
- IF Result = 0 THEN GraphResult := Graph.GraphResult
- ELSE BEGIN
- GraphResult := Result;
- Result := 0;
- END;
- END;
-
- FUNCTION ImageSize(x1, y1, x2, y2: INTEGER): WORD;
- BEGIN ImageSize := Graph.ImageSize(x1, y1, x2, y2); END;
-
- PROCEDURE PatchBGI(VAR GraphDriver : INTEGER;
- ModeNo : BYTE;
- PathToDriver: STRING;
- VAR GraphError : INTEGER);
- (* Anpassen des Treibers SVGA.BGI zur Laufzeit an die *)
- (* momentan im Rechner befindliche Karte. Die Routine *)
- (* macht SVGA.BGI grafikkartenunabhängig (soweit das *)
- (* System die Karte kennt). SVGA.BGI ist ein gepatchter *)
- (* EGAVGA.BGI von Turbo Pascal 5.0 und ist auch mit Turbo *)
- (* Pascal 5.5 und 6.0 sowie 7.0 im Real-Mode verwendbar. *)
-
- CONST
- ModeTableW1 = $2328; (* Adressen der Tabellen, *)
- ModeTableW2 = $1B58; (* (fix, nicht ändern!!! *)
- ModeTableW3 = $0808; (* Diese Werte dürfen *)
- ModeTableColor = $9090; (* nicht geändert werden *)
- BgiExt = '.BGI';
- FilesOnly = Anyfile - Directory - VolumeID;
-
- TYPE
- tModeTable = RECORD
- Nuls : WORD;
- x1, y1 : WORD;
- x2, y2 : WORD;
- w1, w2 : WORD;
- Aspect : WORD;
- w3 : WORD;
- ColorMode : WORD;
- END;
-
- tBgi = RECORD
- id, BackSpaces : ARRAY[1..2] OF CHAR;
- Copyright : ARRAY[1..95] OF CHAR;
- CtrlZ : BYTE;
- HeaderLength,
- DriverNo,
- CodeLength : WORD;
- Version1 : ARRAY[1..2] OF WORD;
- FillBytes0 : ARRAY[1..18] OF BYTE;
- StartOffset,
- GraphDriverNo,
- FileLength : WORD;
- Version2 : ARRAY[1..2] OF WORD;
- DriverName : STRING[4]; (*SVGA*)
- UnusedBytesName : ARRAY[1..2] OF BYTE;
- RelocateBytes : ARRAY[1..15] OF BYTE;
- FuncDispatch : ARRAY[1..12] OF BYTE;
- InitID : ARRAY[1..2] OF CHAR;
- FillNuls : WORD;
- Emulate_RET : BYTE;
- GraphCallDummy : LONGINT;
- None_Return : BYTE;
- FuncVectorTable : ARRAY[1..46] OF WORD; (* Funktionen *)
- Code3 : ARRAY[1..358] OF BYTE;
- Palette : ARRAY[0..3] OF PaletteType;
- Code4 : ARRAY[1..31] OF WORD;
- Filler0 : ARRAY[1..7] OF BYTE;
- Nulls : ARRAY[1..17] OF BYTE;
- Modes : WORD;
- SVGAIDString : STRING[22];
- KilledIDStrings : ARRAY[1..42] OF CHAR;
- ModeTablAdr : ARRAY[0..3] OF WORD;
- ModeTab : ARRAY[0..3] OF tModeTable;
- What3 : WORD;
- SetModeAdrs : ARRAY[1..4] OF WORD;
- InitGraphCode : ARRAY[1..445] OF BYTE;
- MaxX1, MaxY1 : WORD;
- SavTable1 : ARRAY[1..11] OF BYTE;
- SavSeg : WORD;
- SavMode : BYTE;
- Code5 : ARRAY[1..8] OF BYTE;
- Mul801A : ARRAY[1..4] OF BYTE;
- Cols7 : BYTE;
- Mul801B : ARRAY[1..9] OF BYTE;
- MoveCode : ARRAY[1..23] OF BYTE;
- DummyCode : BYTE;
- MaxY2 : WORD;
- Code6, ModeNo1 : BYTE;
- Code7 : ARRAY[1..4] OF BYTE;
- Cols1 : BYTE;
- Code8 : ARRAY[1..2] OF BYTE;
- BufSize1 : WORD;
- Code9 : ARRAY[1..3] OF BYTE;
- MaxY3 : WORD;
- Code10, ModeNo2,
- Code11 : BYTE;
- BufSize2 : WORD;
- Code12 : ARRAY[1..3] OF BYTE;
- MaxY4 : WORD;
- Code13, ModeNo3 : BYTE;
- Code14 : ARRAY[1..3] OF BYTE;
- MaxY5 : WORD;
- Code15, ModeNo4 : BYTE;
- Code16 : ARRAY[1..3] OF BYTE;
- MaxY6 : WORD;
- Code17, ModeNo5,
- Code18 : BYTE;
- BufSize3 : WORD;
- Code19 : ARRAY[1..3] OF BYTE;
- BufSize4 : WORD;
- Code20 : ARRAY[1..4] OF BYTE;
- Cols2 : BYTE;
- Code21 : ARRAY[1..5] OF BYTE;
- MaxX2 : WORD;
- Code22 : ARRAY[1..5] OF BYTE;
- MaxX3 : WORD;
- Code23 : ARRAY[1..70] OF BYTE;
- Segment1 : WORD;
- Code24 : ARRAY[1..196] OF BYTE;
- Mul802A : ARRAY[1..4] OF BYTE;
- Cols8 : BYTE;
- Mul802B : ARRAY[1..11] OF BYTE;
- Code25 : ARRAY[1..82] OF BYTE;
- Cols3 : BYTE;
- Code26 : ARRAY[1..70] OF BYTE;
- Cols4 : BYTE;
- Code27 : ARRAY[1..53] OF BYTE;
- Cols5 : BYTE;
- Code28 : ARRAY[1..69] OF BYTE;
- Cols6 : BYTE;
- Code29 : ARRAY[1..3060] OF BYTE;
- MaxY7 : WORD;
- Code30 : ARRAY[1..5] OF BYTE;
- JNB2JMP : BYTE;
- RestOfCode : ARRAY[1..202] OF BYTE;
- END;
-
- VAR
- fm, B : BYTE;
- BGIFileName: STRING[79];
- BGIFile : FILE;
- ReadRes : WORD;
- BGI : tBgi ABSOLUTE Buffer;
- ModeTable : tModeTable;
- ModeStr : STRING[22];
- sr : SearchRec;
-
- PROCEDURE PatchDriver(Mode: BYTE);
- VAR (* hier geht's zur Sache *)
- s : STRING[4];
- x : INTEGER;
- Init, i : BYTE;
- Ratio,
- ResX,
- ResY : WORD;
-
- {$IFDEF WriteBGI}
- PROCEDURE WriteBGI2Disk; (* Speichert die gepatchte *)
- VAR (* Datei in das aktuelle *)
- f: File; (* Verzeichnis *)
- BEGIN
- Assign(f, 'SVGA.BGI');
- ReWrite(f, 1);
- BlockWrite(f, Buffer, BGIFileLen);
- Close(f);
- END;
- {$ENDIF}
-
- BEGIN
- Ratio := SVGAAspect[SVGACard];
- Init := SVGAInit [SVGACard];
- ResX := SVGAResX [SVGACard];
- ResY := SVGAResY [SVGACard];
- ModeStr := SVGAModeID[SVGACard];
- WITH BGI DO BEGIN
- WITH ModeTable DO BEGIN
- Nuls := $00;
- x1 := ResX;
- x2 := ResX;
- y1 := ResY;
- y2 := ResY;
- Aspect := Ratio;
- w1 := ModeTableW1;
- w2 := ModeTableW2;
- w3 := ModeTableW3;
- ColorMode := ModeTableColor;
- END;
-
- MaxX1 := ResX;
- MaxX2 := ResX;
- MaxX3 := ResX;
-
- MaxY1 := ResY;
- MaxY2 := ResY;
- MaxY3 := ResY;
- MaxY4 := ResY;
- MaxY5 := ResY;
- MaxY6 := ResY;
- MaxY7 := ResY;
-
- ModeTab[0] := ModeTable;
-
- BufSize1 := ModeTableBufSize;
- BufSize2 := ModeTableBufSize;
- BufSize3 := ModeTableBufSize;
- BufSize4 := ModeTableBufSize;
-
- ModeNo1 := Mode;
- ModeNo2 := Mode;
- ModeNo3 := Mode;
- ModeNo5 := Mode;
-
- SVGAIDString := ModeStr;
-
- ResX := Succ(ResX) DIV 8;
-
- Cols1 := Lo(ResX);
- Cols2 := Lo(ResX);
- Cols3 := Lo(ResX);
- Cols4 := Lo(ResX);
- Cols5 := Lo(ResX);
- Cols6 := Lo(ResX);
- Cols7 := Lo(ResX);
- Cols8 := Lo(ResX);
- Move(VGAPalette, Palette[0], Succ(VGAPalette.Size));
- JNB2JMP := $EB;
- END;
- END;
-
- BEGIN
- IF PatchExtDrv THEN BEGIN (* externer Treiber *)
- GraphError := 0;
- IF PathToDriver = '' THEN (* Treiber suchen *)
- BGIFileName := SVGADriverName + BgiExt
- ELSE BEGIN
- BGIFileName := PathToDriver + '\' + SVGADriverName
- + BgiExt;
- IF Pos('\\', BGIFileName) > 0 THEN
- Delete(BGIFileName, Pos('\\', BGIFileName), 1);
- END;
- Assign(BGIFile, BGIFileName);
- fm := FileMode;
- FileMode := 0;
- FindFirst(BGIFileName, FilesOnly, sr);
- IF Pos(SVGADriverName, sr.Name) = 0 THEN BEGIN
- GraphError := grFileNotFound;
- Exit;
- END;
-
- IF NOT (sr.Attr IN [0, Archive]) THEN BEGIN
- SetFAttr(BGIFile, Archive); (* Schreibschutz auf- *)
- END; (* heben (falls vorh. *)
- Reset(BGIFile, 1); (* Reset durchführen *)
-
- IF IOResult <> 0 THEN BEGIN
- GraphError := grInvalidDriver;
- Exit;
- END;
-
- IF FileSize(BGIFile) <> BGIFileLen THEN BEGIN
- GraphError := grInvalidDriver;
- Close(BGIFile); (* das war die falsche Datei! *)
- FileMode := fm;
- Exit;
- END;
-
- BlockRead(BGIFile, Buffer, BGIFileLen, ReadRes);
- Close(BGIFile); (* Datei lesen und schließen *)
- FileMode := fm;
- SVGADriverPtr := @Buffer; (* Zeiger auf »Buffer« *)
- (* für InstallUserDriver und RegisterBGIDriver: nur *)
- (* einmal lesen! *)
- END;
-
- IF SVGADriverPtr = NIL THEN BEGIN
- GraphError := grNoInitGraph;(*noch nicht initialisiert*)
- Exit;
- END;
-
- (* Aktuelle Daten in den Puffer holen und patchen: *)
- Move(SVGADriverPtr^, BGI, SizeOf(BGI));
- (* geänderte Daten wieder in den Treiber schreiben: *)
- PatchDriver(ModeNo);
- Move(BGI, SVGADriverPtr^, SizeOf(BGI));
- (* nach dem Patch muß der Treiber nochmal installiert *)
- (* und registriert werden, da sonst die neuen Werte *)
- (* nicht angenommen werden, bzw. der Zeiger auf den *)
- (* Puffer nicht in Graph initialisiert wird! *)
- {$IFNDEF VER60} (* Ein Bug in Turbo Pascal 5.x: *)
- GraphDriver := Graph.InstallUserDriver(SVGADriverName,
- SVGADriverPtr) + 5;
- {$ELSE} (* richtig in Turbo Pascal ab 6.0: *)
- GraphDriver := Graph.InstallUserDriver(SVGADriverName,
- SVGADriverPtr);
- {$ENDIF}
- GraphDriver := Graph.RegisterBGIDriver(SVGADriverPtr);
- AlreadyPatched := TRUE;
- {$IFDEF WriteBGI}
- WriteBGI2Disk; (* <-- erzeugt aktuellen BGI-Treiber *)
- {$ENDIF}
- END;
-
- PROCEDURE InitGraph(VAR GraphDriver,
- GraphMode : INTEGER;
- PathToDriver: STRING);
- (* ------------------------------------------------------ *)
- (* Erweitert: Initialisiert zusätzlich auch SVGA. Die *)
- (* Routine patcht den SVGA-Treiber bei der Initialisie- *)
- (* rung des Grafikmodus (falls noch nicht erfolgt). *)
- (* ------------------------------------------------------ *)
-
- PROCEDURE EGA320Patch(PathToDriver: STRING);
- (* ermöglicht den Grafikmodus 320*200/16Col für EGA/VGA *)
- VAR
- Result,
- GD, GM : INTEGER;
- i : BYTE;
- BEGIN
- SVGACard := ET3000; (* Defaultwerte für *)
- SVGAAspect[ET3000] := 8333; (* EGA 320 * 200/16 *)
- SVGAMode := $0D; (* in die Tabellen *)
- ModeTableBufSize := 32000; (* eintragen *)
- SVGAInit[ET3000] := $0D;
- SVGAModeID[ET3000] := '320 x 200 EGA'#0;
- SVGAResX[ET3000] := 319;
- SVGAResY[ET3000] := 199;
- EGA320 := 0;
- GD := 0; (* Treiberjustierungen *)
- GM := EGA320; (* für »PatchDriver« *)
- VGAPalette.Size := 16; (* Palette korrigieren *)
- FOR i := 0 TO 7 DO VGAPalette.Colors[i] := i;
- FOR i := 8 TO 15 DO VGAPalette.Colors[i] := i + 8;
-
- PatchBGI(GD, SVGAMode, PathToDriver, Result);(* Patch *)
-
- IF Result <> 0 THEN BEGIN (* Check *)
- WriteLn('Initialisierungsfehler:'#13#10,
- GraphErrorMsg(Result)); (* Fehler ! *)
- Halt(1);
- END;
-
- GD := SVGA; (* Treiber *)
- GM := EGA320; (* für System *)
- Graph.InitGraph(GD, GM, PathToDriver); (* anmelden *)
- END;
-
- VAR
- Dummy : INTEGER;
- BEGIN
- IF NOT GraphInitDone THEN BEGIN
- InitMode := BYTE(Ptr($0040, $0049)^);
- GraphGetMemPtr := Graph.GraphGetMemPtr;
- GraphFreeMemPtr := Graph.GraphFreeMemPtr;
- OrgExitProc := ExitProc;
- ExitProc := @GraphExitProc;
- GraphInitDone := TRUE;
- END ELSE Exit;
-
- IF (GraphDriver = EGA) AND (GraphMode = EGA320) THEN BEGIN
- EGA320Patch(PathToDriver);
- Exit;
- END;
-
- IF GraphDriver IN [CGA..VGA] THEN BEGIN
- Graph.InitGraph(GraphDriver, GraphMode, PathToDriver);
- ScreenDriver := VGA;
- ScreenMode := GraphMode;
- Exit;
- END;
-
- IF GraphDriver = Detect THEN (* --> gd := Detect; *)
- DetectGraph(GraphDriver, Dummy);
-
- IF ScreenMode = $FF THEN BEGIN
- GraphMode := GetMaxMode;
- ScreenMode := GraphMode;
- END;
-
- IF GraphDriver < EGA THEN IF NOT CharSetted THEN BEGIN
- GetIntVec($1F, Int1FSave); (* Grafikzeichensatz *)
- (* initialisieren *)
- IF Seg(Int1FSave^) = 0 THEN SetIntVec($1F, @GrafTable);
- CharSetted := TRUE;
- END; (* INT $1F setzen falls GRAFTABL nicht geladen ist *)
-
- IF GraphDriver = SVGA THEN BEGIN (* --> gd := SVGA; *)
- IF NOT AlreadyPatched THEN BEGIN
- IF ScreenDriver <> SVGA THEN
- DetectGraph(GraphDriver, GraphMode); (* InitCode! *)
- ScreenMode := SVGAHi;
- GraphMode := SVGAHi;
- PatchBGI(GraphDriver, SVGAMode, PathToDriver, Result);
- GraphDriver := SVGA;
- END;
-
- IF Result = 0 THEN BEGIN
- Graph.InitGraph(GraphDriver, GraphMode, PathToDriver);
- END ELSE BEGIN
- Regs.AL := InitMode;
- Regs.AH := 0;
- Intr($10, Regs);
- WriteLn('Grafikinstallationsfehler.'#13#10,
- GraphErrorMsg(Result));
- Halt(1);
- END;
- GraphMode := Result;
- END ELSE
- Graph.InitGraph(GraphDriver, GraphMode, PathToDriver);
- IF GraphDriver = SVGA THEN BEGIN
- Graph.SetColor(White);
- GraphMode := SVGAHi;
- ScreenMode := GraphMode;
- END;
- END;
-
- FUNCTION InstallUserDriver(n: STRING; p: POINTER): INTEGER;
- BEGIN
- InstallUserDriver := Graph.InstallUserDriver(n, p);
- END;
-
- FUNCTION InstallUserFont(FFName: STRING): INTEGER;
- BEGIN InstallUserFont := Graph.InstallUserFont(FFName); END;
-
- PROCEDURE Line(x1, y1, x2, y2: INTEGER);
- BEGIN Graph.Line(x1, y1, x2, y2); END;
-
- PROCEDURE LineRel(dx, dy:INTEGER);
- BEGIN Graph.LineRel(dx, dy); END;
-
- PROCEDURE LineTo(x, y: INTEGER);
- BEGIN Graph.LineTo(x, y); END;
-
- PROCEDURE MoveRel(dx, dy: INTEGER);
- BEGIN Graph.MoveRel(dx, dy); END;
-
- PROCEDURE MoveTo(x, y: INTEGER);
- BEGIN Graph.MoveTo(x, y); END;
-
- PROCEDURE OutTextXY(x, y: INTEGER; TextString: STRING);
- VAR
- c1, c2 : WORD;
- f : Graph.FillSettingsType;
- BEGIN
- CASE FontAttr OF
- Normal:
- Graph.OutTextXY(x, y, TextString);
- Bold:
- BEGIN
- Graph.OutTextXY(x + 1, y, TextString);
- Graph.OutTextXY(x , y, TextString);
- END;
- OutLine:
- BEGIN
- c1 := Graph.GetColor;
- Graph.OutTextXY(x - 1, y , TextString);
- Graph.OutTextXY(x - 1, y - 1, TextString);
- Graph.OutTextXY(x , y - 1, TextString);
- Graph.OutTextXY(x + 1, y , TextString);
- Graph.OutTextXY(x + 1, y + 1, TextString);
- Graph.OutTextXY(x , y + 1, TextString);
- Graph.OutTextXY(x - 1, y + 1, TextString);
- Graph.SetColor(Graph.GetBkColor);
- Graph.OutTextXY(x, y, TextString);
- Graph.SetColor(c1);
- END;
- Shadow:
- BEGIN
- Graph.GetFillSettings(f);
- c1 := f.Color;
- c2 := Graph.GetColor;
- Graph.SetColor(c1);
- Graph.OutTextXY(x + 2, y + 2, TextString);
- Graph.SetColor(c2);
- Graph.OutTextXY(x, y, TextString);
- END;
- ELSE Result := grInvalidAttr;
- END;
- END;
-
- PROCEDURE OutText(TextString: STRING);
- VAR
- c1, c2 : WORD;
- x, y : INTEGER;
- f : Graph.FillSettingsType;
- BEGIN
- CASE FontAttr OF
- Normal:
- Graph.OutText(TextString);
- Bold:
- BEGIN
- x := Graph.GetX;
- y := Graph.GetY;
- Graph.OutTextXY(x , y, TextString);
- Graph.OutTextXY(x + 1, y, TextString);
- x := x + Graph.TextWidth(TextString);
- Graph.MoveTo(Succ(x), y);
- END;
- OutLine:
- BEGIN
- x := Graph.GetX;
- y := Graph.GetY;
- c1 := Graph.GetColor;
- Graph.OutTextXY(x - 1, y , TextString);
- Graph.OutTextXY(x - 1, y - 1, TextString);
- Graph.OutTextXY(x , y - 1, TextString);
- Graph.OutTextXY(x + 1, y , TextString);
- Graph.OutTextXY(x + 1, y + 1, TextString);
- Graph.OutTextXY(x , y + 1, TextString);
- Graph.OutTextXY(x - 1, y + 1, TextString);
- Graph.SetColor(Graph.GetBkColor);
- Graph.OutTextXY(x, y, TextString);
- Graph.SetColor(c1);
- x := x + Graph.TextWidth(TextString);
- Graph.MoveTo(Succ(x), y);
- END;
- Shadow:
- BEGIN
- x := Graph.GetX;
- y := Graph.GetY;
- Graph.GetFillSettings(f);
- c1 := f.Color;
- c2 := Graph.GetColor;
- Graph.SetColor(c1);
- Graph.OutTextXY(x + 1, y + 1, TextString);
- Graph.SetColor(c2);
- Graph.OutTextXY(x, y, TextString);
- x := x + Graph.TextWidth(TextString);
- Graph.MoveTo(Succ(x), y);
- END;
- ELSE Result := grInvalidAttr;
- END;
- END;
-
- PROCEDURE PieSlice(x, y : INTEGER; SA, EA, R : WORD);
- BEGIN Graph.PieSlice(x, y, SA, EA, R); END;
-
- PROCEDURE PutImage(x, y : INTEGER; VAR BM; BitBlt: WORD);
- BEGIN Graph.PutImage(x, y, BM, BitBlt); END;
-
- PROCEDURE PutPixel(x, y : INTEGER; Pixel: WORD);
- BEGIN Graph.PutPixel(x, y, Pixel); END;
-
- PROCEDURE Rectangle(x1, y1, x2, y2 : INTEGER);
- BEGIN Graph.Rectangle(x1, y1, x2, y2); END;
-
- FUNCTION RegisterBGIDriver(Driver : POINTER): INTEGER;
- VAR
- s: STRING[99];
- BEGIN
- RegisterBGIDriver := Graph.RegisterBGIDriver(Driver);
- s[0] := #99;
- Move(Driver^, s[1], Ord(s[0])); (* welcher Treiber ???? *)
- IF Pos('(SuperVGA)', s) > 0 THEN BEGIN
- SVGADriverPtr := Driver; (* den brauchen wir noch *)
- PatchExtDrv := FALSE; (* Treiber ist intern!! *)
- RegisterBGIDriver := SVGA; (* Dummywert über Null *)
- END;
- END;
-
- FUNCTION RegisterBGIFont(Font: POINTER): INTEGER;
- BEGIN RegisterBGIFont := Graph.RegisterBGIFont(Font); END;
-
- PROCEDURE RestoreCrtMode;
- BEGIN
- IF ScreenDriver = SVGA THEN BEGIN
- Regs.AX := InitMode;
- Intr($10, Regs);
- END ELSE Graph.RestoreCrtMode;
- END;
-
- PROCEDURE Sector(x, y : INTEGER; SA, EA, XR, YR : WORD);
- BEGIN Graph.Sector(x, y, SA, EA, XR, YR); END;
-
- PROCEDURE SetActivePage(Page: WORD);
- BEGIN
- IF (Page > 0) AND (ScreenDriver = SVGA) THEN Page := 0;
- Graph.SetActivePage(Page); (* bei SVGA nur eine Seite *)
- END;
-
- PROCEDURE SetAllPalette(VAR Palette);
- BEGIN Graph.SetAllPalette(Palette); END;
-
- PROCEDURE SetAspectRatio(XAsp, YAsp: WORD);
- BEGIN Graph.SetAspectRatio(XAsp, YAsp); END;
-
- PROCEDURE SetBkColor(ColorNum: WORD);
- BEGIN Graph.SetBkColor(ColorNum); END;
-
- PROCEDURE SetColor(Color: WORD);
- BEGIN Graph.SetColor(Color); END;
-
- PROCEDURE SetFillPattern(Pat : FillPatternType; Col : WORD);
- BEGIN
- Graph.SetFillPattern(Graph.FillPatternType(Pat), Col);
- END;
-
- PROCEDURE SetFillStyle(Pattern: WORD; Color: WORD);
- BEGIN Graph.SetFillStyle(Pattern, Color); END;
-
- PROCEDURE SetGraphBufSize(BufSize: WORD);
- BEGIN Graph.SetGraphBufSize(BufSize); END;
-
- PROCEDURE SetGraphMode(Mode: INTEGER);
- BEGIN Graph.SetGraphMode(Mode); END;
-
- PROCEDURE SetLineStyle(L, P, T: WORD);
- BEGIN Graph.SetLineStyle(L, P, T); END;
-
- PROCEDURE SetPalette(ColorNum: WORD; Color: SHORTINT);
- BEGIN Graph.SetPalette(ColorNum, Color); END;
-
- PROCEDURE SetRGBPalette(ColorNum, R, G, B : INTEGER);
- BEGIN Graph.SetRGBPalette(ColorNum, R, G, B); END;
-
- PROCEDURE SetTextJustify(Horiz, Vert: WORD);
- BEGIN Graph.SetTextJustify(Horiz, Vert); END;
-
- PROCEDURE SetTextStyle(Font, Direction, CharSize: WORD);
- BEGIN Graph.SetTextStyle(Font, Direction, CharSize); END;
-
- PROCEDURE SetUserCharSize(MultX, DivX, MultY, DivY: WORD);
- BEGIN Graph.SetUserCharSize(MultX, DivX, MultY, DivY); END;
-
- PROCEDURE SetViewPort(x1,y1,x2,y2: INTEGER; Clip: BOOLEAN);
- BEGIN Graph.SetViewPort(x1, y1, x2, y2, Clip); END;
-
- PROCEDURE SetVisualPage(Page: WORD);
- BEGIN
- IF (Page > 0) AND (ScreenDriver = SVGA) THEN Page := 0;
- Graph.SetVisualPage(Page);
- END;
-
- PROCEDURE SetWriteMode(WriteMode: INTEGER);
- BEGIN Graph.SetWriteMode(WriteMode); END;
-
- FUNCTION TextHeight(TextString: STRING): WORD;
- BEGIN TextHeight := Graph.TextHeight(TextString); END;
-
- FUNCTION TextWidth(TextString: STRING): WORD;
- BEGIN TextWidth := Graph.TextWidth(TextString); END;
-
- END.
-
- (*--------------------------------------------------------*)
- (* Ende von XGRAPH.PAS *)
-