Browse Source

+ Some cleanup
* Bugfix of Detect in InitGraph

carl 26 years ago
parent
commit
1a45ac6847
1 changed files with 24 additions and 171 deletions
  1. 24 171
      rtl/inc/graph/graph.pp

+ 24 - 171
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