113 lines
2.3 KiB
ObjectPascal
113 lines
2.3 KiB
ObjectPascal
unit Unit1;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, FileUtil, strings, Forms, Controls, Graphics, Dialogs, StdCtrls,
|
|
BGRABitmap, BGRABitmapTypes, BGRAVirtualScreen, dynlibs;
|
|
|
|
const
|
|
{$IFDEF WINDOWS}
|
|
LIBRARYEXT = '*.dll';
|
|
{$ENDIF}
|
|
{$IFDEF LINUX}
|
|
LIBRARYEXT = '*.so';
|
|
{$ENDIF}
|
|
{$IFDEF DARWIN}
|
|
LIBRARYEXT = '*.dylib';
|
|
{$ENDIF}
|
|
|
|
type
|
|
TFilterName = procedure(s: PChar); cdecl;
|
|
TApplyFilter = procedure(BGRA: TBGRABitmap); cdecl;
|
|
|
|
type
|
|
|
|
{ TForm1 }
|
|
|
|
TForm1 = class(TForm)
|
|
BGRAVirtualScreen1: TBGRAVirtualScreen;
|
|
ComboBox1: TComboBox;
|
|
procedure BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
|
|
procedure ComboBox1Select(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
private
|
|
{ private declarations }
|
|
DLLnames: TStringList;
|
|
CurrentFilter: TApplyFilter;
|
|
dll: TLibHandle;
|
|
public
|
|
{ public declarations }
|
|
end;
|
|
|
|
var
|
|
Form1: TForm1;
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
{ TForm1 }
|
|
|
|
procedure TForm1.BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
|
|
begin
|
|
Bitmap.Fill(BGRA(255, 0, 0));
|
|
if Assigned(CurrentFilter) then
|
|
CurrentFilter(Bitmap);
|
|
end;
|
|
|
|
procedure TForm1.ComboBox1Select(Sender: TObject);
|
|
begin
|
|
if dll <> dynlibs.NilHandle then
|
|
if FreeLibrary(dll) then
|
|
dll := dynlibs.NilHandle;
|
|
dll := LoadLibrary(DLLnames[ComboBox1.ItemIndex]);
|
|
if dll <> dynlibs.NilHandle then
|
|
begin
|
|
CurrentFilter := TApplyFilter(GetProcAddress(dll, 'ApplyFilter'));
|
|
end;
|
|
BGRAVirtualScreen1.DiscardBitmap;
|
|
end;
|
|
|
|
procedure TForm1.FormCreate(Sender: TObject);
|
|
var
|
|
i: integer;
|
|
GetName: TFilterName;
|
|
s: PChar;
|
|
begin
|
|
DLLnames := FindAllFiles(ProgramDirectory, LIBRARYEXT, False);
|
|
for i := 0 to DLLnames.Count - 1 do
|
|
begin
|
|
DLLnames[i] := ExtractFileName(DLLnames[i]);
|
|
end;
|
|
|
|
s := stralloc(50);
|
|
for i := 0 to DLLnames.Count - 1 do
|
|
begin
|
|
dll := LoadLibrary(DLLnames[i]);
|
|
if dll <> dynlibs.NilHandle then
|
|
begin
|
|
GetName := TFilterName(GetProcAddress(dll, 'FilterName'));
|
|
if Assigned(GetName) then
|
|
begin
|
|
GetName(s);
|
|
ComboBox1.Items.Add(string(s));
|
|
end;
|
|
if FreeLibrary(dll) then
|
|
dll := dynlibs.NilHandle;
|
|
end;
|
|
end;
|
|
strdispose(s);
|
|
end;
|
|
|
|
procedure TForm1.FormDestroy(Sender: TObject);
|
|
begin
|
|
DLLnames.Free;
|
|
end;
|
|
|
|
end.
|
|
|