unit ImgDecoder;

interface
uses Windows;

function IsImgDecoderAvailable:boolean;
function ImgNewDecoder(var pDecoder:pointer):dword;
function ImgDeleteDecoder(pDecoder:pointer):dword;
function ImgNewDIBFromFile(pDecoder:pointer;Filename:PAnsiChar;var pImg:pointer):dword;
function ImgDeleteDIBSection(pImg:pointer):dword;
function ImgGetHandle(pImg:pointer;var pBitmap:HBITMAP;var ppDIBBits:pointer):dword;

implementation

const
  hModule:THANDLE=0;
type
  tImgNewDecoder      =function(var pDecoder:pointer):dword; stdcall;
  tImgDeleteDecoder   =function(pDecoder:pointer):dword; stdcall;
  tImgNewDIBFromFile  =function(pDecoder:pointer;Filename:PAnsiChar;var pImg):dword; stdcall;
  tImgDeleteDIBSection=function(pImg:pointer):dword; stdcall;
  tImgGetHandle       =function(pImg:pointer;var pBitmap:HBITMAP;var ppDIBBits:pointer):dword; stdcall;

const
  pImgNewDecoder      :tImgNewDecoder       = nil;
  pImgDeleteDecoder   :tImgDeleteDecoder    = nil;
  pImgNewDIBFromFile  :tImgNewDIBFromFile   = nil;
  pImgDeleteDIBSection:tImgDeleteDIBSection = nil;
  pImgGetHandle       :tImgGetHandle        = nil;

function IsImgDecoderAvailable:boolean;
begin
  result:=hModule<>0;
end;

function ImgNewDecoder(var pDecoder:pointer):dword;
begin
  if @pImgNewDecoder<>nil then
    result:=pImgNewDecoder(pDecoder)
  else
    result:=0;
end;

function ImgDeleteDecoder(pDecoder:pointer):dword;
begin
  if @pImgDeleteDecoder<>nil then
    result:=pImgDeleteDecoder(pDecoder)
  else
    result:=0;
end;

function ImgNewDIBFromFile(pDecoder:pointer;Filename:PAnsiChar;var pImg:pointer):dword;
begin
  if @pImgNewDecoder<>nil then
    result:=pImgNewDIBFromFile(pDecoder,Filename,pImg)
  else
    result:=0;
end;

function ImgDeleteDIBSection(pImg:pointer):dword;
begin
  if @pImgNewDecoder<>nil then
    result:=pImgDeleteDIBSection(pImg)
  else
    result:=0;
end;

function ImgGetHandle(pImg:pointer;var pBitmap:HBITMAP;var ppDIBBits:pointer):dword;
begin
  if @pImgGetHandle<>nil then
    result:=pImgGetHandle(pImg,pBitmap,ppDIBBits)
  else
    result:=0;
end;

initialization
  hModule:=LoadLibrary('imgdecoder.dll');
  if hModule=0 then
    hModule:=LoadLibrary('plugins\imgdecoder.dll');

  if hModule<>0 then
  begin
    pImgNewDecoder      :=GetProcAddress(hModule, 'ImgNewDecoder');
    pImgDeleteDecoder   :=GetProcAddress(hModule, 'ImgDeleteDecoder');
    pImgNewDIBFromFile  :=GetProcAddress(hModule, 'ImgNewDIBFromFile');
    pImgDeleteDIBSection:=GetProcAddress(hModule, 'ImgDeleteDIBSection');
    pImgGetHandle       :=GetProcAddress(hModule, 'ImgGetHandle');
  end;

finalization
  if hModule<>0 then
    FreeLibrary(hModule);
end.
{ Sample of using

var
  pDecoder:pointer;
  pImg:pointer;
  bitmap:HBITMAP;
  pBits:pointer;
begin
  if IsImgDecoderAvailable then
  begin
    ImgNewDecoder(pDecoder);
    if ImgNewDIBFromFile(pDecoder,PAnsiChar(ParamStr(1)),pImg)<>0 then
    begin
      ImgGetHandle(pImg,bitmap,pBits);
// action
      ImgDeleteDIBSection(pImg);
    end;
    ImgDeleteDecoder(pDecoder);
  end;
end.
}