-- -- (C) 2000 Michal Zalewski -- -- Amazing, brand new Ada fuzz-zoom-rotator -- -- Requires svgalib Ada binding. Available at: -- http://www.gnuada.org/linux/ -- -- gnatmake fuzz -cargs -O3 -ffast-math with Ada.Text_Io,Interfaces.C,Interfaces.C.Strings,Ada.Unchecked_Conversion; with Ada.Calendar.Delays,Ada.Numerics.Aux,SVGALib.VGA; use Ada.Numerics.Aux,SVGALib.VGA,SVGALib,Ada.Text_IO,Interfaces; procedure fuzz is pragma Linker_Options ("-lvga"); pragma Optimize (Time); subtype Wsp_X is Natural range 0 .. 319; subtype Wsp_Y is Natural range 0 .. 199; type Linia is array (Wsp_X) of Byte; type DuzaLinia is array ( -380 .. 380 ) of Byte; type Ekran_Obiekt is array (Wsp_Y) of Linia; type Ekran_Access is access all Ekran_Obiekt; Bufor : Ekran_Obiekt; Ekran : Ekran_Access; Tmp : array ( - 380 .. 380 ) of DuzaLinia; Fuzz : Integer; Phase : Float := 0.0; Phase2 : Float := 1.0; Phase3 : Float := 1.0; Dodaj2 : Float := 0.08; Dodaj : Float := 0.0001; XSin,XCos : Float; X,Y : Integer; MXCos,MXSin : Integer; Hopa : Integer := 4; function Byte_Access_To_Ekran_Access is new Ada.Unchecked_Conversion(Source => Byte_Access,Target => Ekran_Access); procedure Set_Custom_Palette is begin for i in 0 .. 255 loop Set_Palette(i, Unsigned_8(0), Unsigned_8(0), Unsigned_8(Float(i)/4.05) ); end loop; end Set_Custom_Palette; begin for a in Tmp'Range loop for b in DuzaLinia'Range loop Tmp(a)(b) := Unsigned_8 ( Sin(Double(a)/10.0 ) * Sin(Double(b)/10.0 ) * 127.0 + 127.0 ); end loop; end loop; Set_Mode(G320x200x256); Ekran := Byte_Access_To_Ekran_Access(Graph_Mem); Set_Custom_Palette; for a in 0 .. 1000000 loop Phase := Phase + Dodaj; if Phase > 0.1 or Phase < 0.0 then Dodaj := - Dodaj; end if; Phase2 := Phase2 + Dodaj2; Phase3 := Phase3 + abs Dodaj2; if Phase2 > 5.0 or Phase2 < 1.0 then Dodaj2 := - Dodaj2; end if; Hopa := Integer(2.0+Phase2); XSin := Float(Sin(Double(Phase3))) / Phase2; XCos := Float(Cos(Double(Phase3))) / Phase2; Bufor := Ekran_Obiekt'( Others => Linia'(Others => 0) ); for b in Wsp_Y loop Fuzz := Integer ( Float(b) / ( 0.001 + Phase ) ) mod Hopa; for c in 0 .. Linia'Last/Hopa loop Bufor(b)( (a+ Hopa*c) mod ( Linia'Last - Hopa ) + Fuzz ) := Interfaces.Unsigned_8(Fuzz * 50); end loop; Fuzz := Integer ( Float(b+10) / ( 0.02 + ( 0.09 - Phase ) * 2.0 ) ) mod Hopa; for c in 0 .. Linia'Last/Hopa loop Bufor(b)( (a+ Hopa*c) mod ( Linia'Last - Hopa ) + Fuzz ) := Interfaces.Unsigned_8(Fuzz * 50); end loop; MXCos := Integer(Float(b-100)*XCos) - 100; MXSin := Integer(Float(b-100)*XSin) + 160; for c in 0 .. Linia'Last loop X := Integer ( Float(c-160)*XCos ) + MXSin; Y := Integer ( Float(c-160)*XSin ) - MXCos; if Bufor(b)(c) /= 0 and Tmp(Y)(X) /= 0 then Bufor(b)(c) := Tmp(Y)(X); end if; end loop; end loop; Ekran(Ekran'Range) := Bufor(Bufor'Range); end loop; Ada.Calendar.Delays.Delay_For(Standard.duration(10)); end fuzz;