|
@@ -448,6 +448,11 @@ TYPE
|
|
|
{ this routine actually switches to the desired video mode. }
|
|
|
initmodeproc = procedure;
|
|
|
|
|
|
+ { this routine is called to save the sate just before a mode set }
|
|
|
+ savestateproc = procedure;
|
|
|
+ { this routine is called in closegraph to cleanup... }
|
|
|
+ restorestateproc = procedure;
|
|
|
+
|
|
|
TYPE
|
|
|
{-----------------------------------}
|
|
|
{ Linked list for mode information }
|
|
@@ -510,6 +515,9 @@ VAR
|
|
|
HLine : HLineProc;
|
|
|
VLine : VLineProc;
|
|
|
|
|
|
+ SaveVideoState : SaveStateProc;
|
|
|
+ RestoreVideoState: RestoreStateProc;
|
|
|
+
|
|
|
|
|
|
Procedure Closegraph;
|
|
|
procedure SetLineStyle(LineStyle: word; Pattern: word; Thickness: word);
|
|
@@ -524,6 +532,7 @@ function GetModeName(ModeNumber: integer): string;
|
|
|
procedure SetGraphMode(Mode: Integer);
|
|
|
function GetGraphMode: Integer;
|
|
|
function GetMaxMode: word;
|
|
|
+procedure RestoreCrtMode;
|
|
|
procedure GetModeRange(GraphDriver: Integer; var LoMode, HiMode: Integer);
|
|
|
Function GetX: Integer;
|
|
|
Function GetY: Integer;
|
|
@@ -665,9 +674,6 @@ var
|
|
|
|
|
|
ArcCall: ArcCoordsType; { Information on the last call to Arc or Ellipse }
|
|
|
|
|
|
- VidMode: Byte; { Old video mode to restore to }
|
|
|
-
|
|
|
-
|
|
|
|
|
|
var
|
|
|
|
|
@@ -1495,7 +1501,7 @@ end;
|
|
|
Offset, x : Integer;
|
|
|
Begin
|
|
|
For x:=0 to MaxX Do Begin
|
|
|
- WordArray(Data)[x]:=GetPixel(x, y);
|
|
|
+ WordArray(Data)[x]:=GetPixel(x, y);
|
|
|
End;
|
|
|
End;
|
|
|
|
|
@@ -2219,85 +2225,13 @@ end;
|
|
|
{$i fills.inc}
|
|
|
{$i text.inc}
|
|
|
|
|
|
- function GetModeName(ModeNumber: integer): string;
|
|
|
- {********************************************************}
|
|
|
- { Function GetModeName() }
|
|
|
- {--------------------------------------------------------}
|
|
|
- { Checks the known video list, and returns ModeName }
|
|
|
- { string. On error returns an empty string. }
|
|
|
- {********************************************************}
|
|
|
- var
|
|
|
- mode: PModeInfo;
|
|
|
- begin
|
|
|
- mode:=nil;
|
|
|
- GetModeName:='';
|
|
|
- { only search in the current driver modes ... }
|
|
|
- mode:=SearchMode(IntCurrentDriver,ModeNumber);
|
|
|
- if assigned(mode) then
|
|
|
- GetModeName:=Mode^.ModeName
|
|
|
- else
|
|
|
- _GraphResult := grInvalidMode;
|
|
|
- end;
|
|
|
-
|
|
|
- function GetGraphMode: Integer;
|
|
|
- begin
|
|
|
- GetGraphMode := IntCurrentMode;
|
|
|
- end;
|
|
|
-
|
|
|
- function GetMaxMode: word;
|
|
|
- { I know , i know, this routine is very slow, and it would }
|
|
|
- { be much easier to sort the linked list of possible modes }
|
|
|
- { instead of doing this, but I'm lazy!! And anyways, the }
|
|
|
- { speed of the routine here is not that important.... }
|
|
|
- var
|
|
|
- i: word;
|
|
|
- mode: PModeInfo;
|
|
|
- begin
|
|
|
- mode:=nil;
|
|
|
- i:=0;
|
|
|
- repeat
|
|
|
- inc(i);
|
|
|
- { mode 0 always exists... }
|
|
|
- { start search at 1.. }
|
|
|
- mode:=SearchMode(IntCurrentDriver,i);
|
|
|
- until not assigned(mode);
|
|
|
- GetMaxMode:=i;
|
|
|
- end;
|
|
|
-
|
|
|
-
|
|
|
- procedure GetModeRange(GraphDriver: Integer; var LoMode,
|
|
|
- HiMode: Integer);
|
|
|
- var
|
|
|
- i : integer;
|
|
|
- mode : PModeInfo;
|
|
|
- begin
|
|
|
- LoMode:=-1;
|
|
|
- HiMode:=-1;
|
|
|
- mode := nil;
|
|
|
- { First search if the graphics driver is supported .. }
|
|
|
- { since mode zero is always supported.. if that driver }
|
|
|
- { is supported it should return something... }
|
|
|
- mode := SearchMode(GraphDriver, 0);
|
|
|
- { driver not supported...}
|
|
|
- if not assigned(mode) then exit;
|
|
|
- { now it exists... find highest available mode... }
|
|
|
- LoMode := 0;
|
|
|
- mode:=nil;
|
|
|
- i:=-1;
|
|
|
- repeat
|
|
|
- inc(i);
|
|
|
- { start search at 0.. }
|
|
|
- mode:=SearchMode(GraphDriver,i);
|
|
|
- until not assigned(mode);
|
|
|
- HiMode := i;
|
|
|
- end;
|
|
|
-
|
|
|
|
|
|
procedure InitGraph(var GraphDriver:Integer;var GraphMode:Integer;
|
|
|
const PathToDriver:String);
|
|
|
var i,index:Integer;
|
|
|
LoMode, HiMode: Integer;
|
|
|
CpyMode: Integer;
|
|
|
+ CpyDriver: Integer;
|
|
|
begin
|
|
|
{ path to the fonts (where they will be searched)...}
|
|
|
bgipath:=PathToDriver;
|
|
@@ -2306,6 +2240,8 @@ end;
|
|
|
|
|
|
{ make sure our driver list is setup...}
|
|
|
QueryAdapterInfo;
|
|
|
+ if not assigned(SaveVideoState) then
|
|
|
+ RunError(216);
|
|
|
SaveVideoState;
|
|
|
InitVars;
|
|
|
DriverName:=InternalDriverName; { DOS Graphics driver }
|
|
@@ -2314,27 +2250,30 @@ end;
|
|
|
begin
|
|
|
HiMode := -1;
|
|
|
LoMode := -1;
|
|
|
+ { We start at VGA-1 }
|
|
|
GraphDriver := VGA;
|
|
|
+ CpyMode := 0;
|
|
|
{ search all possible graphic drivers in ascending order...}
|
|
|
{ usually the new driver numbers indicate newest hardware...}
|
|
|
{ Internal driver numbers start at VGA=9 }
|
|
|
- while (CpyMode<>-1) do
|
|
|
- begin
|
|
|
+ repeat
|
|
|
GetModeRange(GraphDriver,LoMode,HiMode);
|
|
|
{ save the highest mode possible...}
|
|
|
+ if HiMode = -1 then break;
|
|
|
CpyMode:=HiMode;
|
|
|
+ CpyDriver:=GraphDriver;
|
|
|
{ go to next driver if it exists...}
|
|
|
Inc(GraphDriver);
|
|
|
- end;
|
|
|
- IntCurrentDriver := GraphDriver;
|
|
|
+ until (CpyMode=-1);
|
|
|
+ IntCurrentDriver := CpyDriver;
|
|
|
{ If this is equal to -1 then no graph mode possible...}
|
|
|
- if Himode = -1 then
|
|
|
+ if CpyMode = -1 then
|
|
|
begin
|
|
|
_GraphResult := grNotDetected;
|
|
|
exit;
|
|
|
end;
|
|
|
{ Actually set the graph mode...}
|
|
|
- SetGraphMode(HiMode);
|
|
|
+ SetGraphMode(CpyMode);
|
|
|
end
|
|
|
else
|
|
|
begin
|
|
@@ -2352,98 +2291,14 @@ end;
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
- procedure SetGraphMode(mode: Integer);
|
|
|
- var
|
|
|
- modeinfo: PModeInfo;
|
|
|
- begin
|
|
|
- { check if the mode exists... }
|
|
|
- modeinfo := searchmode(IntcurrentDriver,mode);
|
|
|
- if not assigned(modeinfo) then
|
|
|
- begin
|
|
|
- _GraphResult := grInvalidMode;
|
|
|
- exit;
|
|
|
- end;
|
|
|
- { reset all hooks...}
|
|
|
- DefaultHooks;
|
|
|
- { arccall not reset - tested against VGA BGI driver }
|
|
|
- { Setup all hooks if none, keep old defaults...}
|
|
|
-
|
|
|
- { required hooks - returns error if no hooks to these }
|
|
|
- { routines. }
|
|
|
- if assigned(modeinfo^.DirectPutPixel) then
|
|
|
- DirectPutPixel := modeinfo^.DirectPutPixel
|
|
|
- else
|
|
|
- begin
|
|
|
- _Graphresult := grInvalidMode;
|
|
|
- exit;
|
|
|
- end;
|
|
|
-
|
|
|
- if assigned(modeinfo^.PutPixel) then
|
|
|
- PutPixel := modeinfo^.PutPixel
|
|
|
- else
|
|
|
- begin
|
|
|
- _Graphresult := grInvalidMode;
|
|
|
- exit;
|
|
|
- end;
|
|
|
-
|
|
|
- if assigned(modeinfo^.GetPixel) then
|
|
|
- GetPixel := modeinfo^.GetPixel
|
|
|
- else
|
|
|
- begin
|
|
|
- _Graphresult := grInvalidMode;
|
|
|
- exit;
|
|
|
- end;
|
|
|
-
|
|
|
- { optional hooks. }
|
|
|
- if assigned(modeinfo^.ClearViewPort) then
|
|
|
- ClearViewPort := modeinfo^.ClearViewPort;
|
|
|
- if assigned(modeinfo^.PutImage) then
|
|
|
- PutImage := modeinfo^.PutImage;
|
|
|
- if assigned(modeinfo^.GetImage) then
|
|
|
- GetImage := modeinfo^.GetImage;
|
|
|
- if assigned(modeinfo^.ImageSize) then
|
|
|
- ImageSize := modeinfo^.ImageSize;
|
|
|
- if assigned(modeinfo^.GetScanLine) then
|
|
|
- GetScanLine := modeinfo^.GetScanLine;
|
|
|
- if assigned(modeinfo^.Line) then
|
|
|
- Line := modeinfo^.Line;
|
|
|
- if assigned(modeinfo^.InternalEllipse) then
|
|
|
- InternalEllipse := modeinfo^.InternalEllipse;
|
|
|
- if assigned(modeinfo^.PatternLine) then
|
|
|
- PatternLine := modeinfo^.PatternLine;
|
|
|
- if assigned(modeinfo^.HLine) then
|
|
|
- Hline := modeinfo^.Hline;
|
|
|
- if assigned(modeinfo^.Vline) then
|
|
|
- VLine := modeinfo^.VLine;
|
|
|
- IntCurrentMode := modeinfo^.ModeNumber;
|
|
|
- IntCurrentDriver := modeinfo^.DriverNumber;
|
|
|
- XAspect := modeinfo^.XAspect;
|
|
|
- YAspect := modeinfo^.YAspect;
|
|
|
- MaxX := modeinfo^.MaxX;
|
|
|
- MaxY := modeinfo^.MaxY;
|
|
|
- MaxColor := modeinfo^.MaxColor;
|
|
|
- { now actually initialize the video mode...}
|
|
|
- { check first if the routine exists }
|
|
|
- if not assigned(modeinfo^.InitMode) then
|
|
|
- begin
|
|
|
- _GraphResult := grInvalidMode;
|
|
|
- exit;
|
|
|
- end;
|
|
|
- modeinfo^.InitMode;
|
|
|
- { It is very important that this call be made }
|
|
|
- { AFTER the other variables have been setup. }
|
|
|
- { Since it calls some routines which rely on }
|
|
|
- { those variables. }
|
|
|
- GraphDefaults;
|
|
|
- SetViewPort(0,0,MaxX,MaxY,TRUE);
|
|
|
- end;
|
|
|
-
|
|
|
|
|
|
var
|
|
|
ExitSave: pointer;
|
|
|
|
|
|
begin
|
|
|
ModeList := nil;
|
|
|
+ SaveVideoState := nil;
|
|
|
+ RestoreVideoState := nil;
|
|
|
{ This must be called at startup... because GetGraphMode may }
|
|
|
{ be called even when not in graph mode. }
|
|
|
QueryAdapterInfo;
|
|
@@ -2452,8 +2307,6 @@ begin
|
|
|
ExitProc := @CleanMode;
|
|
|
end.
|
|
|
|
|
|
-RestoreCrtMode
|
|
|
-
|
|
|
|
|
|
GetDefaultPalette
|
|
|
GetPalette
|