unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Menus; type TForm1 = class(TForm) Image1: TImage; Timer1: TTimer; PopupMenu1: TPopupMenu; Exit1: TMenuItem; procedure DoClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Iterate(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormShow(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure PopupMenu1Popup(Sender: TObject); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Base : Array of tByteArray; Fire : Array of TByteArray; StPt : Array[0..1000,0..1000] of Boolean; implementation {$R *.DFM} Procedure Feed2(X : TImage); Var I,J : Integer; R,W : PByteArray; Z : tByteArray; Begin //0=blue 1=green 2=red For J := 1 to X.Picture.Bitmap.Height - 2 do Begin W := X.Picture.Bitmap.ScanLine[J]; // R := X.Picture.Bitmap.ScanLine[J]; //IF J = X.Picture.Bitmap.Height - 1 Then R := @Base; //New(Z); For I := 0 to 4*(X.Picture.Bitmap.Width - 1) Do Z[i] := W^[I]; If W <> nil then For I := 1 to X.Picture.Bitmap.Width - 2 Do //W^[I*4+2] := ((R[I*4+2]*3+R[(I-1)*4+2]*0+R[(I+1)*4+2]) div 4) mod 256; W^[I*4+2] := ( (R[I*4+2]*2+z[(I-1)*4+2]+z[(I+1)*4+2]+R[(I-1)*4+2]+R[(I+1)*4+2]) div 6) mod 256; End; End; Procedure Feed(X : TImage ); Var I,J : Integer; R,W : PByteArray; Z : tByteArray; Begin //0=blue 1=green 2=red //If X.Height <> Length(Base) Then ShowMessage('bad'); For J := 1 to X.Picture.Bitmap.Height - 2 do Begin W := X.Picture.Bitmap.ScanLine[J]; // For I := 0 to 4*(X.Picture.Bitmap.Width - 1) Do Z[i] := W^[I]; If W <> nil then For I := 1 to X.Picture.Bitmap.Width - 2 Do Begin If (Base[j][4*i+2] = 0) Then If ((Base[J+1][4*i+2] OR Base[j+1][4*(i-1)+2] OR Base[J+1][4*(i+1)+2]) <> 0) Then Begin If Fire[j][4*i+2] >= 100 Then Fire[j][4*i+2] := Fire[j][i*4+2]+Random(50) Else Fire[j][i*4+2] := random(50)+150; Fire[j][i*4] := 200; //w[i*4] := 255; //W^[I*4+2] := Fire[J] End Else Fire[j][i*4+2] := (2*w[4*(i-1)+2] + 3*w[4*(i+1)+2] + 5*fire[j+1][4*i+2]) div 10; End; End; For I := 1 to X.Picture.Bitmap.Height - 2 Do Begin W := X.Picture.Bitmap.ScanLine[i]; For J := 1 to X.Picture.Bitmap.Width - 2 Do Begin if fire[i][j*4] = 200 then w[j*4+2] := 255 Else w[j*4+2] := fire[i][j*4+2] or base[i][j*4+2]; If base[i][j*4+2] = 0 Then Begin w[j*4+1] := Round(w[j*4+2]*(random/5+0.1)); //w[j*4+2] := round(w[j*4+2]*0.99); End; End; End; End; Procedure RandomLine( X : TImage ); Var I,J : Integer; Line : PByteArray; Begin { //0=blue 1=green 2=red For J := 0 to X.Picture.Bitmap.Height - 1 do Begin Line := X.Picture.Bitmap.ScanLine[J]; If Line <> nil then For I := 0 to X.Picture.Bitmap.Width - 1 Do Line^[I*4+2] := random(256); End; } Line := @Base;//X.Picture.Bitmap.ScanLine[X.Picture.Bitmap.Height - 1]; If Line = nil then showMessage('oops'); If Line <> nil then For I := 0 to X.Picture.Bitmap.Width - 1 Do Line^[I*4+2] := random(256); End; procedure TForm1.DoClick(Sender: TObject); Var X, Y : Integer; begin {// Image1.Refresh; RandomLine(Image1); Feed(Image1); Image1.Refresh; ShowMessage('Done'); } Timer1.Enabled := not Timer1.Enabled; end; procedure TForm1.FormCreate(Sender: TObject); var X, Y : Integer; begin { Image1.Picture.Bitmap := TBitmap.Create; For X := 0 to Image1.Width-1 Do For Y := 0 to Image1.Height Do Image1.Canvas.Pixels[X,Y] := clBlack;} Image1.Autosize := True; Image1.Picture.LoadFromFile( 'leaf.bmp' ); ClientWidth := Image1.Width; ClientHeight := Image1.Height; Image1.Refresh; //ShowMessage('lines: ' + inttostr(Image1.Picture.Bitmap.Height)); Image1.Picture.Bitmap.PixelFormat := pf32bit; For Y := 0 to Image1.Height -1 Do Begin SetLength(Fire,Length(Fire)+1); SetLength(Base,Length(Base)+1); For X := 0 to Image1.Width-1 Do Begin Fire[y][4*X+0] := 0; Fire[y][4*X+1] := 0; Fire[y][4*X+2] := 0; Fire[y][4*X+3] := 0; Base[y][4*X+0] := 0; Base[y][4*X+1] := 0; Base[y][4*X+3] := 0; if Image1.Canvas.Pixels[X,Y] mod 256 = 0 Then Base[y][4*x+2] := 0 Else Base[y][4*x+2] := 255; End; End; end; procedure TForm1.Iterate(Sender: TObject); begin //RandomLine(Image1); Feed(Image1); Image1.Refresh; // Application.ProcessMessages; //Sleep(1); end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin IF KEy = vK_SPACE Then IF BorderStyle = bsSingle Then BorderStyle := bsNOne Else BorderStyle := bsSingle; If Key = VK_Escape Then Close; //Application.ProcessMessages; //Repaint; // If Borderstyle = bsNone Then Timer1.Enabled := False Else Timer1.Enabled := True; end; procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin // BorderStyle := bsNone; end; procedure TForm1.FormShow(Sender: TObject); begin Timer1.Enabled := True; end; procedure TForm1.Exit1Click(Sender: TObject); begin Close; end; procedure TForm1.PopupMenu1Popup(Sender: TObject); begin //Timer1.Enabled := False; end; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Timer1.Enabled := Not Timer1.Enabled; end; Initialization end.