亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? untwatereffect.pas

?? Delphi實現水波紋效果源碼
?? PAS
字號:
{******************************************************************************}
{                       CnPack For Delphi/C++Builder                           }
{                     中國人自己的開放源碼第三方開發包                         }
{                   (C)Copyright 2001-2005 CnPack 開發組                       }
{                   ------------------------------------                       }
{                                                                              }
{            本開發包是開源的自由軟件,您可以遵照 CnPack 的發布協議來修        }
{        改和重新發布這一程序。                                                }
{                                                                              }
{            發布這一開發包的目的是希望它有用,但沒有任何擔保。甚至沒有        }
{        適合特定目的而隱含的擔保。更詳細的情況請參閱 CnPack 發布協議。        }
{                                                                              }
{            您應該已經和開發包一起收到一份 CnPack 發布協議的副本。如果        }
{        還沒有,可訪問我們的網站:                                            }
{                                                                              }
{            網站地址:http://www.cnpack.org                                   }
{            電子郵件:master@cnpack.org                                       }
{                                                                              }
{******************************************************************************}

{******************************************************************************}
{ Unit Note:                                                                   }
{    The formulas used in this class I found on a website                      }
{    http://freespace.virgin.net/hugo.elias/graphics/x_water.htm               }
{******************************************************************************}

unit untWaterEffect;
{* |<PRE>
================================================================================
* 軟件名稱:界面控件包
* 單元名稱:水波效果處理單元
* 單元作者:周勁羽 (zjy@cnpack.org)
* 備    注:
* 開發平臺:PWinXP SP2 + Delphi 5.0
* 兼容測試:PWin9X/2000/XP + Delphi 5/6
* 本 地 化:該單元中的字符串均符合本地化處理方式
* 單元標識:$Id: CnWaterEffect.pas,v 1.2 2005/06/29 12:43:52 zjy Exp $
* 修改記錄:2005.06.28
              創建單元
================================================================================
|</PRE>}

interface


uses
  Windows, SysUtils, Graphics, Math;

const
  csDefDamping = 20;

type
  PIntArray = ^TIntArray;
  TIntArray = array[0..65535] of Integer;
  
  PPIntArray = ^TPIntArray;
  TPIntArray = array[0..65535] of PIntArray;

  PRGBArray = ^TRGBArray;
  TRGBArray = array[0..65535] of TRGBTriple;

  PPRGBArray = ^TPRGBArray;
  TPRGBArray = array[0..65535] of PRGBArray;

  TWaterDamping = 1..99;

  TWaterEffect = class(TObject)
  private
    FLightModifier: Integer;
    FWidth: Integer;
    FHeight: Integer;
    FBuff1: Pointer;
    FBuff2: Pointer;
    FScanLine1: PPIntArray;
    FScanLine2: PPIntArray;
    FScanLineSrc: PPRGBArray;
    FDamping: TWaterDamping;
    procedure SetDamping(Value: TWaterDamping);
  protected
    procedure CalcWater;
    procedure DrawWater(ALightModifier: Integer; Src, Dst: TBitmap);
  public
    constructor Create;
    destructor Destroy; override;
    procedure ClearWater;
    procedure SetSize(AWidth, AHeight: Integer);
    procedure Render(Src, Dst: TBitmap);
    procedure Blob(x, y: Integer; ARadius, AHeight: Integer);
    property Damping: TWaterDamping read FDamping write SetDamping;
  end;

implementation

{ TCnWaterEffect }

const
  RAND_MAX = $7FFF;

procedure TWaterEffect.Blob(x, y: Integer; ARadius, AHeight: Integer);
var
  Rquad: Integer;
  cx, cy, cyq: Integer;
  Left, Top, Right, Bottom: Integer;
begin
  if (x < 0) or (x > FWidth - 1) then
    x := 1 + ARadius + Random(RAND_MAX) mod (FWidth - 2 * ARadius - 1);
  if (y < 0) or (y > FHeight - 1) then
    y := 1 + ARadius + Random(RAND_MAX) mod (FHeight - 2 * ARadius - 1);

  Left := -Min(x, ARadius);
  Right := Min(FWidth - 1 - x, ARadius);
  Top := -Min(y, ARadius);
  Bottom := Min(FHeight - 1 - y, ARadius);
  Rquad := ARadius * ARadius;
  for cy := Top to Bottom do
  begin
    cyq := cy * cy;
    for cx := Left to Right do
    begin
      if (cx * cx + cyq <= Rquad) then
      begin
        Inc(FScanLine1[cy + y][cx + x], AHeight);
      end;
    end;
  end;
end;

procedure TWaterEffect.CalcWater;
var
  x, y, xl, xr: Integer;
  NewH: Integer;
  P, P1, P2, P3: PIntArray;
  PT: Pointer;
  Rate: Integer;
begin
  Rate := (100 - FDamping) * 256 div 100;
  for y := 0 to FHeight - 1 do
  begin
    P := FScanLine2[y];
    P1 := FScanLine1[Max(y - 1, 0)];
    P2 := FScanLine1[y];
    P3 := FScanLine1[Min(y + 1, FHeight - 1)];
    for x := 0 to FWidth - 1 do
    begin
      xl := Max(x - 1, 0);
      xr := Min(x + 1, FWidth - 1);
      NewH := (P1[xl] + P1[x] + P1[xr] + P2[xl] + P2[xr] + P3[xl] + P3[x] +
        P3[xr]) div 4 - P[x];
      P[x] := NewH * Rate div 256;
    end;
  end;
  
  PT := FBuff1;
  FBuff1 := FBuff2;
  FBuff2 := PT;
  PT := FScanLine1;
  FScanLine1 := FScanLine2;
  FScanLine2 := PT;
end;

procedure TWaterEffect.ClearWater;
begin
 if FBuff1 <> nil then
    ZeroMemory(FBuff1, (FWidth * FHeight) * SizeOf(Integer));
 if FBuff2 <> nil then
    ZeroMemory(FBuff2, (FWidth * FHeight) * SizeOf(Integer));
end;

constructor TWaterEffect.Create;
begin
  inherited;
  FLightModifier := 10;
  FDamping := csDefDamping;
end;

destructor TWaterEffect.Destroy;
begin
  if FBuff1 <> nil then
    FreeMem(FBuff1);
  if FBuff2 <> nil then
    FreeMem(FBuff2);
  if FScanLine1 <> nil then
    FreeMem(FScanLine1);
  if FScanLine2 <> nil then
    FreeMem(FScanLine2);
  if FScanLineSrc <> nil then
    FreeMem(FScanLineSrc);
  inherited;
end;

procedure TWaterEffect.DrawWater(ALightModifier: Integer; Src, Dst:
  TBitmap);
var
  dx, dy: Integer;
  i, c, x, y: Integer;
  P1, P2, P3: PIntArray;
  PSrc, PDst: PRGBArray;
  PSrcDot, PDstDot: PRGBTriple;
  BytesPerLine1, BytesPerLine2: Integer;
begin
  Src.PixelFormat := pf24bit;
  Dst.PixelFormat := pf24bit;
  
  FScanLineSrc[0] := Src.ScanLine[0];
  BytesPerLine1 := Integer(Src.ScanLine[1]) - Integer(FScanLineSrc[0]);
  for i := 1 to FHeight - 1 do
    FScanLineSrc[i] := PRGBArray(Integer(FScanLineSrc[i - 1]) + BytesPerLine1);

  PDst := Dst.ScanLine[0];
  BytesPerLine2 := Integer(Dst.ScanLine[1]) - Integer(PDst);

  for y := 0 to FHeight - 1 do
  begin
    PSrc := FScanLineSrc[y];
    P1 := FScanLine1[Max(y - 1, 0)];
    P2 := FScanLine1[y];
    P3 := FScanLine1[Min(y + 1, FHeight - 1)];
    for x := 0 to FWidth - 1 do
    begin
      dx := P2[Max(x - 1, 0)] - P2[Min(x + 1, FWidth - 1)];
      dy := P1[x] - P3[x];

      if (x + dx >= 0) and (x + dx < FWidth) and (y + dy >= 0) and
        (y + dy < FHeight) then
      begin
        PSrcDot := @FScanLineSrc[y + dy][x + dx];
        PDstDot := @PDst[x];

        c := PSrcDot.rgbtBlue - dx;
        if c < 0 then
          PDstDot.rgbtBlue := 0
        else if c > 255 then
          PDstDot.rgbtBlue := 255
        else
          PDstDot.rgbtBlue := c;

        c := PSrcDot.rgbtGreen - dx;
        if c < 0 then
          PDstDot.rgbtGreen := 0
        else if c > 255 then
          PDstDot.rgbtGreen := 255
        else
          PDstDot.rgbtGreen := c;
          
        c := PSrcDot.rgbtRed - dx;
        if c < 0 then
          PDstDot.rgbtRed := 0
        else if c > 255 then
          PDstDot.rgbtRed := 255
        else
          PDstDot.rgbtRed := c;
      end
      else
      begin
        PDst[x] := PSrc[x];
      end;
    end;
    PDst := PRGBArray(Integer(PDst) + BytesPerLine2);
  end;
end;

procedure TWaterEffect.Render(Src, Dst: TBitmap);
begin
  CalcWater;
  DrawWater(FLightModifier, Src, Dst);
end;

procedure TWaterEffect.SetDamping(Value: TWaterDamping);
begin
  if (Value >= Low(TWaterDamping)) and (Value <= High(TWaterDamping)) then
    FDamping := Value;
end;

procedure TWaterEffect.SetSize(AWidth, AHeight: Integer);
var
  i: Integer;
begin
  if (AWidth <= 0) or (AHeight <= 0) then
  begin
    AWidth := 0;
    AHeight := 0;
  end;
  
  FWidth := AWidth;
  FHeight := AHeight;
  ReallocMem(FBuff1, FWidth * FHeight * SizeOf(Integer));
  ReallocMem(FBuff2, FWidth * FHeight * SizeOf(Integer));
  ReallocMem(FScanLine1, FHeight * SizeOf(PIntArray));
  ReallocMem(FScanLine2, FHeight * SizeOf(PIntArray));
  ReallocMem(FScanLineSrc, FHeight * SizeOf(PRGBArray));
  ClearWater;

  if FHeight > 0 then
  begin
    FScanLine1[0] := FBuff1;
    FScanLine2[0] := FBuff2;
    for i := 1 to FHeight - 1 do
    begin
      FScanLine1[i] := @FScanLine1[i - 1][FWidth];
      FScanLine2[i] := @FScanLine2[i - 1][FWidth];
    end;
  end;    
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美专区亚洲专区| 色狠狠综合天天综合综合| 亚洲成av人片在线| 久久国产综合精品| 国产成人av电影在线| 91在线精品秘密一区二区| 欧美视频三区在线播放| 欧美成人国产一区二区| 国产精品麻豆一区二区| 五月婷婷激情综合网| 国产麻豆一精品一av一免费| 91捆绑美女网站| 日韩欧美国产精品| 国产精品理论片| 免费高清在线一区| 97se亚洲国产综合自在线| 欧美一区二区三区免费视频| 欧美极品少妇xxxxⅹ高跟鞋| 一区二区三区国产精品| 国产尤物一区二区| 91精品国产综合久久蜜臀| 国产精品久久久久影院老司| 久久精品国产精品亚洲红杏| 在线观看av一区二区| 久久人人97超碰com| 日韩精品福利网| 91国在线观看| 国产精品毛片久久久久久 | 波多野结衣在线aⅴ中文字幕不卡| 日本乱人伦一区| 国产调教视频一区| 日韩高清一级片| 欧美影院一区二区| 日韩美女视频19| 成人精品国产一区二区4080| 日韩欧美国产一区在线观看| 亚洲国产精品久久久久秋霞影院 | 欧美成人综合网站| 亚洲成人精品在线观看| 色婷婷国产精品| 综合激情成人伊人| 成人在线一区二区三区| 久久久精品一品道一区| 久久国产精品色婷婷| 欧美精品久久久久久久多人混战| 最新国产成人在线观看| 狠狠色丁香久久婷婷综合_中| 欧美一级专区免费大片| 午夜精品久久久久久| 欧美日韩在线免费视频| 亚洲国产wwwccc36天堂| 欧美日韩亚洲综合在线| 亚洲一区二区成人在线观看| 在线免费观看日本欧美| 日韩午夜精品电影| 亚洲成av人**亚洲成av**| 成人av资源站| 中文字幕av在线一区二区三区| 国产一区二区三区香蕉| 久久九九久久九九| 国产一区二区三区四区在线观看| 久久综合色8888| 国产成人亚洲综合a∨婷婷| 国产三级一区二区三区| 成熟亚洲日本毛茸茸凸凹| 欧美国产精品中文字幕| 日本韩国欧美在线| 亚洲妇女屁股眼交7| 欧美一区二区大片| 久99久精品视频免费观看| 欧美吻胸吃奶大尺度电影| 亚洲精品v日韩精品| 成人精品国产免费网站| 一区二区三区日韩精品| 欧美三级三级三级爽爽爽| 日韩二区在线观看| 国产日韩精品视频一区| 91免费版在线| 亚洲高清视频的网址| 精品国产乱码久久久久久老虎 | 美女性感视频久久| 日本一区二区在线不卡| 91亚洲精品久久久蜜桃网站| 日韩专区中文字幕一区二区| 日韩精品一区国产麻豆| www.欧美亚洲| 日韩电影在线一区| 国产精品欧美综合在线| 精品1区2区3区| 国产精品一二三在| 一区二区三区.www| 日韩视频免费直播| 成人性视频网站| 亚洲电影中文字幕在线观看| 精品成人私密视频| 欧美亚洲免费在线一区| 激情久久五月天| 亚洲女厕所小便bbb| 精品sm捆绑视频| 欧美日韩中字一区| 成人一区二区在线观看| 日韩国产在线观看| 亚洲人成网站影音先锋播放| 欧美一二区视频| 欧美性做爰猛烈叫床潮| 不卡一区在线观看| 国产在线精品一区二区夜色| 亚洲一区av在线| 中文字幕在线一区二区三区| 日韩一区二区三区电影在线观看 | 日韩欧美精品在线视频| 91麻豆国产精品久久| 国产成人精品一区二| 日韩黄色片在线观看| 亚洲欧美日韩国产手机在线| 久久蜜桃一区二区| 日韩视频在线你懂得| 欧美性videosxxxxx| 97久久久精品综合88久久| 国产麻豆精品一区二区| 视频一区欧美日韩| 亚洲国产成人高清精品| 亚洲精品国产第一综合99久久| 欧美激情一区在线| 久久久久国产精品麻豆ai换脸| 日韩亚洲电影在线| 欧美色手机在线观看| 色94色欧美sute亚洲线路一ni| 成人一区二区三区视频在线观看| 狠狠色丁香九九婷婷综合五月| 天天射综合影视| 视频一区二区欧美| 日本vs亚洲vs韩国一区三区二区| 丝袜美腿亚洲综合| 午夜影视日本亚洲欧洲精品| 午夜精品福利一区二区蜜股av| 亚洲国产日韩a在线播放性色| 一区二区三区在线播| 亚洲第一精品在线| 亚洲丶国产丶欧美一区二区三区| 亚洲一区电影777| 中文字幕日韩av资源站| 亚洲天堂a在线| 亚洲精品国产第一综合99久久| 日本一区二区高清| 中文字幕一区二区三区精华液| 国产亚洲1区2区3区| 国产欧美一区二区精品婷婷| 久久久不卡影院| 综合欧美一区二区三区| 亚洲一区二三区| 蜜芽一区二区三区| 国产精品亚洲专一区二区三区| 国产91丝袜在线18| 在线视频亚洲一区| 欧美一级国产精品| 国产精品免费观看视频| 依依成人精品视频| 老司机午夜精品99久久| 成人网男人的天堂| 欧美性三三影院| 久久久久久久久久看片| 亚洲色图一区二区三区| 日韩成人av影视| 国产成人免费在线视频| 欧美性猛片xxxx免费看久爱| 日韩一卡二卡三卡四卡| 国产精品色哟哟网站| 亚洲图片自拍偷拍| 国产一区二区三区免费播放| 色一情一乱一乱一91av| 欧美不卡一区二区| 亚洲精选免费视频| 久久国产精品露脸对白| www.日韩av| 91精品福利在线一区二区三区| 国产免费成人在线视频| 天天做天天摸天天爽国产一区| 国产成人在线视频免费播放| 欧美四级电影在线观看| 国产视频亚洲色图| 午夜国产不卡在线观看视频| 亚洲电影一级黄| 国产曰批免费观看久久久| 欧美日韩中文字幕精品| 国产欧美日韩另类一区| 日日夜夜精品视频免费 | 日韩精品一区第一页| 91亚洲永久精品| 成人欧美一区二区三区在线播放| 韩国在线一区二区| 精品国产免费人成电影在线观看四季| 天天色天天操综合| 666欧美在线视频| 欧美a一区二区| 日韩一卡二卡三卡| 精品一区二区三区的国产在线播放| 欧美日韩精品二区第二页| 亚洲在线观看免费视频| 欧美性一区二区|