mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 08:19:36 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			304 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			304 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
{
 | 
						|
    This file is part of the Free Pascal run time library.
 | 
						|
    Copyright (c) 1999-2000 by the Free Pascal development team
 | 
						|
 | 
						|
    See the file COPYING.FPC, included in this distribution,
 | 
						|
    for details about the copyright.
 | 
						|
 | 
						|
    This program is distributed in the hope that it will be useful,
 | 
						|
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | 
						|
 | 
						|
 **********************************************************************}
 | 
						|
 | 
						|
Const
 | 
						|
  LockUpdateScreen : Integer = 0;
 | 
						|
 | 
						|
Procedure LockScreenUpdate;
 | 
						|
 | 
						|
begin
 | 
						|
  Inc(LockUpdateScreen);
 | 
						|
end;
 | 
						|
 | 
						|
Procedure UnLockScreenUpdate;
 | 
						|
 | 
						|
begin
 | 
						|
  If LockUpdateScreen>0 then
 | 
						|
    Dec(LockUpdateScreen);
 | 
						|
end;
 | 
						|
 | 
						|
Function GetLockScreenCount : integer;
 | 
						|
begin
 | 
						|
  GetLockScreenCount:=LockUpdateScreen;
 | 
						|
end;
 | 
						|
 | 
						|
Var
 | 
						|
  CurrentVideoDriver : TVideoDriver;
 | 
						|
  NextVideoMode      : TVideoMode;
 | 
						|
 | 
						|
Const
 | 
						|
  VideoInitialized : Boolean = False;
 | 
						|
  DriverInitialized : Boolean = False;
 | 
						|
  NextVideoModeSet  : Boolean = False;
 | 
						|
 | 
						|
Function SetVideoDriver (Const Driver : TVideoDriver) : Boolean;
 | 
						|
{ Sets the videodriver to be used }
 | 
						|
begin
 | 
						|
  If Not VideoInitialized then
 | 
						|
    Begin
 | 
						|
    CurrentVideoDriver:=Driver;
 | 
						|
      DriverInitialized:=true;
 | 
						|
      NextVideoModeSet:=false;
 | 
						|
    End;
 | 
						|
  SetVideoDriver:=Not VideoInitialized;
 | 
						|
end;
 | 
						|
 | 
						|
Procedure GetVideoDriver (Var Driver : TVideoDriver);
 | 
						|
{ Retrieves the current videodriver }
 | 
						|
begin
 | 
						|
  Driver:=CurrentVideoDriver;
 | 
						|
end;
 | 
						|
 | 
						|
{ ---------------------------------------------------------------------
 | 
						|
  External functions that use the video driver.
 | 
						|
  ---------------------------------------------------------------------}
 | 
						|
 | 
						|
Procedure FreeVideoBuf;
 | 
						|
 | 
						|
begin
 | 
						|
  if (VideoBuf<>Nil) then
 | 
						|
    begin
 | 
						|
    FreeMem(VideoBuf);
 | 
						|
    FreeMem(OldVideoBuf);
 | 
						|
    VideoBuf:=Nil;
 | 
						|
    OldVideoBuf:=Nil;
 | 
						|
    VideoBufSize:=0;
 | 
						|
    end;
 | 
						|
end;
 | 
						|
 | 
						|
(*
 | 
						|
Procedure AssignVideoBuf (OldCols, OldRows : Word);
 | 
						|
 | 
						|
Var NewVideoBuf,NewOldVideoBuf : PVideoBuf;
 | 
						|
    I,C,R,NewVideoBufSize : longint;
 | 
						|
    s:word;
 | 
						|
 | 
						|
begin
 | 
						|
  S:=sizeOf(TVideoCell);
 | 
						|
  NewVideoBufSize:=ScreenWidth*ScreenHeight*s;
 | 
						|
  GetMem(NewVideoBuf,NewVideoBufSize);
 | 
						|
  GetMem(NewOldVideoBuf,NewVideoBufSize);
 | 
						|
  // Move contents of old videobuffers to new if there are any.
 | 
						|
  if (VideoBuf<>Nil) then
 | 
						|
    begin
 | 
						|
    If (ScreenWidth<OldCols) then
 | 
						|
      C:=ScreenWidth
 | 
						|
    else
 | 
						|
      C:=OldCols;
 | 
						|
    If (ScreenHeight<OldRows) then
 | 
						|
      R:=ScreenHeight
 | 
						|
    else
 | 
						|
      R:=OldRows;
 | 
						|
    For I:=0 to R-1 do
 | 
						|
      begin
 | 
						|
      Move(VideoBuf^[I*OldCols],NewVideoBuf^[I*ScreenWidth],S*C);
 | 
						|
      Move(OldVideoBuf^[I*OldCols],NewOldVideoBuf^[I*ScreenWidth],S*C);
 | 
						|
      end;
 | 
						|
    end;
 | 
						|
  FreeVideoBuf;
 | 
						|
  VideoBufSize:=NewVideoBufSize;
 | 
						|
  VideoBuf:=NewVideoBuf;
 | 
						|
  OldVideoBuf:=NewOldVideoBuf;
 | 
						|
end;
 | 
						|
*)
 | 
						|
Procedure AssignVideoBuf (OldCols, OldRows : Word);
 | 
						|
 | 
						|
var NewVideoBuf,NewOldVideoBuf:PVideoBuf;
 | 
						|
    old_rowstart,new_rowstart:word;
 | 
						|
    NewVideoBufSize : longint;
 | 
						|
 | 
						|
begin
 | 
						|
  NewVideoBufSize:=ScreenWidth*ScreenHeight*sizeof(TVideoCell);
 | 
						|
  GetMem(NewVideoBuf,NewVideoBufSize);
 | 
						|
  GetMem(NewOldVideoBuf,NewVideoBufSize);
 | 
						|
  {Move contents of old videobuffers to new if there are any.}
 | 
						|
  if VideoBuf<>nil then
 | 
						|
    begin
 | 
						|
      if ScreenWidth<OldCols then
 | 
						|
        OldCols:=ScreenWidth;
 | 
						|
      if ScreenHeight<OldRows then
 | 
						|
        OldRows:=ScreenHeight;
 | 
						|
      old_rowstart:=0;
 | 
						|
      new_rowstart:=0;
 | 
						|
      while oldrows>0 do
 | 
						|
        begin
 | 
						|
          move(VideoBuf^[old_rowstart],NewVideoBuf^[new_rowstart],OldCols*sizeof(TVideoCell));
 | 
						|
          move(OldVideoBuf^[old_rowstart],NewOldVideoBuf^[new_rowstart],OldCols*sizeof(TVideoCell));
 | 
						|
          inc(old_rowstart,OldCols);
 | 
						|
          inc(new_rowstart,ScreenWidth);
 | 
						|
          dec(OldRows);
 | 
						|
        end;
 | 
						|
    end;
 | 
						|
  FreeVideoBuf;
 | 
						|
  { FreeVideoBuf sets VideoBufSize to 0 }
 | 
						|
  VideoBufSize:=NewVideoBufSize;
 | 
						|
  VideoBuf:=NewVideoBuf;
 | 
						|
  OldVideoBuf:=NewOldVideoBuf;
 | 
						|
end;
 | 
						|
 | 
						|
Procedure InitVideo;
 | 
						|
 | 
						|
begin
 | 
						|
  if not VideoInitialized then
 | 
						|
    begin
 | 
						|
      if Assigned(CurrentVideoDriver.InitDriver) then
 | 
						|
        CurrentVideoDriver.InitDriver;
 | 
						|
      if errorcode=viook then
 | 
						|
        begin
 | 
						|
          VideoInitialized:=true;
 | 
						|
          if NextVideoModeSet then
 | 
						|
            SetVideoMode(NextVideoMode)
 | 
						|
          else
 | 
						|
            AssignVideoBuf(0,0);
 | 
						|
          ClearScreen;
 | 
						|
        end;
 | 
						|
    end;
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
Procedure DoneVideo;
 | 
						|
 | 
						|
begin
 | 
						|
  If VideoInitialized then
 | 
						|
    begin
 | 
						|
    If Assigned(CurrentVideoDriver.DoneDriver) then
 | 
						|
      CurrentVideoDriver.DoneDriver;
 | 
						|
    FreeVideoBuf;
 | 
						|
    VideoInitialized:=False;
 | 
						|
    end;
 | 
						|
end;
 | 
						|
 | 
						|
Procedure UpdateScreen (Force : Boolean);
 | 
						|
 | 
						|
begin
 | 
						|
  If (LockUpdateScreen<=0) and
 | 
						|
     Assigned(CurrentVideoDriver.UpdateScreen) then
 | 
						|
      CurrentVideoDriver.UpdateScreen(Force);
 | 
						|
end;
 | 
						|
 | 
						|
Procedure ClearScreen;
 | 
						|
 | 
						|
begin
 | 
						|
  // Should this not be the current color ?
 | 
						|
  FillWord(VideoBuf^,VideoBufSize shr 1,$0720);
 | 
						|
  If Assigned(CurrentVideoDriver.ClearScreen) then
 | 
						|
    CurrentVideoDriver.ClearScreen
 | 
						|
  else
 | 
						|
    UpdateScreen(True);
 | 
						|
  FillWord(OldVideoBuf^,VideoBufSize shr 1,$0720);
 | 
						|
