diff --git a/rtl/inc/graph/graph.pp b/rtl/inc/graph/graph.pp index e2db50390e..84cdded47c 100644 --- a/rtl/inc/graph/graph.pp +++ b/rtl/inc/graph/graph.pp @@ -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