36 lines
1.0 KiB
C
36 lines
1.0 KiB
C
// 16 august 2014
|
|
|
|
#include "winapi_windows.h"
|
|
#include "_cgo_export.h"
|
|
|
|
// TODO rename to images_windows.c?
|
|
|
|
HBITMAP toBitmap(void *i, intptr_t dx, intptr_t dy)
|
|
{
|
|
BITMAPINFO bi;
|
|
VOID *ppvBits;
|
|
HBITMAP bitmap;
|
|
|
|
ZeroMemory(&bi, sizeof (BITMAPINFO));
|
|
bi.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
|
|
bi.bmiHeader.biWidth = (LONG) dx;
|
|
bi.bmiHeader.biHeight = -((LONG) dy); // negative height to force top-down drawing;
|
|
bi.bmiHeader.biPlanes = 1;
|
|
bi.bmiHeader.biBitCount = 32;
|
|
bi.bmiHeader.biCompression = BI_RGB;
|
|
bi.bmiHeader.biSizeImage = (DWORD) (dx * dy * 4);
|
|
bitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, &ppvBits, 0, 0);
|
|
if (bitmap == NULL)
|
|
xpanic("error creating HBITMAP in toBitmap()", GetLastError());
|
|
// image lists use non-premultiplied RGBA - see http://stackoverflow.com/a/25578789/3408572
|
|
// the TRUE here does the conversion
|
|
dotoARGB(i, (void *) ppvBits, TRUE);
|
|
return bitmap;
|
|
}
|
|
|
|
void freeBitmap(void *bitmap)
|
|
{
|
|
if (DeleteObject((HBITMAP) bitmap) == 0)
|
|
xpanic("error deleting bitmap in freeBitmap()", GetLastError());
|
|
}
|