📄 alphalib.pas
字号:
//怓偲怓偺崌惉偟偨抣傪曉偡
function TAlpha.GetBlendColor(dest,src,BM : Byte) : Byte;
var
mode : byte;
begin
mode := GetBlendMode(BM);
GetBlendColor := AT[mode,dest,src];
end;
//--------------------------------------------------------------
//攇忬偵曄宍偝偣傞
procedure TAlpha.WaterWave(Dest : TDDDDSurface; rc : Trect; Count : Byte);
var
jjj,aaa : Integer;
begin
for jjj := 0 to ((rc.Right - rc.Left) div wq - 1) do
begin
aaa := (jjj*wq+Count*4) and $3FF;
Dest.BltFast(Dest,rc.Left + jjj*wq,rc.Top + ASin[aaa] div 128,
rect(rc.Left+jjj*wq,rc.Top,rc.Left+jjj*wq+wq,rc.Bottom),
DDBLTFAST_NOCOLORKEY);
end;
for jjj := 0 to ((rc.Bottom - rc.Top) div wq - 1) do
begin
aaa := (jjj*6*wq+Count*4+360) and $3FF;
Dest.BltFast(Dest,rc.Left+ASin[aaa] div 128,rc.Top+jjj*wq,
rect(rc.Left,rc.Top+jjj*wq,rc.Right,rc.Top+jjj*wq+wq),
DDBLTFAST_NOCOLORKEY);
end;
end;
//--------------------------------------------------------------
//傇傟岠壥
procedure TALpha.WindNoise(Dest : TDDDDSurface; rc : Trect; Amount : Integer);
var
iii,aaa : Integer;
begin
aaa := random($3FF);
for iii := 0 to ((rc.Bottom-rc.Top) div nq - 1)do
begin
Dest.BltFast(Dest,rc.Left+(RT[(aaa+iii) and $3FF]-512) * Amount div 512,
rc.Top+iii*nq,
rect(rc.Left,rc.Top+iii*nq,rc.Right,rc.Top+iii*nq+nq),
DDBLTFAST_NOCOLORKEY);
end;
end;
//---------------------------------------------------------------
//慖戰椞堟傪巜掕怓偱僽儗儞僪偟傑偡
procedure TAlpha.BlendRect(Dest : TDDDDSurface; rc : Trect;
Col,BM : Byte);
var
dx1,dy1,dx2,dy2 : Integer;
dddsd:DDSurfaceDesc;
dpix1,dpix2 :pBYTE;
jjj,iii,aaa,mode : Integer;
begin
//Surface偼懚嵼偟偰傞偐偄側丠
if Dest.IsLost Then Exit;
//嵗昗傪巊偄傗偡偄宍偵
dx1 := rc.Left ; dy1 := rc.Top;
dx2 := rc.Right; dy2 := rc.Bottom;
//BM乮BlendMethod乯偺抣傪僥亅僽儖憡摉偵曄姺
mode := GetBlendMode(BM);
//偼傒弌偟嬛巭
if (dx1 > dx2)then begin aaa := dx1; dx1 := dx2; dx2 := aaa; end;
if (dy1 > dy2)then begin aaa := dy1; dx1 := dy2; dy2 := aaa; end;
if ((dx1 < 0) and (dx2 < 0))then exit;
if ((dx1 > Dest.Width) and (dx2 > Dest.Width))then Exit;
if ((dy1 < 0) and (dy2 < 0))then exit;
if ((dy1 > Dest.Height) and (dy2 > Dest.Height))then Exit;
if (dx1 < 0)then dx1 := 0;
if (dy1 < 0)then dy1 := 0;
if (dx2 > dest.width )then dx2 := dest.Width;
if (dy2 > dest.Height)then dy2 := dest.Height;
//Surface傪Lock両
Dest.Lock(dddsd);
dpix1:=dddsd.lpSurface;
//嵗昗傪夋憸儊儌儕忋傾僪儗僗偵曄姺
Inc(dpix1,dx1*1+dy1*dddsd.lPitch);
//僾儗儞僨傿儞僌偡傞丅
for iii := dy1 to dy2-1 do begin
dpix2 := dpix1;
for jjj := dx1 to dx2-1 do
begin
//崌惉僷儗僢僩偱怓偺崌惉
dpix2^ := AT[mode,Col,dpix2^];
//1Pixel恑傔傞
Inc(dpix2);
end;
//1LINE暘偩偗恑傔傞
Inc(dpix1,dddsd.lPitch);
end;
//Surface偺Lock夝彍両
Dest.Unlock;
end;
//---------------------------------------------------------------
//慖戰椞堟傪巜掕怓偱揾傝偮傇偟傑偡
procedure TAlpha.FillRect(Dest : TDDDDSurface; rc : TRect; col : Byte);
var
fx : DDBLTFX;
arc : TRect;
begin
ZeroMemory(@fx,sizeof(DDBLTFX));
fx.dwSize:=sizeof(DDBLTFX);
fx.dwFillColor := col;
//偼傒弌偟嬛巭
arc := rc;
if (arc.Left < 0 )then arc.Left := 0;
if (arc.Right > Dest.Width)then arc.Right := Dest.Width;
if (arc.Top < 0 )then arc.Top := 0;
if (arc.Bottom> Dest.Height)then arc.Bottom:= Dest.Height;
//偙偆偟側偄偲徚偟偰偔傟側偄偺偼側偤丠
Dest.surface.Blt(arc,nil,arc,DDBLT_COLORFILL,fx);
end;
//----------------------------------------------------------------
//Blt偺娙棯斉丅DDBLTFX傪彑庤偵梡堄偟偰偔傟傞偺偱曋棙
procedure TAlpha.Blt(Dest : TDDDDSurface; rc1 : Trect;
Src : TDDDDSurface; rc2 : Trect;
dwFlags : Integer);
var
fx : DDBLTFX;
begin
ZeroMemory(@fx,sizeof(DDBLTFX));
fx.dwSize:=sizeof(DDBLTFX);
Dest.Blt(Src,rc1,rc2,dwFlags,fx);
end;
//----------------------------------------------------------------
//Put偺娙棯斉丅棙揰偼忋偲摨偠
procedure TAlpha.Blt2(Dest : TDDDDGenSurface; rc1 : Trect;
Src : TDDDDSurface; rc2 : Trect;
dwFlags : Integer);
var
fx : DDBLTFX;
begin
ZeroMemory(@fx,sizeof(DDBLTFX));
fx.dwSize:=sizeof(DDBLTFX);
Dest.Blt(src,rc1,rc2,dwFlags,fx);
end;
//----------------------------------------------------------------
//慖戰椞堟偺怓抲偒姺偊丒岎姺傪偍偙側偄傑偡
procedure TAlpha.ChangeColor(Dest : TDDDDSurface; rc : Trect;
DestCol,SrcCol : Integer);
var
dx1,dy1,dx2,dy2 : Integer;
dddsd:DDSurfaceDesc;
dpix1,dpix2 :pBYTE;
jjj,iii,aaa : Integer;
begin
//Surface偼懚嵼偟偰傞偐偄側丠
if Dest.IsLost Then Exit;
//嵗昗傪巊偄傗偡偄宍偵
dx1 := rc.Left ; dy1 := rc.Top;
dx2 := rc.Right; dy2 := rc.Bottom;
//偼傒弌偟嬛巭
if (dx1 > dx2)then begin aaa := dx1; dx1 := dx2; dx2 := aaa; end;
if (dy1 > dy2)then begin aaa := dy1; dx1 := dy2; dy2 := aaa; end;
if ((dx1 < 0) and (dx2 < 0))then exit;
if ((dx1 > Dest.Width) and (dx2 > Dest.Width))then Exit;
if ((dy1 < 0) and (dy2 < 0))then exit;
if ((dy1 > Dest.Height) and (dy2 > Dest.Height))then Exit;
if (dx1 < 0)then dx1 := 0;
if (dy1 < 0)then dy1 := 0;
if (dx2 > dest.width )then dx2 := dest.Width;
if (dy2 > dest.Height)then dy2 := dest.Height;
//Surface傪Lock両
Dest.Lock(dddsd);
dpix1:=dddsd.lpSurface;
//嵗昗傪夋憸儊儌儕忋傾僪儗僗偵曄姺
Inc(dpix1,dx1*1+dy1*dddsd.lPitch);
//僾儗儞僨傿儞僌偡傞丅
for iii := dy1 to dy2-1 do begin
dpix2 := dpix1;
for jjj := dx1 to dx2-1 do
begin
//怓偺抲偒姺偊乮srcCol側傜偦偺怓傪destCol偵偡傞乯
if (dpix2^ = srcCol)then dpix2^ := DestCol;
//1Pixel恑傔傞
Inc(dpix2);
end;
//1LINE暘偩偗恑傔傞
Inc(dpix1,dddsd.lPitch);
end;
//Surface偺Lock夝彍両
Dest.Unlock;
end;
//----------------------------------------------------------------
//僼僅儞僩昞帵
//TFontStyles偺愝掕曽朄偼... [fsBold,fsItalic,fsUnderline,fsStrikeout]偩傛
procedure TAlpha.TextOut(dest : TDDDDSurface;x,y : Integer; aaa : String;
RGBcolor : LongInt; size : Byte; Style : TFontStyles);
var
cv : tddddCanvas;
begin
cv := TDDDDCanvas.Create(dest);
cv.Font.Name := FontName;
cv.Font.Size := size;
cv.Font.Style := Style;
cv.Font.Color := $02000000 or RGBcolor;
cv.brush.Style := bsClear; //攚宨怓偼彂偐側偄
cv.TextOut(x,y,aaa);
cv.free;
end;
//----------------------------------------------------------------
//偪傚偭偲偟偨傕偺丅偊傜乣夞旔曽
function TAlpha.LoadBMP(FileName : string; DS : TDDDDSurface) : Boolean;
begin
if (FileExists(FileName) = True)then
begin
DS.LoadBMP(FileName);
LoadBMP := True;
end
else
begin
LoadBMP := False;
end;
end;
//----------------------------------------------------------------
//慖戰椞堟偵僲僀僘傪壛偊傑偡
procedure TAlpha.Noise(Dest : TDDDDSurface;
rc : TRect; Space : Integer; Col,BM : Byte);
var
dx1,dy1,dx2,dy2,xxx : Integer;
dddsd:DDSurfaceDesc;
dpix1,dpix2 :pBYTE;
jjj,iii,aaa,bbb,aspace : Integer;
mode : Byte;
begin
//Surface偼懚嵼偟偰傞偐偄側丠
if Dest.IsLost Then Exit;
//BM乮BlendMethod乯偺抣傪僥亅僽儖憡摉偵曄姺
mode := GetBlendMode(BM);
//嵗昗傪巊偄傗偡偄宍偵
dx1 := rc.Left ; dy1 := rc.Top;
dx2 := rc.Right; dy2 := rc.Bottom;
aspace := space;
if (space = 0)then aspace := 1;
//偼傒弌偟嬛巭
if (dx1 > dx2)then begin aaa := dx1; dx1 := dx2; dx2 := aaa; end;
if (dy1 > dy2)then begin aaa := dy1; dx1 := dy2; dy2 := aaa; end;
if ((dx1 < 0) and (dx2 < 0))then exit;
if ((dx1 > Dest.Width) and (dx2 > Dest.Width))then Exit;
if ((dy1 < 0) and (dy2 < 0))then exit;
if ((dy1 > Dest.Height) and (dy2 > Dest.Height))then Exit;
if (dx1 < 0)then dx1 := 0;
if (dy1 < 0)then dy1 := 0;
if (dx2 > dest.width )then dx2 := dest.Width;
if (dy2 > dest.Height)then dy2 := dest.Height;
//Surface傪Lock両
Dest.Lock(dddsd);
dpix1:=dddsd.lpSurface;
//嵗昗傪夋憸儊儌儕忋傾僪儗僗偵曄姺
Inc(dpix1,dx1*1+dy1*dddsd.lPitch);
aaa := random($3FF);
//僾儗儞僨傿儞僌偡傞丅
for iii := dy1 to dy2-1 do begin
dpix2 := dpix1;
xxx := dx1;
for jjj := dx1 to dx2-1 do
begin
inc(aaa);
aaa := aaa and $3FF;
bbb := (RT[aaa] * aSpace) shr 10 + 2;
inc(xxx,bbb);
if (xxx < dx2)then
begin
inc(xxx);
inc(dpix2,bbb);
dpix2^ := AT[Mode,Col,dpix2^];
inc(dpix2);
dpix2^ := AT[Mode,Col,dpix2^];
end
else Break;
end;
//1LINE暘偩偗恑傔傞
Inc(dpix1,dddsd.lPitch);
end;
//Surface偺Lock夝彍両
Dest.Unlock;
end;
//-----------------------------------------------------------------------------------
//摟柧搙傪巜掕偱偒傞崌惉
//偨偩偟丄CPU偵偐偗傞晧扴偑戝偒偔抶偄ゥ
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -