mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2026-01-14 18:01:27 +01:00
754 lines
15 KiB
PHP
754 lines
15 KiB
PHP
{
|
|
Free Pascal port of the OpenPTC C++ library.
|
|
Copyright (C) 2001-2003 Nikolay Nikolov (nickysn@users.sourceforge.net)
|
|
Original C++ version by Glenn Fiedler (ptc@gaffer.org)
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
This library 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. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
}
|
|
|
|
Constructor TPTCConsole.Create;
|
|
|
|
Var
|
|
I : Integer;
|
|
{$IFDEF UNIX}
|
|
s : AnsiString;
|
|
{$ENDIF UNIX}
|
|
|
|
Begin
|
|
Inherited Create;
|
|
console := Nil;
|
|
hacky_option_console_flag := False;
|
|
FillChar(m_modes, SizeOf(m_modes), 0);
|
|
For I := Low(m_modes) To High(m_modes) Do
|
|
m_modes[I] := TPTCMode.Create;
|
|
{$IFDEF UNIX}
|
|
configure('/usr/share/ptc/ptc.conf');
|
|
s := fpgetenv('HOME');
|
|
If s = '' Then
|
|
s := '/';
|
|
If s[Length(s)] <> '/' Then
|
|
s := s + '/';
|
|
s := s + '.ptc.conf';
|
|
configure(s);
|
|
{$ELSE UNIX}
|
|
configure('ptc.cfg');
|
|
{$ENDIF UNIX}
|
|
End;
|
|
|
|
Destructor TPTCConsole.Destroy;
|
|
|
|
Var
|
|
I : Integer;
|
|
|
|
Begin
|
|
close;
|
|
console.Free;
|
|
For I := Low(m_modes) To High(m_modes) Do
|
|
m_modes[I].Free;
|
|
Inherited Destroy;
|
|
End;
|
|
|
|
Procedure TPTCConsole.configure(Const _file : String);
|
|
|
|
Var
|
|
F : Text;
|
|
S : String;
|
|
|
|
Begin
|
|
ASSignFile(F, _file);
|
|
{$I-}
|
|
Reset(F);
|
|
{$I+}
|
|
If IOResult <> 0 Then
|
|
Exit;
|
|
While Not EoF(F) Do
|
|
Begin
|
|
{$I-}
|
|
Readln(F, S);
|
|
{$I+}
|
|
If IOResult <> 0 Then
|
|
Break;
|
|
option(S);
|
|
End;
|
|
CloseFile(F);
|
|
End;
|
|
|
|
Function TPTCConsole.option(Const _option : String) : Boolean;
|
|
|
|
Begin
|
|
{$IFDEF PTC_LOGGING}
|
|
If _option = 'enable logging' Then
|
|
Begin
|
|
LOG_enabled := True;
|
|
option := True;
|
|
Exit;
|
|
End;
|
|
If _option = 'disable logging' Then
|
|
Begin
|
|
LOG_enabled := False;
|
|
option := True;
|
|
Exit;
|
|
End;
|
|
{$ENDIF PTC_LOGGING}
|
|
|
|
If Assigned(console) Then
|
|
option := console.option(_option)
|
|
Else
|
|
Begin
|
|
console := ConsoleCreate(_option);
|
|
If Assigned(console) Then
|
|
Begin
|
|
hacky_option_console_flag := True;
|
|
option := True;
|
|
End
|
|
Else
|
|
option := False;
|
|
End;
|
|
End;
|
|
|
|
Function TPTCConsole.modes : PPTCMode;
|
|
|
|
Var
|
|
_console : TPTCBaseConsole;
|
|
index, mode : Integer;
|
|
local : Integer;
|
|
_modes : PPTCMode;
|
|
tmp : TPTCMode;
|
|
|
|
Begin
|
|
If Assigned(console) Then
|
|
modes := console.modes
|
|
Else
|
|
Begin
|
|
_console := Nil;
|
|
index := -1;
|
|
mode := 0;
|
|
Try
|
|
Repeat
|
|
Inc(index);
|
|
Try
|
|
_console := ConsoleCreate(index);
|
|
Except
|
|
On TPTCError Do Begin
|
|
FreeAndNil(_console);
|
|
Continue;
|
|
End;
|
|
End;
|
|
If _console = Nil Then
|
|
Break;
|
|
_modes := _console.modes;
|
|
local := 0;
|
|
While _modes[local].valid Do
|
|
Begin
|
|
m_modes[mode].ASSign(_modes[local]);
|
|
Inc(local);
|
|
Inc(mode);
|
|
End;
|
|
FreeAndNil(_console);
|
|
Until False;
|
|
Finally
|
|
_console.Free;
|
|
End;
|
|
{ todo: strip duplicate modes from list? }
|
|
tmp := TPTCMode.Create;
|
|
Try
|
|
m_modes[mode].ASSign(tmp);
|
|
Finally
|
|
tmp.Free;
|
|
End;
|
|
modes := m_modes;
|
|
End;
|
|
End;
|
|
|
|
Procedure TPTCConsole.open(Const _title : String; _pages : Integer);{ Overload;}
|
|
|
|
Var
|
|
composite, tmp : TPTCError;
|
|
index : Integer;
|
|
success : Boolean;
|
|
|
|
Begin
|
|
If Assigned(console) Then
|
|
Begin
|
|
Try
|
|
console.open(_title, _pages);
|
|
Exit;
|
|
Except
|
|
On error : TPTCError Do Begin
|
|
FreeAndNil(console);
|
|
If hacky_option_console_flag Then
|
|
Begin
|
|
hacky_option_console_flag := False;
|
|
Raise TPTCError.Create('could not open console', error);
|
|
End;
|
|
End;
|
|
End;
|
|
End;
|
|
index := -1;
|
|
composite := TPTCError.Create;
|
|
success := False;
|
|
Try
|
|
Repeat
|
|
Inc(index);
|
|
Try
|
|
console := ConsoleCreate(index);
|
|
If console = Nil Then
|
|
Break;
|
|
console.open(_title, _pages);
|
|
success := True;
|
|
Exit;
|
|
Except
|
|
On error : TPTCError Do Begin
|
|
tmp := TPTCError.Create(error.message, composite);
|
|
Try
|
|
composite.ASSign(tmp);
|
|
Finally
|
|
tmp.Free;
|
|
End;
|
|
FreeAndNil(console);
|
|
Continue;
|
|
End;
|
|
End;
|
|
Until False;
|
|
console := Nil;
|
|
Raise TPTCError.Create(composite);
|
|
Finally
|
|
composite.Free;
|
|
If Not success Then
|
|
FreeAndNil(console);
|
|
End;
|
|
End;
|
|
|
|
Procedure TPTCConsole.open(Const _title : String; Const _format : TPTCFormat;
|
|
_pages : Integer);{ Overload;}
|
|
|
|
Var
|
|
composite, tmp : TPTCError;
|
|
index : Integer;
|
|
success : Boolean;
|
|
|
|
Begin
|
|
If Assigned(console) Then
|
|
Begin
|
|
Try
|
|
console.open(_title, _format, _pages);
|
|
Exit;
|
|
Except
|
|
On error : TPTCError Do Begin
|
|
FreeAndNil(console);
|
|
If hacky_option_console_flag Then
|
|
Begin
|
|
hacky_option_console_flag := False;
|
|
Raise TPTCError.Create('could not open console', error);
|
|
End;
|
|
End;
|
|
End;
|
|
End;
|
|
index := -1;
|
|
composite := TPTCError.Create;
|
|
success := False;
|
|
Try
|
|
Repeat
|
|
Inc(index);
|
|
Try
|
|
console := ConsoleCreate(index);
|
|
If console = Nil Then
|
|
Break;
|
|
console.open(_title, _format, _pages);
|
|
success := True;
|
|
Exit;
|
|
Except
|
|
On error : TPTCError Do Begin
|
|
tmp := TPTCError.Create(error.message, composite);
|
|
Try
|
|
composite.ASSign(tmp);
|
|
Finally
|
|
tmp.Free;
|
|
End;
|
|
FreeAndNil(console);
|
|
Continue;
|
|
End;
|
|
End;
|
|
Until False;
|
|
console := Nil;
|
|
Raise TPTCError.Create(composite);
|
|
Finally
|
|
composite.Free;
|
|
If Not success Then
|
|
FreeAndNil(console);
|
|
End;
|
|
End;
|
|
|
|
Procedure TPTCConsole.open(Const _title : String; _width, _height : Integer;
|
|
Const _format : TPTCFormat; _pages : Integer);{ Overload;}
|
|
|
|
Var
|
|
composite, tmp : TPTCError;
|
|
index : Integer;
|
|
success : Boolean;
|
|
|
|
Begin
|
|
If Assigned(console) Then
|
|
Begin
|
|
Try
|
|
console.open(_title, _width, _height, _format, _pages);
|
|
Exit;
|
|
Except
|
|
On error : TPTCError Do Begin
|
|
FreeAndNil(console);
|
|
If hacky_option_console_flag Then
|
|
Begin
|
|
hacky_option_console_flag := False;
|
|
Raise TPTCError.Create('could not open console', error);
|
|
End;
|
|
End;
|
|
End;
|
|
End;
|
|
index := -1;
|
|
composite := TPTCError.Create;
|
|
success := False;
|
|
Try
|
|
Repeat
|
|
Inc(index);
|
|
Try
|
|
console := ConsoleCreate(index);
|
|
If console = Nil Then
|
|
Break;
|
|
console.open(_title, _width, _height, _format, _pages);
|
|
success := True;
|
|
Exit;
|
|
Except
|
|
On error : TPTCError Do Begin
|
|
tmp := TPTCError.Create(error.message, composite);
|
|
Try
|
|
composite.ASSign(tmp);
|
|
Finally
|
|
tmp.Free;
|
|
End;
|
|
FreeAndNil(console);
|
|
Continue;
|
|
End;
|
|
End;
|
|
Until False;
|
|
console := Nil;
|
|
Raise TPTCError.Create(composite);
|
|
Finally
|
|
composite.Free;
|
|
If Not success Then
|
|
FreeAndNil(console);
|
|
End;
|
|
End;
|
|
|
|
Procedure TPTCConsole.open(Const _title : String; Const _mode : TPTCMode;
|
|
_pages : Integer);{ Overload;}
|
|
|
|
Var
|
|
composite, tmp : TPTCError;
|
|
index : Integer;
|
|
success : Boolean;
|
|
|
|
Begin
|
|
If Assigned(console) Then
|
|
Begin
|
|
Try
|
|
console.open(_title, _mode, _pages);
|
|
Exit;
|
|
Except
|
|
On error : TPTCError Do Begin
|
|
FreeAndNil(console);
|
|
If hacky_option_console_flag Then
|
|
Begin
|
|
hacky_option_console_flag := False;
|
|
Raise TPTCError.Create('could not open console', error);
|
|
End;
|
|
End;
|
|
End;
|
|
End;
|
|
index := -1;
|
|
composite := TPTCError.Create;
|
|
success := False;
|
|
Try
|
|
Repeat
|
|
Inc(index);
|
|
Try
|
|
console := ConsoleCreate(index);
|
|
If console = Nil Then
|
|
Break;
|
|
console.open(_title, _mode, _pages);
|
|
success := True;
|
|
Exit;
|
|
Except
|
|
On error : TPTCError Do Begin
|
|
tmp := TPTCError.Create(error.message, composite);
|
|
Try
|
|
composite.ASSign(tmp);
|
|
Finally
|
|
tmp.Free;
|
|
End;
|
|
FreeAndNil(console);
|
|
Continue;
|
|
End;
|
|
End;
|
|
Until False;
|
|
console := Nil;
|
|
Raise TPTCError.Create(composite);
|
|
Finally
|
|
composite.Free;
|
|
If Not success Then
|
|
FreeAndNil(console);
|
|
End;
|
|
End;
|
|
|
|
Procedure TPTCConsole.close;
|
|
|
|
Begin
|
|
If Assigned(console) Then
|
|
console.close;
|
|
hacky_option_console_flag := False;
|
|
End;
|
|
|
|
Procedure TPTCConsole.flush;
|
|
|
|
Begin
|
|
check;
|
|
console.flush;
|
|
End;
|
|
|
|
Procedure TPTCConsole.finish;
|
|
|
|
Begin
|
|
check;
|
|
console.finish;
|
|
End;
|
|
|
|
Procedure TPTCConsole.update;
|
|
|
|
Begin
|
|
check;
|
|
console.update;
|
|
End;
|
|
|
|
Procedure TPTCConsole.update(Const _area : TPTCArea);
|
|
|
|
Begin
|
|
check;
|
|
console.update(_area);
|
|
End;
|
|
|
|
Procedure TPTCConsole.internal_ReadKey(k : TPTCKey);
|
|
|
|
Begin
|
|
check;
|
|
console.internal_ReadKey(k);
|
|
End;
|
|
|
|
Function TPTCConsole.internal_PeekKey(k : TPTCKey) : Boolean;
|
|
|
|
Begin
|
|
check;
|
|
Result := console.internal_PeekKey(k);
|
|
End;
|
|
|
|
Procedure TPTCConsole.copy(Var surface : TPTCBaseSurface);
|
|
|
|
Begin
|
|
check;
|
|
console.copy(surface);
|
|
End;
|
|
|
|
Procedure TPTCConsole.copy(Var surface : TPTCBaseSurface;
|
|
Const source, destination : TPTCArea);
|
|
|
|
Begin
|
|
check;
|
|
console.copy(surface, source, destination);
|
|
End;
|
|
|
|
Function TPTCConsole.lock : Pointer;
|
|
|
|
Begin
|
|
check;
|
|
lock := console.lock;
|
|
End;
|
|
|
|
Procedure TPTCConsole.unlock;
|
|
|
|
Begin
|
|
check;
|
|
console.unlock;
|
|
End;
|
|
|
|
Procedure TPTCConsole.load(Const pixels : Pointer;
|
|
_width, _height, _pitch : Integer;
|
|
Const _format : TPTCFormat;
|
|
Const _palette : TPTCPalette);
|
|
|
|
Begin
|
|
check;
|
|
console.load(pixels, _width, _height, _pitch, _format, _palette);
|
|
End;
|
|
|
|
Procedure TPTCConsole.load(Const pixels : Pointer;
|
|
_width, _height, _pitch : Integer;
|
|
Const _format : TPTCFormat;
|
|
Const _palette : TPTCPalette;
|
|
Const source, destination : TPTCArea);
|
|
|
|
Begin
|
|
check;
|
|
console.load(pixels, _width, _height, _pitch, _format, _palette,
|
|
source, destination);
|
|
End;
|
|
|
|
Procedure TPTCConsole.save(pixels : Pointer;
|
|
_width, _height, _pitch : Integer;
|
|
Const _format : TPTCFormat;
|
|
Const _palette : TPTCPalette);
|
|
|
|
Begin
|
|
check;
|
|
console.save(pixels, _width, _height, _pitch, _format, _palette);
|
|
End;
|
|
|
|
Procedure TPTCConsole.save(pixels : Pointer;
|
|
_width, _height, _pitch : Integer;
|
|
Const _format : TPTCFormat;
|
|
Const _palette : TPTCPalette;
|
|
Const source, destination : TPTCArea);
|
|
|
|
Begin
|
|
check;
|
|
console.save(pixels, _width, _height, _pitch, _format, _palette,
|
|
source, destination);
|
|
End;
|
|
|
|
Procedure TPTCConsole.clear;
|
|
|
|
Begin
|
|
check;
|
|
console.clear;
|
|
End;
|
|
|
|
Procedure TPTCConsole.clear(Const color : TPTCColor);
|
|
|
|
Begin
|
|
check;
|
|
console.clear(color);
|
|
End;
|
|
|
|
Procedure TPTCConsole.clear(Const color : TPTCColor;
|
|
Const _area : TPTCArea);
|
|
|
|
Begin
|
|
check;
|
|
console.clear(color, _area);
|
|
End;
|
|
|
|
Procedure TPTCConsole.palette(Const _palette : TPTCPalette);
|
|
|
|
Begin
|
|
check;
|
|
console.palette(_palette);
|
|
End;
|
|
|
|
Function TPTCConsole.palette : TPTCPalette;
|
|
|
|
Begin
|
|
check;
|
|
palette := console.palette;
|
|
End;
|
|
|
|
Procedure TPTCConsole.clip(Const _area : TPTCArea);
|
|
|
|
Begin
|
|
check;
|
|
console.clip(_area);
|
|
End;
|
|
|
|
Function TPTCConsole.width : Integer;
|
|
|
|
Begin
|
|
check;
|
|
width := console.width;
|
|
End;
|
|
|
|
Function TPTCConsole.height : Integer;
|
|
|
|
Begin
|
|
check;
|
|
height := console.height;
|
|
End;
|
|
|
|
Function TPTCConsole.pitch : Integer;
|
|
|
|
Begin
|
|
check;
|
|
pitch := console.pitch;
|
|
End;
|
|
|
|
Function TPTCConsole.pages : Integer;
|
|
|
|
Begin
|
|
check;
|
|
pages := console.pages;
|
|
End;
|
|
|
|
Function TPTCConsole.area : TPTCArea;
|
|
|
|
Begin
|
|
check;
|
|
area := console.area;
|
|
End;
|
|
|
|
Function TPTCConsole.clip : TPTCArea;
|
|
|
|
Begin
|
|
check;
|
|
clip := console.clip;
|
|
End;
|
|
|
|
Function TPTCConsole.format : TPTCFormat;
|
|
|
|
Begin
|
|
check;
|
|
format := console.format;
|
|
End;
|
|
|
|
Function TPTCConsole.name : String;
|
|
|
|
Begin
|
|
name := '';
|
|
If Assigned(console) Then
|
|
name := console.name
|
|
Else
|
|
{$IFDEF GO32V2}
|
|
name := 'DOS';
|
|
{$ENDIF GO32V2}
|
|
{$IFDEF WIN32}
|
|
name := 'Win32';
|
|
{$ENDIF WIN32}
|
|
{$IFDEF LINUX}
|
|
name := 'Linux';
|
|
{$ENDIF LINUX}
|
|
End;
|
|
|
|
Function TPTCConsole.title : String;
|
|
|
|
Begin
|
|
check;
|
|
title := console.title;
|
|
End;
|
|
|
|
Function TPTCConsole.information : String;
|
|
|
|
Begin
|
|
check;
|
|
information := console.information;
|
|
End;
|
|
|
|
Function TPTCConsole.ConsoleCreate(index : Integer) : TPTCBaseConsole;
|
|
|
|
Begin
|
|
{$IFDEF GO32V2}
|
|
Case index Of
|
|
0 : ConsoleCreate := VESAConsole.Create;
|
|
1 : ConsoleCreate := VGAConsole.Create;
|
|
2 : ConsoleCreate := CGAConsole.Create;
|
|
3 : ConsoleCreate := TEXTFX2Console.Create;
|
|
Else
|
|
ConsoleCreate := Nil;
|
|
End;
|
|
{$ENDIF GO32V2}
|
|
{$IFDEF WIN32}
|
|
Case index Of
|
|
0 : ConsoleCreate := TDirectXConsole.Create;
|
|
Else
|
|
ConsoleCreate := Nil;
|
|
End;
|
|
{$ENDIF WIN32}
|
|
{$IFDEF UNIX}
|
|
Case index Of
|
|
0 : ConsoleCreate := TX11Console.Create;
|
|
Else
|
|
ConsoleCreate := Nil;
|
|
End;
|
|
{$ENDIF UNIX}
|
|
If ConsoleCreate <> Nil Then
|
|
ConsoleCreate.KeyReleaseEnabled := KeyReleaseEnabled;
|
|
End;
|
|
|
|
Function TPTCConsole.ConsoleCreate(Const _name : String) : TPTCBaseConsole;
|
|
|
|
Begin
|
|
ConsoleCreate := Nil;
|
|
{$IFDEF GO32V2}
|
|
If _name = 'VESA' Then
|
|
ConsoleCreate := VESAConsole.Create;
|
|
If (_name = 'VGA') Or (_name = 'Fakemode') Then
|
|
ConsoleCreate := VGAConsole.Create;
|
|
If (_name = 'TEXTFX2') Or (_name = 'Text') Then
|
|
ConsoleCreate := TEXTFX2Console.Create;
|
|
If _name = 'CGA' Then
|
|
ConsoleCreate := CGAConsole.Create;
|
|
{$ENDIF GO32V2}
|
|
{$IFDEF WIN32}
|
|
If _name = 'DirectX' Then
|
|
ConsoleCreate := TDirectXConsole.Create;
|
|
{$ENDIF WIN32}
|
|
{$IFDEF UNIX}
|
|
If _name = 'X11' Then
|
|
ConsoleCreate := TX11Console.Create;
|
|
{$ENDIF UNIX}
|
|
If ConsoleCreate <> Nil Then
|
|
ConsoleCreate.KeyReleaseEnabled := KeyReleaseEnabled;
|
|
End;
|
|
|
|
Procedure TPTCConsole.check;
|
|
|
|
Begin
|
|
{$IFDEF DEBUG}
|
|
If console = Nil Then
|
|
Raise TPTCError.Create('console is not open (core)');
|
|
{$ENDIF DEBUG}
|
|
End;
|
|
|
|
{$WARNING this should be removed for fpc 1.1}
|
|
{pages=0}
|
|
Procedure TPTCConsole.open(Const _title : String);
|
|
|
|
Begin
|
|
open(_title, 0);
|
|
End;
|
|
|
|
Procedure TPTCConsole.open(Const _title : String; Const _format : TPTCFormat);
|
|
|
|
Begin
|
|
open(_title, _format, 0);
|
|
End;
|
|
|
|
Procedure TPTCConsole.open(Const _title : String; _width, _height : Integer;
|
|
Const _format : TPTCFormat);
|
|
|
|
Begin
|
|
open(_title, _width, _height, _format, 0);
|
|
End;
|
|
|
|
Procedure TPTCConsole.open(Const _title : String; Const _mode : TPTCMode);
|
|
|
|
Begin
|
|
open(_title, _mode, 0);
|
|
End;
|
|
{/pages=0}
|