/*
  Simple DirectMedia Layer
  Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>

  This software is provided 'as-is', without any express or implied
  warranty.  In no event will the authors be held liable for any damages
  arising from the use of this software.

  Permission is granted to anyone to use this software for any purpose,
  including commercial applications, and to alter it and redistribute it
  freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not
     claim that you wrote the original software. If you use this software
     in a product, an acknowledgment in the product documentation would be
     appreciated but is not required.
  2. Altered source versions must be plainly marked as such, and must not be
     misrepresented as being the original software.
  3. This notice may not be removed or altered from any source distribution.
*/
#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 = { 0 };
    BITMAPINFO          bmi = { 0 };
    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 = SDL_malloc(surface->h * surface->w * 4 * 2);
    if (pulBitmap == NULL) {
        SDL_OutOfMemory();
        return NULLHANDLE;
    }

    /* pulDst - last line of surface (image) part of the result bitmap */
    pulDst = &pulBitmap[ (surface->h - 1) * surface->w ];
    /* pulDstMask - last line of mask part of the result bitmap */
    pulDstMask = &pulBitmap[ (2 * surface->h - 1) * surface->w ];
    /* pulSrc - first line of source image */
    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;
            }
        }

        /* Set image and mask pointers on one line up */
        pulDst -= surface->w;
        pulDstMask -= surface->w;
        /* Set source image pointer to the next line */
        pulSrc = (PULONG) (((PCHAR)pulSrc) + surface->pitch);
    }

    /* Create system bitmap object. */
    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 {
        /* Create a system pointer object. */
        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 /* SDL_VIDEO_DRIVER_OS2 */

/* vi: set ts=4 sw=4 expandtab: */
