#include "../../SDL_internal.h"
#if SDL_VIDEO_DRIVER_OS2
#include "SDL_os2util.h"
HPOINTER utilCreatePointer(SDL_Surface *surface, ULONG ulHotX, ULONG ulHotY)
{
HBITMAP hbm;
BITMAPINFOHEADER2 bmih;
BITMAPINFO bmi;
HPS hps;
PULONG pulBitmap;
PULONG pulDst, pulSrc, pulDstMask;
ULONG ulY, ulX;
HPOINTER hptr = NULLHANDLE;
if (surface->format->format != SDL_PIXELFORMAT_ARGB8888) {
debug_os2("Image format should be SDL_PIXELFORMAT_ARGB8888");
return NULLHANDLE;
}
pulBitmap = (PULONG) SDL_malloc(surface->h * surface->w * 2 * sizeof(ULONG));
if (pulBitmap == NULL) {
SDL_OutOfMemory();
return NULLHANDLE;
}
pulDst = &pulBitmap[ (surface->h - 1) * surface->w ];
pulDstMask = &pulBitmap[ (2 * surface->h - 1) * surface->w ];
pulSrc = (PULONG)surface->pixels;
for (ulY = 0; ulY < surface->h; ulY++) {
for (ulX = 0; ulX < surface->w; ulX++) {
if ((pulSrc[ulX] & 0xFF000000) == 0) {
pulDst[ulX] = 0;
pulDstMask[ulX] = 0xFFFFFFFF;
} else {
pulDst[ulX] = pulSrc[ulX] & 0xFFFFFF;
pulDstMask[ulX] = 0;
}
}
pulDst -= surface->w;
pulDstMask -= surface->w;
pulSrc = (PULONG) (((PCHAR)pulSrc) + surface->pitch);
}
SDL_zero(bmih);
SDL_zero(bmi);
bmih.cbFix = sizeof(BITMAPINFOHEADER2);
bmih.cx = surface->w;
bmih.cy = 2 * surface->h;
bmih.cPlanes = 1;
bmih.cBitCount = 32;
bmih.ulCompression = BCA_UNCOMP;
bmih.cbImage = bmih.cx * bmih.cy * 4;
bmi.cbFix = sizeof(BITMAPINFOHEADER);
bmi.cx = bmih.cx;
bmi.cy = bmih.cy;
bmi.cPlanes = 1;
bmi.cBitCount = 32;
hps = WinGetPS(HWND_DESKTOP);
hbm = GpiCreateBitmap(hps, (PBITMAPINFOHEADER2)&bmih, CBM_INIT,
(PBYTE)pulBitmap, (PBITMAPINFO2)&bmi);
if (hbm == GPI_ERROR) {
debug_os2("GpiCreateBitmap() failed");
} else {
hptr = WinCreatePointer(HWND_DESKTOP, hbm, TRUE, ulHotX, ulHotY);
if (hptr == NULLHANDLE) {
debug_os2("WinCreatePointer() failed");
}
}
GpiDeleteBitmap(hbm);
WinReleasePS(hps);
SDL_free(pulBitmap);
return hptr;
}
#endif