Răsfoiți Sursa

+ new test code for go32v2 graphic screen saves (only with -dDEBUG)

pierre 23 ani în urmă
părinte
comite
7e29d3feeb
2 a modificat fișierele cu 141 adăugiri și 21 ștergeri
  1. 138 21
      ide/fpusrscr.pas
  2. 3 0
      ide/globdir.inc

+ 138 - 21
ide/fpusrscr.pas

@@ -81,6 +81,11 @@ type
       VIDEBuffer   : PByteArray;
       IDEVideoInfo : TDOSVideoInfo;
       ctrl_c_state : boolean;
+{$ifdef TEST_GRAPH_SWITCH}
+      GraphImageSize : longint;
+      GraphBuffer : pointer;
+      ConsoleGraphDriver, ConsoleGraphMode : word;
+{$endif TEST_GRAPH_SWITCH}
       function    GetLineStartOfs(Line: integer): word;
       procedure   GetBuffer(Size: word);
       procedure   FreeBuffer;
@@ -161,9 +166,9 @@ uses
   {$ifdef fvision}
     ,Drivers
   {$endif}
-  {$ifdef VESA}
-    ,VESA
-  {$endif}
+  {$ifdef TEST_GRAPH_SWITCH}
+    ,Graph,VESA
+  {$endif TEST_GRAPH_SWITCH}
   ;
 
 function TScreen.GetWidth: integer;
@@ -314,38 +319,146 @@ end;
 procedure TDosScreen.SaveConsoleScreen;
 var
   VSeg,SOfs: word;
+{$ifdef TEST_GRAPH_SWITCH}
+  saved : boolean;
+  GraphDriver,GraphMode : integer;
+{$endif TEST_GRAPH_SWITCH}
 begin
   GetVideoMode(ConsoleVideoInfo);