end;
 | 
						|
 | 
						|
Procedure SetCursorType (NewType : Word);
 | 
						|
 | 
						|
begin
 | 
						|
  if Assigned(CurrentVideoDriver.SetCursorType) then
 | 
						|
    CurrentVideoDriver.SetCursorType(NewType)
 | 
						|
end;
 | 
						|
 | 
						|
Function GetCursorType : Word;
 | 
						|
 | 
						|
begin
 | 
						|
  if Assigned(CurrentVideoDriver.GetCursorType) then
 | 
						|
    GetCursorType:=CurrentVideoDriver.GetCursorType()
 | 
						|
  else
 | 
						|
    GetCursorType:=0;
 | 
						|
end;
 | 
						|
 | 
						|
procedure SetCursorPos(NewCursorX, NewCursorY: Word);
 | 
						|
 | 
						|
begin
 | 
						|
  If Assigned(CurrentVideoDriver.SetCursorPos) then
 | 
						|
    CurrentVideoDriver.SetCursorPos(NewCursorX, NewCursorY)
 | 
						|
end;
 | 
						|
 | 
						|
function GetCapabilities: Word;
 | 
						|
begin
 | 
						|
  If Assigned(CurrentVideoDriver.GetCapabilities) then
 | 
						|
    GetCapabilities:=CurrentVideoDriver.GetCapabilities()
 | 
						|
  else
 | 
						|
    GetCapabilities:=0;
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
{ ---------------------------------------------------------------------
 | 
						|
    General functions
 | 
						|
  ---------------------------------------------------------------------}
 | 
						|
 | 
						|
 | 
						|
procedure GetVideoMode(var Mode: TVideoMode);
 | 
						|
begin
 | 
						|
  Mode.Col := ScreenWidth;
 | 
						|
  Mode.Row := ScreenHeight;
 | 
						|
  Mode.Color := ScreenColor;
 | 
						|
end;
 | 
						|
 | 
						|
Function SetVideoMode(Const Mode: TVideoMode) : Boolean;
 | 
						|
 | 
						|
Var
 | 
						|
  OldR,OldC: Word;
 | 
						|
 | 
						|
begin
 | 
						|
  SetVideoMode:=DriverInitialized;
 | 
						|
  if not DriverInitialized then
 | 
						|
    exit;
 | 
						|
  If VideoInitialized then
 | 
						|
    begin
 | 
						|
      OldC:=ScreenWidth;
 | 
						|
      OldR:=ScreenHeight;
 | 
						|
      If Assigned(CurrentVideoDriver.SetVideoMode) then
 | 
						|
        SetVideoMode:=CurrentVideoDriver.SetVideoMode(Mode)
 | 
						|
      else
 | 
						|
        SetVideoMode:=False;
 | 
						|
      // Assign buffer
 | 
						|
      If SetVideoMode then
 | 
						|
        AssignVideoBuf(OldC,Oldr);
 | 
						|
    end
 | 
						|
  else
 | 
						|
    begin
 | 
						|
      NextVideoMode:=Mode;
 | 
						|
      NextVideoModeSet:=true;
 | 
						|
    end;
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
Function GetVideoModeCount : Word;
 | 
						|
 | 
						|
begin
 | 
						|
  If Assigned(CurrentVideoDriver.GetVideoModeCount) then
 | 
						|
    GetVideoModeCount:=CurrentVideoDriver.GetVideoModeCount()
 | 
						|
  else
 | 
						|
    GetVideoModeCount:=1;
 | 
						|
end;
 | 
						|
 | 
						|
Function GetVideoModeData(Index : Word; Var Data: TVideoMode) : Boolean;
 | 
						|
 | 
						|
begin
 | 
						|
  If Assigned(CurrentVideoDriver.GetVideoModeData) then
 | 
						|
    GetVideoModeData:=CurrentVideoDriver.GetVideoModeData(Index,Data)
 | 
						|
  else
 | 
						|
    begin
 | 
						|
    GetVideoModeData:=(Index=0);
 | 
						|
    If GetVideoModeData then
 | 
						|
      GetVideoMode(Data);
 | 
						|
    end
 | 
						|
end;
 | 
						|
 | 
						|
function DefaultErrorHandler(AErrorCode: Longint; AErrorInfo: Pointer): TErrorHandlerReturnValue;
 | 
						|
begin
 | 
						|
  ErrorCode := AErrorCode;
 | 
						|
  ErrorInfo := AErrorInfo;
 | 
						|
  DefaultErrorHandler := errAbort; { return error code }
 | 
						|
end;
 | 
						|
 | 
						|
 |