fpc/packages/extra/ptc/consolei.inc
daniel 4b074a0e5c + Add PTCpas package
git-svn-id: trunk@1944 -
2005-12-13 21:13:29 +00:00

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}