📄 alphalib.pas
字号:
bb := TempPal[kkk,2] + TempPal[iii,2];
if (rr > 255)then rr := 255;
if (gg > 255)then gg := 255;
if (bb > 255)then bb := 255;
AT[0,kkk,iii] := GetNearestPaletteIndex2(RGB(rr,gg,bb)); //WindowsAPI偵棅偭偰傑偡
end;
//廳暋偡傞晹暘傪揮幨偡傞
for kkk := 0 to 255 do for iii := 0 to kkk do
AT[0,kkk,iii] := AT[0,iii,kkk];
end;
//***捠忢崌惉僥亅僽儖惗惉***
if (NormalPal = True)then
begin
for kkk := 0 to 255 do
for iii := 0 to 255 do //寉偔偡傞億僀儞僩
begin
//椉曽偺怓偺拞娫傪弌椡 src dest
rr := (TempPal[kkk,0]*NormalPalAlph + TempPal[iii,0]*(255-NormalPalAlph)) shr 8;
gg := (TempPal[kkk,1]*NormalPalAlph + TempPal[iii,1]*(255-NormalPalAlph)) shr 8;
bb := (TempPal[kkk,2]*NormalPalAlph + TempPal[iii,2]*(255-NormalPalAlph)) shr 8;
AT[1,kkk,iii] := GetNearestPaletteIndex2(RGB(rr,gg,bb));
end;
//捠忢崌惉偺応崌偼0傪儅僗僋怓乮柍曄壔怓乯偲偡傞
for iii := 0 to 255 do AT[1,iii,0] := iii;
end;
//***忔嶼崌惉僥亅僽儖偺惗惉***
if (JyousanPal = True)then
begin
for kkk := 0 to 255 do
for iii := kkk to 255 do //寉偔偡傞億僀儞僩
begin
//椉曽偺怓偺壛嶼傪弌椡
rr := TempPal[kkk,0] - (255-TempPal[iii,0]);
gg := TempPal[kkk,1] - (255-TempPal[iii,1]);
bb := TempPal[kkk,2] - (255-TempPal[iii,2]);
if (rr < 0)then rr := 0;
if (gg < 0)then gg := 0;
if (bb < 0)then bb := 0;
AT[2,kkk,iii] := GetNearestPaletteIndex2(RGB(rr,gg,bb)); //WindowsAPI偵棅偭偰傑偡
end;
//廳暋偡傞晹暘傪揮幨偡傞
for kkk := 0 to 255 do for iii := 0 to kkk do
AT[2,kkk,iii] := AT[2,iii,kkk];
end;
//4096怓媅帡僷儗僢僩惗惉
//偙傟偩偗晛捠偺崌惉曽朄偲堎側傞丅AlphBlend娭悢傪屇傃弌偝側偄尷傝巊傢側偄丅
//ABP[red,green,lue];
for iii := 0 to 15 do
for jjj := 0 to 15 do
for kkk := 0 to 15 do
ABP[iii,jjj,kkk] := GetNearestPaletteIndex2(RGB(iii*17,jjj*17,kkk*17)); //WindowsAPI偵棅偭偰傑偡
//擹搙忣曬桳岠Normal崌惉梡僥亅僽儖
//RGB偵暘偗偰寁嶼屻丄4096Pal偱惗惉
for iii := 0 to 255 do
for jjj := 0 to 31 do
begin
AlphNormal[iii,0,jjj] := TempPal[iii,0]*jjj div 510; //544=17*31
AlphNormal[iii,1,jjj] := TempPal[iii,1]*jjj div 510;
AlphNormal[iii,2,jjj] := TempPal[iii,2]*jjj div 510;
end;
//擹搙忣曬桳岠ADD崌惉梡僥亅僽儖
//壛怓偺棙揰丗擹搙忣曬偑敄偄亖崟偵嬤偄 傪棙梡偡傞
//偁傜偐偠傔丄尨怓仺崟偺僌儔亅僨僔儑儞忣曬傪嶌偭偰偍偔
for iii := 0 to 255 do
for jjj := 0 to 31 do
begin
rr := TempPal[iii,0]*jjj div 31;
gg := TempPal[iii,1]*jjj div 31;
bb := TempPal[iii,2]*jjj div 31;
AlphADD[jjj,iii] := GetNearestPaletteIndex2(RGB(rr,gg,bb));
end;
//擹搙忣曬桳岠DEC崌惉梡僥亅僽儖
//壛怓偺棙揰丗擹搙忣曬偑敄偄亖敀偵嬤偄 傪棙梡偡傞
//偁傜偐偠傔丄尨怓仺敀偺僌儔亅僨僔儑儞忣曬傪嶌偭偰偍偔
for iii := 0 to 255 do
for jjj := 0 to 31 do
begin
rr := (TempPal[iii,0]*jjj + 255*(31-jjj)) div 31;
gg := (TempPal[iii,1]*jjj + 255*(31-jjj)) div 31;
bb := (TempPal[iii,2]*jjj + 255*(31-jjj)) div 31;
AlphDEC[jjj,iii] := GetNearestPaletteIndex2(RGB(rr,gg,bb));
end;
//巊偄廔傢偭偨傜夝曻
TempBmp.Free;
end;
//---------------------------------------------------------------
//DDDD偐傜僷儗僢僩忣曬傪捀偄偰丄
//僽儗儞僨傿儞僌梡僷儗僢僩僥亅僽儖傪惗惉偡傞丅
//MMX200Mhz偱4昩偖傜偄偐偐傝傑偡丅
procedure TAlpha.ReadDDDDPalette(DD : TDDDD; rop : Byte);
var
iii,jjj,kkk : Integer;
rr,gg,bb : SmallInt;
begin
//rop偐傜惗惉偡傞僷儗僢僩僥亅僽儖偺庬椶傪栤偆
ScreenPal := False;
NormalPal := False;
JyousanPal := False;
if ((rop and BM_SCREEN)<>0)then ScreenPal := True;
if ((rop and BM_NORMAL)<>0)then NormalPal := True;
if ((rop and BM_JYOUSAN)<>0)then JyousanPal := True;
//TempPal偵揮幨偡傞
for iii:=0 to 255 do begin
TempPal[iii,0] := DD.Palette[iii].peRed;
TempPal[iii,1] := DD.Palette[iii].peGreen;
TempPal[iii,2] := DD.Palette[iii].peBlue;
end;
//巊偄幪偰乮丱丱丟
//***壛怓崌惉僷儗僢僩偺惗惉***
if (ScreenPal = True)then
begin
for kkk := 0 to 255 do
for iii := kkk to 255 do //寉偔偡傞億僀儞僩
begin
//椉曽偺怓偺壛嶼傪弌椡
rr := TempPal[kkk,0] + TempPal[iii,0];
gg := TempPal[kkk,1] + TempPal[iii,1];
bb := TempPal[kkk,2] + TempPal[iii,2];
if (rr > 255)then rr := 255;
if (gg > 255)then gg := 255;
if (bb > 255)then bb := 255;
AT[0,kkk,iii] := GetNearestPaletteIndex2(RGB(rr,gg,bb)); //WindowsAPI偵棅偭偰傑偡
end;
//廳暋偡傞晹暘傪揮幨偡傞
for kkk := 0 to 255 do for iii := 0 to kkk do
AT[0,kkk,iii] := AT[0,iii,kkk];
end;
//***捠忢崌惉僥亅僽儖惗惉***
if (NormalPal = True)then
begin
for kkk := 0 to 255 do
for iii := 0 to 255 do //寉偔偡傞億僀儞僩
begin
//椉曽偺怓偺拞娫傪弌椡 src dest
rr := (TempPal[kkk,0]*NormalPalAlph + TempPal[iii,0]*(255-NormalPalAlph)) shr 8;
gg := (TempPal[kkk,1]*NormalPalAlph + TempPal[iii,1]*(255-NormalPalAlph)) shr 8;
bb := (TempPal[kkk,2]*NormalPalAlph + TempPal[iii,2]*(255-NormalPalAlph)) shr 8;
AT[1,kkk,iii] := GetNearestPaletteIndex2(RGB(rr,gg,bb));
end;
//捠忢崌惉偺応崌偼0傪儅僗僋怓乮柍曄壔怓乯偲偡傞
for iii := 0 to 255 do AT[1,iii,0] := iii;
end;
//***忔嶼崌惉僥亅僽儖偺惗惉***
if (JyousanPal = True)then
begin
for kkk := 0 to 255 do
for iii := kkk to 255 do //寉偔偡傞億僀儞僩
begin
//椉曽偺怓偺壛嶼傪弌椡
rr := TempPal[kkk,0] - (255-TempPal[iii,0]);
gg := TempPal[kkk,1] - (255-TempPal[iii,1]);
bb := TempPal[kkk,2] - (255-TempPal[iii,2]);
if (rr < 0)then rr := 0;
if (gg < 0)then gg := 0;
if (bb < 0)then bb := 0;
AT[2,kkk,iii] := GetNearestPaletteIndex2(RGB(rr,gg,bb)); //WindowsAPI偵棅偭偰傑偡
end;
//廳暋偡傞晹暘傪揮幨偡傞
for kkk := 0 to 255 do for iii := 0 to kkk do
AT[2,kkk,iii] := AT[2,iii,kkk];
end;
//4096怓媅帡僷儗僢僩惗惉
//偙傟偩偗晛捠偺崌惉曽朄偲堎側傞丅AlphBlend娭悢傪屇傃弌偝側偄尷傝巊傢側偄丅
//ABP[red,green,lue];
for iii := 0 to 15 do
for jjj := 0 to 15 do
for kkk := 0 to 15 do
ABP[iii,jjj,kkk] := GetNearestPaletteIndex2(RGB(iii*17,jjj*17,kkk*17)); //WindowsAPI偵棅偭偰傑偡
//擹搙忣曬桳岠Normal崌惉梡僥亅僽儖
//RGB偵暘偗偰寁嶼屻丄4096Pal偱惗惉
for iii := 0 to 255 do
for jjj := 0 to 31 do
begin
AlphNormal[iii,0,jjj] := TempPal[iii,0]*jjj div 510; //544=17*31
AlphNormal[iii,1,jjj] := TempPal[iii,1]*jjj div 510;
AlphNormal[iii,2,jjj] := TempPal[iii,2]*jjj div 510;
end;
//擹搙忣曬桳岠ADD崌惉梡僥亅僽儖
//壛怓偺棙揰丗擹搙忣曬偑敄偄亖崟偵嬤偄 傪棙梡偡傞
//偁傜偐偠傔丄尨怓仺崟偺僌儔亅僨僔儑儞忣曬傪嶌偭偰偍偔
for iii := 0 to 255 do
for jjj := 0 to 31 do
begin
rr := TempPal[iii,0]*jjj div 31;
gg := TempPal[iii,1]*jjj div 31;
bb := TempPal[iii,2]*jjj div 31;
AlphADD[jjj,iii] := GetNearestPaletteIndex2(RGB(rr,gg,bb));
end;
//擹搙忣曬桳岠DEC崌惉梡僥亅僽儖
//壛怓偺棙揰丗擹搙忣曬偑敄偄亖敀偵嬤偄 傪棙梡偡傞
//偁傜偐偠傔丄尨怓仺敀偺僌儔亅僨僔儑儞忣曬傪嶌偭偰偍偔
for iii := 0 to 255 do
for jjj := 0 to 31 do
begin
rr := (TempPal[iii,0]*jjj + 255*(31-jjj)) div 31;
gg := (TempPal[iii,1]*jjj + 255*(31-jjj)) div 31;
bb := (TempPal[iii,2]*jjj + 255*(31-jjj)) div 31;
AlphDEC[jjj,iii] := GetNearestPaletteIndex2(RGB(rr,gg,bb));
end;
//巊偄廔傢偭偨傜夝曻
end;
//---------------------------------------------------------------
//Stretch椞堟傪惗惉偟傑偡
procedure TAlpha.SetStretchSize(DD : TDDDD);
begin
if (StretchMode = True)then StretchBuff.free;
StretchBuff := TDDDDSurface.CreateOnSystemMemory(DD,DD.ScreenWidth,DD.ScreenHeight,0);
StretchMode := True;
end;
//---------------------------------------------------------------
//僽儗儞僨傿儞僌乮摿庩崌惉乯傪峴偄傑偡丅
procedure TAlpha.Blend(Dest : TDDDDSurFace;dx,dy : Integer;
Src : TDDDDSurFace;rc : TRect;
BM : Byte);
var
dx1,dy1,dx2,dy2,sx1,sy1 : Integer;
dddsd,sddsd:DDSurfaceDesc;
dpix1,dpix2,spix1,spix2 :pBYTE;
jjj,iii,mode : Integer;
begin
//Surface偼懚嵼偟偰傞偐偄側丠
if Dest.IsLost Then Exit;
if Src.IsLost then Exit;
//嵗昗傪巊偄傗偡偄宍偵
dx1 := dx ; dy1 := dy;
dx2 := dx+abs(rc.Right - rc.Left);
dy2 := dy+abs(rc.Bottom - rc.Top);
sx1 := rc.Left ; sy1 := rc.Top;
//BM乮BlendMethod乯偺抣傪僥亅僽儖憡摉偵曄姺
mode := GetBlendMode(BM);
//偼傒弌偟嬛巭
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 ((sx1 < 0) and (sx1 > src.Width))then Exit;
if ((sy1 < 0) and (sy1 > src.Height))then Exit;
if (dx1 < 0)then begin sx1 := sx1 - dx1; dx1 := 0; end;
if (dy1 < 0)then begin sy1 := sy1 - dy1; dy1 := 0; end;
if (dx2 > Dest.Width )then dx2 := Dest.Width;
if (dy2 > Dest.Height)then dy2 := Dest.Height;
if (sx1+abs(dx2-dx1) > Src.Width )then Exit;
if (sy1+abs(dy2-dy1) > Src.Height)then Exit; //dy2 := dy2 + (Src.Height - (sy1+abs(dy2-dy1)));
//Surface傪Lock両
Dest.Lock(dddsd);
dpix1:=dddsd.lpSurface;
Src.Lock(sddsd);
spix1:=sddsd.lpSurface;
//嵗昗傪夋憸儊儌儕忋傾僪儗僗偵曄姺
Inc(dpix1,dx1+dy1*dddsd.lPitch);
Inc(spix1,sx1+sy1*sddsd.lPitch);
//僾儗儞僨傿儞僌偡傞丅
for iii := dy1 to dy2-1 do begin
dpix2 := dpix1;
spix2 := spix1;
for jjj := dx1 to dx2-1 do
begin
//崌惉僷儗僢僩偱怓偺崌惉
dpix2^ := AT[mode,spix2^,dpix2^];
//1Pixel恑傔傞
Inc(dpix2);
Inc(spix2);
end;
//1LINE暘偩偗恑傔傞
Inc(dpix1,dddsd.lPitch);
Inc(spix1,sddsd.lPitch);
end;
//Surface偺Lock夝彍両
Dest.Unlock;
Src.UnLock;
end;
//--------------------------------------------------------------
//怢弅婡擻晅偒僽儗儞僨傿儞僌傪峴偄傑偡
procedure TAlpha.StretchBlend(Dest : TDDDDSurFace;rc1 : Trect;
Src : TDDDDSurFace;rc2 : Trect;
BM : Byte);
begin
//SetStretchSize傪巜掕偟側偄尷傝巊偊側偄
if (StretchMode = False)then exit;
//壖椞堟乮StretchBuff乯偵夋憸傪奼戝偝偣傞
Blt(StretchBuff,rc1, Src,rc2,0);
//壖椞堟偺奼戝偝傟偨夋憸傪僽儗儞僨傿儞僌
Blend(Dest,rc1.left,rc1.top,StretchBuff,rc1,BM);
end;
//--------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -