You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
4.0 KiB
147 lines
4.0 KiB
#include <windows.h>
|
|
#include <tchar.h>
|
|
|
|
#include "Raster.h"
|
|
|
|
|
|
|
|
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch(msg)
|
|
{
|
|
case WM_SIZE:
|
|
break;
|
|
case WM_CLOSE:
|
|
case WM_DESTROY:
|
|
PostQuitMessage(0);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return DefWindowProc( hWnd, msg, wParam, lParam );
|
|
}
|
|
|
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
|
|
{
|
|
// 1 ×¢²á´°¿ÚÀà
|
|
::WNDCLASSEXA winClass;
|
|
winClass.lpszClassName = "Raster";
|
|
winClass.cbSize = sizeof(::WNDCLASSEX);
|
|
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;
|
|
winClass.lpfnWndProc = windowProc;
|
|
winClass.hInstance = hInstance;
|
|
winClass.hIcon = 0;
|
|
winClass.hIconSm = 0;
|
|
winClass.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
winClass.hbrBackground = (HBRUSH)(BLACK_BRUSH);
|
|
winClass.lpszMenuName = NULL;
|
|
winClass.cbClsExtra = 0;
|
|
winClass.cbWndExtra = 0;
|
|
RegisterClassExA(&winClass);
|
|
|
|
// 2 ´´½¨´°¿Ú
|
|
HWND hWnd = CreateWindowExA(
|
|
NULL,
|
|
"Raster",
|
|
"Raster",
|
|
WS_OVERLAPPEDWINDOW,
|
|
0,
|
|
0,
|
|
480,
|
|
320,
|
|
0,
|
|
0,
|
|
hInstance,
|
|
0
|
|
);
|
|
|
|
UpdateWindow( hWnd );
|
|
ShowWindow(hWnd,SW_SHOW);
|
|
|
|
RECT rt = {0};
|
|
GetClientRect(hWnd,&rt);
|
|
|
|
int width = rt.right - rt.left;
|
|
int height = rt.bottom - rt.top;
|
|
void* buffer = 0;
|
|
|
|
HDC hDC = GetDC(hWnd);
|
|
HDC hMem = ::CreateCompatibleDC(hDC);
|
|
|
|
BITMAPINFO bmpInfor;
|
|
bmpInfor.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
|
bmpInfor.bmiHeader.biWidth = width;
|
|
bmpInfor.bmiHeader.biHeight = -height;
|
|
bmpInfor.bmiHeader.biPlanes = 1;
|
|
bmpInfor.bmiHeader.biBitCount = 32;
|
|
bmpInfor.bmiHeader.biCompression = BI_RGB;
|
|
bmpInfor.bmiHeader.biSizeImage = 0;
|
|
bmpInfor.bmiHeader.biXPelsPerMeter = 0;
|
|
bmpInfor.bmiHeader.biYPelsPerMeter = 0;
|
|
bmpInfor.bmiHeader.biClrUsed = 0;
|
|
bmpInfor.bmiHeader.biClrImportant = 0;
|
|
|
|
HBITMAP hBmp = CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0);
|
|
SelectObject(hMem,hBmp);
|
|
|
|
|
|
CELL::Raster raster(width,height,buffer);
|
|
|
|
|
|
MSG msg = {0};
|
|
while(true)
|
|
{
|
|
if (msg.message == WM_DESTROY
|
|
||msg.message == WM_CLOSE
|
|
||msg.message == WM_QUIT)
|
|
{
|
|
break;
|
|
}
|
|
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
|
|
{
|
|
TranslateMessage( &msg );
|
|
DispatchMessage( &msg );
|
|
}
|
|
raster.clear();
|
|
|
|
CELL::float2 points[] =
|
|
{
|
|
CELL::float2(50,50),
|
|
CELL::float2(200,50),
|
|
CELL::float2(33,88),
|
|
CELL::float2(159,100),
|
|
};
|
|
|
|
CELL::float2 prev[2];
|
|
for (float t = 0 ;t < 1.0f ; t += 0.01f)
|
|
{
|
|
float x = points[0].x * pow(1-t,3)
|
|
+ 3 * points[1].x * t * pow(1-t,2)
|
|
+ 3 * points[2].x * t*t * (1-t)
|
|
+ points[3].x * t * t * t;
|
|
float y = points[0].y * pow(1-t,3)
|
|
+ 3 * points[1].y * t * pow(1-t,2)
|
|
+ 3 * points[2].y * t*t * (1-t)
|
|
+ points[3].y * t * t * t;
|
|
if (t == 0)
|
|
{
|
|
prev[0] = CELL::float2(x,y);
|
|
}
|
|
else
|
|
{
|
|
prev[1] = CELL::float2(x,y);
|
|
raster.drawArrays(CELL::DM_LINES,prev,2);
|
|
prev[0] = prev[1];
|
|
}
|
|
}
|
|
|
|
|
|
raster.drawFilleRect(-10,-10,80,80);
|
|
memcpy(buffer,raster._buffer,raster._width * raster._height * sizeof(CELL::Rgba));
|
|
BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY);
|
|
|
|
}
|
|
|
|
return 0;
|
|
}
|