-  GetBuffer(ConsoleVideoInfo.ScreenSize);
-  if ConsoleVideoInfo.Mode=7 then
-   VSeg:=SegB000
-  else
-   VSeg:=SegB800;
-  SOfs:=MemW[Seg0040:$4e];
+{$ifdef TEST_GRAPH_SWITCH}
+  saved:=false;
+  if assigned(GraphBuffer) then
+    begin
+      FreeMem(GraphBuffer,GraphImageSize);
+      GraphBuffer:=nil;
+      GraphImageSize:=0;
+    end;
+  if (ConsoleVideoInfo.Mode>= $100) or
+     (ConsoleVideoInfo.Mode=$13) or
+     (ConsoleVideoInfo.Mode=$12) or
+     (ConsoleVideoInfo.Mode=$10) or
+     (ConsoleVideoInfo.Mode=$E) then
+    begin
+      if VesaSetMode(ConsoleVideoInfo.Mode or $8000) then
+        begin
+          Graph.DontClearVesaMemory:=true;
+          if ConsoleVideoInfo.Mode>=$100 then
+            begin
+              GraphDriver:=Graph.Vesa;
+              GraphMode:=ConsoleVideoInfo.Mode and $fff;
+            end
+          else
+            begin
+              GraphDriver:=Graph.VGA;
+              case ConsoleVideoInfo.Mode of
+               $E : GraphMode:=VGALo;
+               $10 : GraphMode:=VGAMed;
+               $12 : GraphMode:=VGAHi;
+               $13 : begin
+                       GraphDriver:=Graph.LowRes;
+                       GraphMode:=0;
+                     end;
+              end;
+            end;
+          Graph.InitGraph(GraphDriver,GraphMode,'');
+          if graphresult=grOk then
+            begin
+              ConsoleGraphDriver:=GraphDriver;
+              ConsoleGraphMode:=GraphMode;
+              Graph.DontClearVesaMemory:=false;
+              GraphImageSize:=ImageSize(0,0,Graph.GetmaxX,Graph.GetMaxY);
+              GetMem(GraphBuffer,GraphImageSize);
+              FillChar(GraphBuffer^,GraphImageSize,#0);
+              GetImage(0,0,Graph.GetmaxX,Graph.GetMaxY,GraphBuffer^);
+              saved:=true;
+            end
+{$ifdef DEBUG}
+          else
+            Writeln(stderr,'Error in InitGraph ',Graphdriver, ' ',Graphmode)
+{$endif DEBUG}
+            ;
+        end;
+    end;
+  { mode < $100 so use standard Save code }
+  if not saved then
+{$endif TEST_GRAPH_SWITCH}
+  begin
+    GetBuffer(ConsoleVideoInfo.ScreenSize);
+    if ConsoleVideoInfo.Mode=7 then
+     VSeg:=SegB000
+    else
+     VSeg:=SegB800;
+    SOfs:=MemW[Seg0040:$4e];
 {$ifdef FPC}
-  DosmemGet(VSeg,SOfs,VBuffer^,ConsoleVideoInfo.ScreenSize);
+    DosmemGet(VSeg,SOfs,VBuffer^,ConsoleVideoInfo.ScreenSize);
 {$else}
-  Move(ptr(VSeg,SOfs)^,VBuffer^,ConsoleVideoInfo.ScreenSize);
+    Move(ptr(VSeg,SOfs)^,VBuffer^,ConsoleVideoInfo.ScreenSize);
 {$endif}
+  end;
 end;
 
 procedure TDOSScreen.SwitchToConsoleScreen;
 var
   VSeg,SOfs: word;
+{$ifdef TEST_GRAPH_SWITCH}
+  restored : boolean;
+  GraphDriver,GraphMode : integer;
+{$endif TEST_GRAPH_SWITCH}
 begin
   SetVideoMode(ConsoleVideoInfo);
-
-  if ConsoleVideoInfo.Mode=7 then
-    VSeg:=SegB000
-  else
-    VSeg:=SegB800;
-  SOfs:=MemW[Seg0040:$4e];
+{$ifdef TEST_GRAPH_SWITCH}
+  restored:=false;
+  if assigned(GraphBuffer) then
+    begin
+      if VesaSetMode(ConsoleVideoInfo.Mode) then
+        begin
+          if ConsoleVideoInfo.Mode>=$100 then
+            begin
+              GraphDriver:=Graph.Vesa;
+              GraphMode:=ConsoleVideoInfo.Mode and $fff;
+            end
+          else
+            begin
+              GraphDriver:=Graph.VGA;
+              case ConsoleVideoInfo.Mode of
+               $E : GraphMode:=VGALo;
+               $10 : GraphMode:=VGAMed;
+               $12 : GraphMode:=VGAHi;
+               $13 : begin
+                       GraphDriver:=Graph.LowRes;
+                       GraphMode:=0;
+                     end;
+              end;
+            end;
+          if (ConsoleGraphDriver<>GraphDriver) or
+             (ConsoleGraphMode<>GraphMode) then
+            Graph.InitGraph(GraphDriver,GraphMode,'');
+          if graphresult=grOk then
+            begin
+              PutImage(0,0,GraphBuffer^,CopyPut);
+              FreeMem(GraphBuffer,GraphImageSize);
+              GraphBuffer:=nil;
+              GraphImageSize:=0;
+              restored:=true;
+            end;
+        end;
+    end;
+  { mode < $100 so use standard Save code }
+  if not restored then
+{$endif TEST_GRAPH_SWITCH}
+    begin
+      if ConsoleVideoInfo.Mode=7 then
+        VSeg:=SegB000
+      else
+        VSeg:=SegB800;
+      SOfs:=MemW[Seg0040:$4e];
 {$ifdef FPC}
-  DosmemPut(VSeg,SOfs,VBuffer^,ConsoleVideoInfo.ScreenSize);
-  djgpp_set_ctrl_c(Ctrl_c_state);
+      DosmemPut(VSeg,SOfs,VBuffer^,ConsoleVideoInfo.ScreenSize);
+      djgpp_set_ctrl_c(Ctrl_c_state);
 {$else}
-  Move(VBuffer^,ptr(VSeg,SOfs)^,ConsoleVideoInfo.ScreenSize);
+      Move(VBuffer^,ptr(VSeg,SOfs)^,ConsoleVideoInfo.ScreenSize);
 {$endif}
+    end;
 end;
 
 
@@ -411,6 +524,7 @@ begin
   MI.Cols:=r.ah;
 {$ifdef VESA}
   VESAGetMode(MI.Mode);
+  MI.Mode:=MI.Mode and $fff;
 {$endif}
   MI.Rows:=MI.ScreenSize div (MI.Cols*2);
   if MI.Rows=51 then MI.Rows:=50;
@@ -986,7 +1100,10 @@ end;
 end.
 {
   $Log$
-  Revision 1.13  2002-06-13 11:18:32  pierre
+  Revision 1.14  2002-09-02 09:29:55  pierre
+   + new test code for go32v2 graphic screen saves (only with -dDEBUG)
+
+  Revision 1.13  2002/06/13 11:18:32  pierre
    + xterm window switching support
 
   Revision 1.12  2002/06/07 14:10:24  pierre

+ 3 - 0
ide/globdir.inc

@@ -33,6 +33,9 @@
   {$define HasSignal}
   {$define FSCaseInsensitive}
   {$define HasSysMsgUnit}
+  {$ifdef DEBUG}
+    {$define TEST_GRAPH_SWITCH}
+  {$endif DEBUG}
 {$endif}
 
 {$ifdef Linux}