Ich habe nun ein Bild (die Lösung ist denkbar einfach gewesen und obendrein recht dämlich: der Leica DFC TWAIN-Treiber unterstützt ttmMemory nicht - nur ttmNative. Die Demokamera funktioniert nun, ich hoffe, dass es im echten Leben dann auch tut...). Die Auflösung lässt sich nicht ändern und es dauert auch eine Sekunde zum herausleiern, aber es tut soweit.
In TransferImageMemory habe ich diesen Block hinzugefügt, durch den man auf die Nichtanwendbarkeit vom ttmMemory Transfermode hingewiesen wird.
Delphi-Quellcode:
{...}
end {TWRC_SUCCESS}
else
begin
if Result = TWRC_FAILURE then
begin
// TWCC_ constant
if GetReturnStatus <> $FFFF then
Windows.MessageBox(0,PChar('Error '+IntToStr(GetReturnStatus)),
'Acquisition error',0)
else
Windows.MessageBox(0,'An error occured in TransferImageMemory.'+
#13#10'Aditionally, GetReturnStatus failed.','Acquisition error',0);
end;
end;
{...}
In DelphiTwain.pas habe ich GetReturnStatus modifiziert:
Delphi-Quellcode:
{Returns return status information}
function TTwainSource.GetReturnStatus: TW_UINT16;
var
StatusInfo: TW_STATUS;
rc : TW_UINT16;
begin
{The source must be loaded in order to get the status}
if Loaded then
begin
{Call method to get the information}
rc := Owner.TwainProc(AppInfo, @Structure, DG_CONTROL, DAT_STATUS, MSG_GET,
@StatusInfo);
Result := StatusInfo.ConditionCode;
if rc <> TWRC_SUCCESS then Result := $FFFF; // bad things have happened
end else Result := 0 {In case it was called while the source was not loaded}
end;
Mit der Wandlungsroutine für Fix32 bin ich auch noch nicht zufrieden, sie scheint irgendwie falsch zu sein. Ich habe mich mal an die Implementierung von GIMP gehalten:
Delphi-Quellcode:
//Convert from extended to Fix32
function FloatToFIX32(floater: Extended):TW_FIX32;
begin
result.Whole := trunc(floater);
result.Frac := round( abs(floater - trunc(floater)) * 65536.0 ) and $FFFF;
end;
//Convert from twain Fix32 to extended
function FIX32ToFloat(Value : TW_FIX32):Extended;
begin
if Value.Whole < 0 then // remember that frac part is unsigned
Result := Value.Whole - Value.Frac / 65536.0
else
Result := Value.Whole + Value.Frac / 65536.0;
end;