Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
Delphi 5 Professional
|
Re: Graphics32-Frage!!
25. Jul 2007, 16:45
Delphi-Quellcode:
function BuildMappingTable(
DstLo, DstHi: Integer;
ClipLo, ClipHi: Integer;
SrcLo, SrcHi: Integer;
Kernel: TCustomKernel): TMappingTable;
var
SrcW, DstW, ClipW: Integer;
Filter: TFilterMethod;
FilterWidth: TFloat;
Scale, OldScale: TFloat;
Center: TFloat;
Count: Integer;
Left, Right: Integer;
I, J, K: Integer;
Weight: Integer;
begin
SrcW := SrcHi - SrcLo;
DstW := DstHi - DstLo;
ClipW := ClipHi - ClipLo;
if SrcW = 0 then
begin
Result := nil;
Exit;
end
else if SrcW = 1 then
begin
SetLength(Result, ClipW);
for I := 0 to ClipW - 1 do
begin
SetLength(Result[I], 1);
Result[I][0].Pos := 0;
Result[I][0].Weight := 256;
end;
Exit;
end;
SetLength(Result, ClipW);
if ClipW = 0 then Exit;
if FullEdge then Scale := DstW / SrcW
else Scale := (DstW - 1) / (SrcW - 1);
Filter := Kernel.Filter;
FilterWidth := Kernel.GetWidth;
K := 0;
if Scale = 0 then
begin
Assert(Length(Result) = 1);
SetLength(Result[0], 1);
Result[0][0].Pos := (SrcLo + SrcHi) div 2;
Result[0][0].Weight := 256;
end
else if Scale < 1 then
begin
OldScale := Scale;
Scale := 1 / Scale;
FilterWidth := FilterWidth * Scale;
for I := 0 to ClipW - 1 do
begin
if FullEdge then
Center := SrcLo - 0.5 + (I - DstLo + ClipLo + 0.5) * Scale
else
Center := SrcLo + (I - DstLo + ClipLo) * Scale;
Left := Floor(Center - FilterWidth);
Right := Ceil(Center + FilterWidth);
Count := -256;
for J := Left to Right do
begin
Weight := Round(256 * Filter((Center - J) * OldScale) * OldScale);
if Weight <> 0 then
begin
Inc(Count, Weight);
K := Length(Result[I]);
SetLength(Result[I], K + 1);
Result[I][K].Pos := [b]Constrain(J, SrcLo, SrcHi - 1);[/b] --> hier stellt es ihn auf!!
Result[I][K].Weight := Weight;
end;
end;
[...]
[edit=SirThornberry]Delphi-Tags gesetzt - Mfg, SirThornberry[/edit]
|
|
Zitat
|