⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alphalib.pas

📁 维修店名称 陕西申元电子有限公司 店面地址 西安市友谊东路242号西海大厦一层 维修咨询 8008105858(免费) 或 010-64751880
💻 PAS
📖 第 1 页 / 共 3 页
字号:
        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 + -