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.
 | 
						|
 |