Skip to content

Commit

Permalink
TSimbaPluginTarget
Browse files Browse the repository at this point in the history
  • Loading branch information
ollydev committed Sep 14, 2023
1 parent 7437aac commit d518ae9
Show file tree
Hide file tree
Showing 4 changed files with 239 additions and 6 deletions.
14 changes: 13 additions & 1 deletion Source/Simba.lpi
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,7 @@
<PackageName Value="LCL"/>
</Item5>
</RequiredPackages>
<Units Count="141">
<Units Count="144">
<Unit0>
<Filename Value="Simba.lpr"/>
<IsPartOfProject Value="True"/>
Expand Down Expand Up @@ -987,6 +987,18 @@
<Filename Value="script/simba.script_pluginmethods.pas"/>
<IsPartOfProject Value="True"/>
</Unit140>
<Unit141>
<Filename Value="targets/simba.target_plugin.pas"/>
<IsPartOfProject Value="True"/>
</Unit141>
<Unit142>
<Filename Value="simba.externalimage.pas"/>
<IsPartOfProject Value="True"/>
</Unit142>
<Unit143>
<Filename Value="script/imports/simbaclasses/simba.import_externalimage.pas"/>
<IsPartOfProject Value="True"/>
</Unit143>
</Units>
</ProjectOptions>
<CompilerOptions>
Expand Down
20 changes: 19 additions & 1 deletion Source/script/imports/simba/simba.import_target.pas
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ implementation

uses
lptypes, lpvartypes, ffi,
simba.image, simba.target;
simba.image, simba.target, simba.externalimage;

(*
Target
Expand Down Expand Up @@ -72,6 +72,16 @@ procedure _LapeTarget_SetEIOS(const Params: PParamArray); LAPE_WRAPPER_CALLING_C
PSimbaTarget(Params^[0])^.SetEIOS(PString(Params^[1])^, PString(Params^[2])^);
end;

procedure _LapeTarget_SetPlugin1(const Params: PParamArray); LAPE_WRAPPER_CALLING_CONV
begin
PSimbaTarget(Params^[0])^.SetPlugin(PString(Params^[1])^, PString(Params^[2])^);
end;

procedure _LapeTarget_SetPlugin2(const Params: PParamArray); LAPE_WRAPPER_CALLING_CONV
begin
PSimbaTarget(Params^[0])^.SetPlugin(PString(Params^[1])^, PString(Params^[2])^, PSimbaExternalImage(Params^[3])^);
end;

(*
TTarget.GetImage
~~~~~~~~~~~~~~~~
Expand Down Expand Up @@ -192,6 +202,11 @@ procedure _LapeTarget_IsEIOSTarget(const Params: PParamArray; const Result: Poin
PBoolean(Result)^ := PSimbaTarget(Params^[0])^.IsEIOSTarget();
end;

procedure _LapeTarget_IsPluginTarget(const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
begin
PBoolean(Result)^ := PSimbaTarget(Params^[0])^.IsPluginTarget();
end;

(*
TTarget.IsDefault
~~~~~~~~~~~~~~~~~
Expand Down Expand Up @@ -324,6 +339,8 @@ procedure ImportTarget(Compiler: TSimbaScript_Compiler);
addGlobalFunc('procedure TTarget.SetImage(TImage: TImage)', @_LapeTarget_SetImage);
addGlobalFunc('procedure TTarget.SetWindow(Window: TWindowHandle)', @_LapeTarget_SetWindow);
addGlobalFunc('procedure TTarget.SetEIOS(Plugin, Args: String)', @_LapeTarget_SetEIOS);
addGlobalFunc('procedure TTarget.SetPlugin(Plugin, Args: String); overload', @_LapeTarget_SetPlugin1);
addGlobalFunc('procedure TTarget.SetPlugin(Plugin, Args: String; out DebugImage: TExternalImage); overload', @_LapeTarget_SetPlugin2);

addGlobalFunc('function TTarget.GetImage(Bounds: TBox = [-1,-1,-1,-1]): TImage', @_LapeTarget_GetImage);
addGlobalFunc('procedure TTarget.GetDimensions(out Width, Height: Integer)', @_LapeTarget_GetDimensions);
Expand All @@ -339,6 +356,7 @@ procedure ImportTarget(Compiler: TSimbaScript_Compiler);
addGlobalFunc('function TTarget.IsImageTarget: Boolean; overload', @_LapeTarget_IsImageTarget1);
addGlobalFunc('function TTarget.IsImageTarget(out TImage: TImage): Boolean; overload', @_LapeTarget_IsImageTarget2);
addGlobalFunc('function TTarget.IsEIOSTarget: Boolean', @_LapeTarget_IsEIOSTarget);
addGlobalFunc('function TTarget.IsPluginTarget: Boolean', @_LapeTarget_IsPluginTarget);

addGlobalFunc('function TTarget.IsDefault: Boolean', @_LapeTarget_IsDefault);

Expand Down
32 changes: 28 additions & 4 deletions Source/simba.target.pas
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ interface

uses
Classes, SysUtils,
simba.mufasatypes, simba.image,
simba.target_eios, simba.target_window, simba.target_image;
simba.mufasatypes, simba.image, simba.externalimage,
simba.target_eios, simba.target_window, simba.target_image, simba.target_plugin;

type
{$PUSH}
{$SCOPEDENUMS ON}
ETargetType = (NONE, IMAGE, WINDOW, EIOS);
ETargetType = (NONE, IMAGE, WINDOW, EIOS, PLUGIN);
ETargetTypes = set of ETargetType;
{$POP}

Expand All @@ -43,7 +43,7 @@ TTargetMethods = record
end;

const
TargetName: array[ETargetType] of String = ('NONE', 'IMAGE', 'WINDOW', 'EIOS');
TargetName: array[ETargetType] of String = ('NONE', 'IMAGE', 'WINDOW', 'EIOS', 'PLUGIN');

type
PSimbaTarget = ^TSimbaTarget;
Expand All @@ -57,6 +57,7 @@ TTargetMethods = record
FTargetImage: TSimbaImage;
FTargetWindow: TWindowHandle;
FTargetEIOS: TEIOSTarget;
FTargetPlugin: TSimbaPluginTarget;
FMethods: TTargetMethods; // Targets need to provide these. They are filled in SetWindow,SetEIOS etc.
FCustomClientArea: TBox;
FAutoSetFocus: Boolean;
Expand All @@ -79,6 +80,7 @@ TTargetMethods = record
function IsImageTarget: Boolean; overload;
function IsImageTarget(out Image: TSimbaImage): Boolean; overload;
function IsEIOSTarget: Boolean;
function IsPluginTarget: Boolean;

function IsValid: Boolean;
function IsFocused: Boolean;
Expand All @@ -95,6 +97,9 @@ TTargetMethods = record
procedure SetImage(Image: TSimbaImage);
procedure SetEIOS(FileName, Args: String);

procedure SetPlugin(FileName, Args: String); overload;
procedure SetPlugin(FileName, Args: String; out DebugImage: TSimbaExternalImage); overload;

function MousePressed(Button: EMouseButton): Boolean;
function MousePosition: TPoint;
procedure MouseTeleport(P: TPoint);
Expand Down Expand Up @@ -231,6 +236,11 @@ function TSimbaTarget.IsEIOSTarget: Boolean;
Result := FTargetType = ETargetType.EIOS;
end;

function TSimbaTarget.IsPluginTarget: Boolean;
begin
Result := FTargetType = ETargetType.PLUGIN;
end;

function TSimbaTarget.IsValid: Boolean;
begin
if HasMethod(FMethods.IsValid, 'IsValid') then
Expand Down Expand Up @@ -349,6 +359,20 @@ procedure TSimbaTarget.SetEIOS(FileName, Args: String);
FMethods.GetImageData := @EIOSTarget_GetImageData;
end;

procedure TSimbaTarget.SetPlugin(FileName, Args: String);
begin
ChangeTarget(ETargetType.PLUGIN);

FTargetPlugin := LoadPluginTarget(FileName, Args);
end;

procedure TSimbaTarget.SetPlugin(FileName, Args: String; out DebugImage: TSimbaExternalImage);
begin
ChangeTarget(ETargetType.PLUGIN);

FTargetPlugin := LoadPluginTarget(FileName, Args, DebugImage);
end;

function TSimbaTarget.MousePressed(Button: EMouseButton): Boolean;
begin
if HasMethod(FMethods.MousePressed, 'MousePressed') then
Expand Down
179 changes: 179 additions & 0 deletions Source/targets/simba.target_plugin.pas
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
unit simba.target_plugin;

{$i simba.inc}

interface

uses
Classes, SysUtils, DynLibs,
simba.mufasatypes, simba.externalimage;

type
PSimbaPluginTarget = ^TSimbaPluginTarget;
TSimbaPluginTarget = record
Lib: TLibHandle;
Target: Pointer;

Request: function(Args: PChar): Pointer; cdecl;
RequestWithDebugImage: function(Args: PChar; out DebugImage: TSimbaExternalImage): Pointer; cdecl;
Release: procedure(Target: Pointer); cdecl;

GetDimensions: procedure(Target: Pointer; out W, H: Int32); cdecl;
GetImageData: function(Target: Pointer; X, Y, Width, Height: Int32; var Data: PColorBGRA; var DataWidth: Int32): Boolean; cdecl;

MousePressed: function(Target: Pointer; Button: Int32): Boolean; cdecl;
MousePosition: function(Target: Pointer): TPoint; cdecl;
MouseTeleport: procedure(Target: Pointer; P: TPoint); cdecl;
MouseUp: procedure(Target: Pointer; Button: Int32); cdecl;
MouseDown: procedure(Target: Pointer; Button: Int32); cdecl;
MouseScroll: procedure(Target: Pointer; Scrolls: Int32); cdecl;

KeyDown: procedure(Target: Pointer; Key: Int32); cdecl;
KeyUp: procedure(Target: Pointer; Key: Int32); cdecl;
KeySend: procedure(Target: Pointer; Key: Char; KeyDownTime, KeyUpTime, ModifierDownTime, ModifierUpTime: Int32); cdecl;
KeyPressed: function(Target: Pointer; Key: Int32): Boolean; cdecl;
end;

function LoadPluginTarget(FileName, Args: String): TSimbaPluginTarget; overload;
function LoadPluginTarget(FileName, Args: String; out DebugImage: TSimbaExternalImage): TSimbaPluginTarget; overload;

procedure PluginTarget_GetDimensions(Target: Pointer; out W, H: Integer);
function PluginTarget_GetImageData(Target: Pointer; X, Y, Width, Height: Integer; var Data: PColorBGRA; var DataWidth: Integer): Boolean;

function PluginTarget_MousePressed(Target: Pointer; Button: EMouseButton): Boolean;
function PluginTarget_MousePosition(Target: Pointer): TPoint;
procedure PluginTarget_MouseTeleport(Target: Pointer; P: TPoint);
procedure PluginTarget_MouseUp(Target: Pointer; Button: EMouseButton);
procedure PluginTarget_MouseDown(Target: Pointer; Button: EMouseButton);
procedure PluginTarget_MouseScroll(Target: Pointer; Scrolls: Integer);

procedure PluginTarget_KeyDown(Target: Pointer; Key: EKeyCode);
procedure PluginTarget_KeyUp(Target: Pointer; Key: EKeyCode);
procedure PluginTarget_KeySend(Target: Pointer; Key: Char; KeyDownTime, KeyUpTime, ModifierDownTime, ModifierUpTime: Integer);
function PluginTarget_KeyPressed(Target: Pointer; Key: EKeyCode): Boolean;

implementation

uses
simba.script_pluginloader;

function Load(FileName: String): TSimbaPluginTarget;
begin
Result := Default(TSimbaPluginTarget);

with Result do
begin
try
Lib := LoadPlugin(FileName);
except
on E: Exception do
raise Exception.Create('LoadPluginTarget: ' + E.Message);
end;

Pointer(Request) := GetProcedureAddress(Lib, 'SimbaPluginTarget_Request');
Pointer(RequestWithDebugImage) := GetProcedureAddress(Lib, 'SimbaPluginTarget_RequestWithDebugImage');
Pointer(Release) := GetProcedureAddress(Lib, 'SimbaPluginTarget_Release');

Pointer(GetDimensions) := GetProcedureAddress(Lib, 'SimbaPluginTarget_GetDimensions');
Pointer(GetImageData) := GetProcedureAddress(Lib, 'SimbaPluginTarget_GetImageData');

Pointer(MousePressed) := GetProcedureAddress(Lib, 'SimbaPluginTarget_MousePressed');
Pointer(MousePosition) := GetProcedureAddress(Lib, 'SimbaPluginTarget_MousePosition');
Pointer(MouseTeleport) := GetProcedureAddress(Lib, 'SimbaPluginTarget_MouseTeleport');
Pointer(MouseUp) := GetProcedureAddress(Lib, 'SimbaPluginTarget_MouseUp');
Pointer(MouseDown) := GetProcedureAddress(Lib, 'SimbaPluginTarget_MouseDown');
Pointer(MouseScroll) := GetProcedureAddress(Lib, 'SimbaPluginTarget_MouseScroll');

Pointer(KeyDown) := GetProcedureAddress(Lib, 'SimbaPluginTarget_KeyDown');
Pointer(KeyUp) := GetProcedureAddress(Lib, 'SimbaPluginTarget_KeyUp');
Pointer(KeySend) := GetProcedureAddress(Lib, 'SimbaPluginTarget_KeySend');
Pointer(KeyPressed) := GetProcedureAddress(Lib, 'SimbaPluginTarget_KeyPressed');
end;
end;

function LoadPluginTarget(FileName, Args: String): TSimbaPluginTarget;
begin
Result := Load(FileName);
Result.Target := Result.Request(PChar(Args));
end;

function LoadPluginTarget(FileName, Args: String; out DebugImage: TSimbaExternalImage): TSimbaPluginTarget;
begin
Result := Load(FileName);
Result.Target := Result.RequestWithDebugImage(PChar(Args), DebugImage);
end;

procedure PluginTarget_GetDimensions(Target: Pointer; out W, H: Integer);
begin
with PSimbaPluginTarget(Target)^ do
GetDimensions(Target, W, H);
end;

function PluginTarget_GetImageData(Target: Pointer; X, Y, Width, Height: Integer; var Data: PColorBGRA; var DataWidth: Integer): Boolean;
begin
with PSimbaPluginTarget(Target)^ do
Result := GetImageData(Target, X, Y, Width, Height, Data, DataWidth);
end;

function PluginTarget_MousePressed(Target: Pointer; Button: EMouseButton): Boolean;
begin
with PSimbaPluginTarget(Target)^ do
Result := MousePressed(Target, Integer(Button));
end;

function PluginTarget_MousePosition(Target: Pointer): TPoint;
begin
with PSimbaPluginTarget(Target)^ do
Result := MousePosition(Target);
end;

procedure PluginTarget_MouseTeleport(Target: Pointer; P: TPoint);
begin
with PSimbaPluginTarget(Target)^ do
MouseTeleport(Target, P);
end;

procedure PluginTarget_MouseUp(Target: Pointer; Button: EMouseButton);
begin
with PSimbaPluginTarget(Target)^ do
MouseUp(Target, Integer(Button));
end;

procedure PluginTarget_MouseDown(Target: Pointer; Button: EMouseButton);
begin
with PSimbaPluginTarget(Target)^ do
MouseDown(Target, Integer(Button));
end;

procedure PluginTarget_MouseScroll(Target: Pointer; Scrolls: Integer);
begin
with PSimbaPluginTarget(Target)^ do
MouseScroll(Target, Scrolls);
end;

procedure PluginTarget_KeyDown(Target: Pointer; Key: EKeyCode);
begin
with PSimbaPluginTarget(Target)^ do
KeyDown(Target, Integer(Key));
end;

procedure PluginTarget_KeyUp(Target: Pointer; Key: EKeyCode);
begin
with PSimbaPluginTarget(Target)^ do
KeyUp(Target, Integer(Key));
end;

procedure PluginTarget_KeySend(Target: Pointer; Key: Char; KeyDownTime, KeyUpTime, ModifierDownTime, ModifierUpTime: Integer);
begin
with PSimbaPluginTarget(Target)^ do
KeySend(Target, Key, KeyDownTime, KeyUpTime, ModifierDownTime, ModifierUpTime);
end;

function PluginTarget_KeyPressed(Target: Pointer; Key: EKeyCode): Boolean;
begin
with PSimbaPluginTarget(Target)^ do
Result := KeyPressed(Target, Integer(Key));
end;

end.

0 comments on commit d518ae9

Please sign in to comment.