الفريق العربي للهندسة العكسية

نسخة كاملة : Delphi - Cute Plasma Effect
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
اقتباس من الموضوع الأصلي لــ Sn!per X
 
إقتباس :السلام عليكم
Delphi - Cute Plasma Effect

كود:
(*
 Project: Cute Plasma Effect
 Original C++ Source: http://www.hardforum.ru/t80882/
 Ported to delphi by: Sn!per X ^ AT4RE
 Code Type: Delphi / WinAPI
 Release Date: 21-11-2015
*)
program CutePlasmaEffect;


uses Windows, Messages;


Const
 progname = 'Cute plasma';


type
 TIntegerList = array[0..$00FFFFFF] of Integer;
 PIntegerList = ^TIntegerList;


var
 SINTAB : Array [0..255] of Extended;
 pDC : HDC;
 old, ourbitmap: HBITMAP;
 framebuf: PIntegerList;


Procedure render_effect(tick: integer);
var i,j,k: integer;
begin
 tick := round(tick / 4);
 k:= 0;
 For i:=0 To 200-1 do
 begin
   For j:=0 To 320-1 do
   begin
     framebuf^[k] := (RGB(round(SINTAB[(i+tick) and $ff]),
                          round(SINTAB[(j-tick) and $ff]),
                          round(SINTAB[round((SINTAB[tick and $ff])+(k shr 6)) and $ff])));
     Inc(k);
   end;
 end;
end;


Procedure render(HDC: hDC);
begin
 render_effect(GetTickCount());
 BitBlt(hDC,0,0,320,200,pDC,0,0,SRCCOPY);
end;


Procedure deinit_framebuf();
begin
 SelectObject(pDC,old);
 DeleteDC(pDC);
 DeleteObject(ourbitmap);
End;


Procedure init_framebuf();
var
 xHDC: hDC;
 tbitmapinfo : BITMAPINFO;
begin
 xhDC := CreateCompatibleDC(0);
 tbitmapinfo.bmiHeader.biSize:=sizeof(BITMAPINFOHEADER);
 tbitmapinfo.bmiHeader.biWidth:=320;
 tbitmapinfo.bmiHeader.biHeight:=-200; //* top-down */
 tbitmapinfo.bmiHeader.biPlanes:=1;
 tbitmapinfo.bmiHeader.biBitCount:=32;
 tbitmapinfo.bmiHeader.biCompression:=BI_RGB;
 tbitmapinfo.bmiHeader.biSizeImage:=0;
 tbitmapinfo.bmiHeader.biClrUsed:=256;
 tbitmapinfo.bmiHeader.biClrImportant:=256;
 ourbitmap:=CreateDIBSection(xhDC,tbitmapinfo,DIB_RGB_COLORS,Pointer(framebuf),0,0);
 pDC:=CreateCompatibleDC(0);
 old:=SelectObject(pDC,ourbitmap);
 DeleteDC(xhDC);
end;


Function winproc(hWnd,Msg:Longint; wParam : WPARAM; lParam: LPARAM):Longint; stdcall;
var
 xHDC: hDC;
 PtStr: PAINTSTRUCT;
Begin
 Result:= 0;
 Case (Msg) of
   WM_DESTROY:
   Begin
     deinit_framebuf();
     PostQuitMessage(0);
     KillTimer (hWnd, 1);
     Exit;
   End;
   WM_CREATE:
   Begin
     SetTimer (hWnd, 1, 1, nil);
     init_framebuf();
     Exit;
   End;
   WM_TIMER:
   Begin
     InvalidateRgn(hWnd,0, false);
     UpdateWindow (hWnd);
     Exit;
   End;
   WM_PAINT:
   Begin
     xhDC:=BeginPaint(hWnd,PtStr);
     render(xhDC);
     EndPaint(hWnd,PtStr);
     Exit;
   End;
 End;
 Result := DefWindowProc(hWnd, Msg, wParam, lParam);
end;


var winclass: WNDCLASSEX;
   iHWND: hWnd;
   iMSG: msg;
   i : Integer;
begin
 for i:=0 to 255-1 Do
   SINTAB[i]:=sin(((i+1)*3.14159265359)/128)*127+128;


 winclass.cbSize:=sizeof(WNDCLASSEX);
 winclass.style:=CS_DBLCLKS;
 winclass.lpfnWndProc:=@winproc;
 winclass.cbClsExtra:=0;
 winclass.cbWndExtra:=0;
 winclass.hInstance:=hInstance;
 winclass.hIcon:=LoadIcon(0,IDI_WINLOGO);
 winclass.hCursor:=LoadCursor(0,IDC_NO);
 winclass.hbrBackground:=0;
 winclass.lpszMenuName:=0;
 winclass.lpszClassName:=progname;
 winclass.hIconSm:=0;


 if RegisterClassEx(winclass) = 0 Then
   Exit;


 ihWnd:= CreateWindow(
   progname,
   progname,
   WS_SYSMENU or WS_CAPTION or WS_BORDER or WS_OVERLAPPED or WS_VISIBLE or WS_MINIMIZEBOX,
   CW_USEDEFAULT,
   0,
   320+2,
   200+16+2,
   0,
   0,
   hInstance,
   0);
 ShowWindow(ihWnd,SW_SHOW);
 UpdateWindow(ihWnd);
 while GetMessage(iMSG,0,0,0) do
 Begin
   TranslateMessage(iMSG);
   DispatchMessage(iMSG);
 end;
End;
.
BTW, Snapshot image is not good quality