📄 pseffect.pas
字号:
begin
Inc(rgbRed, (Weight * (srcPixel^.rgbRed - rgbRed)) shr 8);
Inc(rgbGreen, (Weight * (srcPixel^.rgbGreen - rgbGreen)) shr 8);
Inc(rgbBlue, (Weight * (srcPixel^.rgbBlue - rgbBlue)) shr 8);
end;
Inc(srcPixel);
Inc(dstPixel);
end;
Inc(srcPixel, JumpCount);
Inc(dstPixel, JumpCount);
end;
end;
procedure MergeRotate(dstBitmap, srcBitmap: TBitmap; xOrg, yOrg: Integer;
Angle: Extended);
var
CosTheta, SinTheta: Extended;
iCosTheta, iSinTheta: Integer;
xSrc, ySrc: Integer;
xDst, yDst: Integer;
xPrime, yPrime: Integer;
bmpWidth, bmpHeight: Integer;
yPrimeSinTheta, yPrimeCosTheta: Integer;
srcBits: PRGBQuadArray;
dstBits: PRGBQuad;
begin
SinCos(-Angle, SinTheta, CosTheta);
iSinTheta := Trunc(SinTheta * (1 shl 16));
iCosTheta := Trunc(CosTheta * (1 shl 16));
bmpWidth := srcBitmap.Width;
bmpHeight := srcBitmap.Height;
srcBits := srcBitmap.ScanLine[bmpHeight-1];
dstBits := @(PRGBQuadArray(dstBitmap.ScanLine[0])[bmpWidth-1]);
yPrime := bmpHeight - yOrg;
for yDst := bmpHeight - 1 downto 0 do
begin
yPrimeSinTheta := yPrime * iSinTheta;
yPrimeCosTheta := yPrime * iCosTheta;
xPrime := bmpWidth - xOrg;
for xDst := bmpWidth - 1 downto 0 do
begin
xSrc := SmallInt((xPrime * iCosTheta - yPrimeSinTheta) shr 16) + xOrg;
ySrc := SmallInt((xPrime * iSinTheta + yPrimeCosTheta) shr 16) + yOrg;
{$IFDEF DELPHI4_UP}
if (DWORD(ySrc) < DWORD(bmpHeight)) and (DWORD(xSrc) < DWORD(bmpWidth)) then
{$ELSE} // Delphi 3 compiler ignores unsigned type cast and generates signed comparison code!
if (ySrc >= 0) and (ySrc < bmpHeight) and (xSrc >= 0) and (xSrc < bmpWidth) then
{$ENDIF}
begin
dstBits^ := srcBits[ySrc * bmpWidth + xSrc];
end;
Dec(dstBits);
Dec(xPrime);
end;
Dec(yPrime);
end;
end;
procedure RotatePoints(var Points: array of TPoint; xOrg, yOrg: Integer;
Angle: Extended);
var
Sin, Cos: Extended;
xPrime, yPrime: Integer;
I: Integer;
begin
SinCos(Angle, Sin, Cos);
for I := Low(Points) to High(Points) do
with Points[I] do
begin
xPrime := X - xOrg;
yPrime := Y - yOrg;
X := Round(xPrime * Cos - yPrime * Sin) + xOrg;
Y := Round(xPrime * Sin + yPrime * Cos) + yOrg;
end;
end;
{ Helper Functions }
{$IFNDEF DELPHI4_UP}
function Min(A, B: Integer): Integer;
begin
if A < B then
Result := A
else
Result := B;
end;
{$ENDIF}
{$IFNDEF DELPHI4_UP}
function Max(A, B: Integer): Integer;
begin
if A > B then
Result := A
else
Result := B;
end;
{$ENDIF}
function CreateBarRgn(X, Y, W, H: Integer; XMode, YMode: Integer): HRGN;
var
X1, Y1, D: Integer;
ComplexRgn: TComplexRegion;
begin
D := (Min(W, H) div 50) + 1;
ComplexRgn := TComplexRegion.Create;
try
if X <= W then
Y1 := 0
else
Y1 := D;
while Y1 < H + D do
begin
if X > W then
begin
if XMode in [1, 4] then
ComplexRgn.AddRect(2 * W - X, Y1, W, Y1 + D)
else if XMode in [2, 5] then
ComplexRgn.AddRect(0, Y1, X - W, Y1 + D);
ComplexRgn.AddRect(0, Y1 - D, W, Y1);
end
else
begin
if XMode in [1, 5] then
ComplexRgn.AddRect(W - X, Y1, W, Y1 + D)
else if XMode in [2, 4] then
ComplexRgn.AddRect(0, Y1, X, Y1 + D)
else if XMode = 3 then
begin
ComplexRgn.AddRect(0, Y1 + D, X, Y1 + D + D);
ComplexRgn.AddRect(W - X, Y1, W, Y1 + D);
end;
end;
Inc(Y1, 2 * D);
end;
if Y <= H then
X1 := 0
else
X1 := D;
while X1 < W + D do
begin
if Y > H then
begin
if YMode in [1, 4] then
ComplexRgn.AddRect(X1, 2 * H - Y, X1 + D, H)
else if YMode in [2, 5] then
ComplexRgn.AddRect(X1, 0, X1 + D, Y - H);
ComplexRgn.AddRect(X1 - D, 0, X1, H);
end
else
begin
if YMode in [1, 5] then
ComplexRgn.AddRect(X1, H - Y, X1 + D, H)
else if YMode in [2, 4] then
ComplexRgn.AddRect(X1, 0, X1 + D, Y)
else if YMode = 3 then
begin
ComplexRgn.AddRect(X1, H - Y, X1 + D, H);
ComplexRgn.AddRect(X1 + D, 0, X1 + D + D, Y);
end;
end;
Inc(X1, 2 * D);
end;
Result := ComplexRgn.CreateRegion;
finally
ComplexRgn.Free;
end;
end;
function CreatePourRgn(X, Y, W, H, XMode, YMode: Integer): HRGN;
var
X1, Y1, mW, mH, WD, HD, N, R, mR, D: Integer;
ComplexRegion: TComplexRegion;
begin
ComplexRegion := TComplexRegion.Create;
try
D := (Min(W, H) div 200) + 1;
WD := W mod D;
HD := H mod D;
mW := W div 2;
mH := H div 2;
if XMode <> 0 then
begin
if X < W then
N := W div 10
else
N := 0;
Y1 := 0;
while Y1 < H do
begin
R := X + (Random(2 * N) - N);
if XMode = 1 then
ComplexRegion.AddRect(W - R, Y1, W, Y1 + D + HD)
else if XMode = 2 then
ComplexRegion.AddRect(0, Y1, R, Y1 + D + HD)
else if XMode = 3 then
begin
mR := R div 2;
ComplexRegion.AddRect(mW - mR, Y1, mW, Y1 + D + HD);
ComplexRegion.AddRect(mW, Y1, mW + mR, Y1 + D + HD);
end
else
begin
mR := R div 2;
ComplexRegion.AddRect(W - mR, Y1, W, Y1 + D + HD);
ComplexRegion.AddRect(0, Y1, mR, Y1 + D + HD);
end;
Inc(Y1, D);
end;
end;
if YMode <> 0 then
begin
if Y < H then
N := H div 10
else
N := 0;
X1 := 0;
while X1 < W do
begin
R := Y + Random(2 * N) - N;
if YMode = 1 then
ComplexRegion.AddRect(X1, H - R, X1 + D + WD, H)
else if YMode = 2 then
ComplexRegion.AddRect(X1, 0, X1 + D + WD, R)
else if YMode = 3 then
begin
mR := R div 2;
ComplexRegion.AddRect(X1, mH - mR, X1 + D + WD, mH);
ComplexRegion.AddRect(X1, mH, X1 + D + WD, mH + mR);
end
else
begin
mR := R div 2;
ComplexRegion.AddRect(X1, H - mR, X1 + D + WD, H);
ComplexRegion.AddRect(X1, 0, X1 + D + WD, mR);
end;
Inc(X1, D);
end;
end;
Result := ComplexRegion.CreateRegion;
finally
ComplexRegion.Free;
end;
end;
function CreateSwarmRgn(X, Y, W, H, XMode, YMode: Integer): HRGN;
var
X1, Y1, N, M, I, C, L, S: Integer;
ComplexRegion: TComplexRegion;
begin
ComplexRegion := TComplexRegion.Create;
try
if XMode <> 0 then
begin
if X < W then
N := W div 10
else
N := 0;
M := N div 20;
if M < 2 then
M := 2;
S := M div 2;
L := N div M;
C := (3 * N) div (4 * M);
Y1 := 0;
while Y1 < H do
begin
if XMode = 1 then
begin
ComplexRegion.AddRect(W - X, Y1, W, Y1 + M);
for I := L downto 1 do
if Random(I) <= Ord(I <= C) then
begin
X1 := (W - X) - (I * M);
ComplexRegion.AddRect(X1, Y1, X1 + M, Y1 + M);
end;
end
else
begin
ComplexRegion.AddRect(0, Y1, X, Y1 + M);
for I := L downto 1 do
if Random(I) <= Ord(I <= C) then
begin
X1 := X + (I * M);
ComplexRegion.AddRect(X1 - M, Y1, X1, Y1 + M);
end;
end;
Inc(Y1, S);
end;
end;
if YMode <> 0 then
begin
if Y < H then
N := H div 10
else
N := 0;
M := N div 20;
if M < 2 then
M := 2;
S := M div 2;
L := N div M;
C := (3 * N) div (4 * M);
X1 := 0;
while X1 < W do
begin
if YMode = 1 then
begin
ComplexRegion.AddRect(X1, H - Y, X1 + M, H);
for I := L downto 1 do
if Random(I) <= Ord(I <= C) then
begin
Y1 := (H - Y) - (I * M);
ComplexRegion.AddRect(X1, Y1, X1 + M, Y1 + M);
end;
end
else
begin
ComplexRegion.AddRect(X1, 0, X1 + M, Y);
for I := N div M downto 1 do
if Random(I) <= Ord(I <= C) then
begin
Y1 := Y + (I * M);
ComplexRegion.AddRect(X1, Y1 - M, X1 + M, Y1);
end;
end;
Inc(X1, S);
end;
end;
Result := ComplexRegion.CreateRegion;
finally
ComplexRegion.Free;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -