1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-26 10:29:23 +01:00

Optimize GDI renderer by blitting directly to DC

This commit is contained in:
Toni Spets 2011-07-09 16:46:51 +03:00
parent 921684fed8
commit 6c7e656c67

View File

@ -22,10 +22,7 @@
DWORD WINAPI render_soft_main(void) DWORD WINAPI render_soft_main(void)
{ {
HDC memDC = CreateCompatibleDC(ddraw->render.hDC); PBITMAPINFO bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256);
HBITMAP surface = CreateCompatibleBitmap(ddraw->render.hDC, ddraw->width, ddraw->height);
PBITMAPINFO bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFO) + (sizeof(RGBQUAD) * 256) + 1024);
bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi->bmiHeader.biWidth = ddraw->width; bmi->bmiHeader.biWidth = ddraw->width;
@ -34,8 +31,6 @@ DWORD WINAPI render_soft_main(void)
bmi->bmiHeader.biBitCount = ddraw->bpp; bmi->bmiHeader.biBitCount = ddraw->bpp;
bmi->bmiHeader.biCompression = BI_RGB; bmi->bmiHeader.biCompression = BI_RGB;
SelectObject(memDC, surface);
DWORD tick_start = 0; DWORD tick_start = 0;
DWORD tick_end = 0; DWORD tick_end = 0;
DWORD frame_len = 0; DWORD frame_len = 0;
@ -65,15 +60,13 @@ DWORD WINAPI render_soft_main(void)
ddraw->primary->palette->data_rgb = &bmi->bmiColors[0]; ddraw->primary->palette->data_rgb = &bmi->bmiColors[0];
} }
SetDIBits(memDC, surface, 0, ddraw->height, ddraw->primary->surface, bmi, DIB_RGB_COLORS);
if (ddraw->render.width != ddraw->width || ddraw->render.height != ddraw->height) if (ddraw->render.width != ddraw->width || ddraw->render.height != ddraw->height)
{ {
StretchBlt(ddraw->render.hDC, 0, 0, ddraw->render.width, ddraw->render.height, memDC, 0, 0, ddraw->width, ddraw->height, SRCCOPY); StretchDIBits(ddraw->render.hDC, 0, 0, ddraw->render.width, ddraw->render.height, 0, 0, ddraw->width, ddraw->height, ddraw->primary->surface, bmi, DIB_RGB_COLORS, SRCCOPY);
} }
else else
{ {
BitBlt(ddraw->render.hDC, 0, 0, ddraw->width, ddraw->height, memDC, 0, 0, SRCCOPY); SetDIBitsToDevice(ddraw->render.hDC, 0, 0, ddraw->width, ddraw->height, 0, 0, 0, ddraw->height, ddraw->primary->surface, bmi, DIB_RGB_COLORS);
} }
} }
LeaveCriticalSection(&ddraw->cs); LeaveCriticalSection(&ddraw->cs);
@ -92,7 +85,6 @@ DWORD WINAPI render_soft_main(void)
} }
HeapFree(GetProcessHeap(), 0, bmi); HeapFree(GetProcessHeap(), 0, bmi);
DeleteObject(surface);
DeleteDC(memDC);
return TRUE; return TRUE;
} }