Ignore:
Timestamp:
Mar 27, 2001, 6:17:52 PM (24 years ago)
Author:
sandervl
Message:

cursor handling updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/oslibres.cpp

    r4573 r5385  
    1 /* $Id: oslibres.cpp,v 1.11 2000-11-09 18:15:18 sandervl Exp $ */
     1/* $Id: oslibres.cpp,v 1.12 2001-03-27 16:17:52 sandervl Exp $ */
    22/*
    33 * Window API wrappers for OS/2
     
    2222#include "oslibmsg.h"
    2323#include "oslibgdi.h"
     24#include "oslibres.h"
    2425#include "pmwindow.h"
    2526
     
    228229}
    229230//******************************************************************************
     231//NOTE: Depends on origin of bitmap data!!!
     232//      Assumes 1 bpp bitmaps have a top left origin and all others have a bottom left origin
     233//******************************************************************************
     234HANDLE OSLibWinCreateCursor(CURSORICONINFO *pInfo, char *pAndBits, BITMAP_W *pAndBmp, char *pXorBits, BITMAP_W *pXorBmp)
     235{
     236 POINTERINFO  pointerInfo = {0};
     237 HANDLE       hPointer;
     238 HBITMAP      hbmColor = 0, hbmMask = 0;
     239 BITMAPINFO2 *pBmpColor, *pBmpMask;
     240 int          masksize, colorsize, rgbsize, i;
     241 HPS          hps;
     242 char        *dest, *src;
     243
     244    hps = WinGetScreenPS(HWND_DESKTOP);
     245    masksize = sizeof(BITMAPINFO2) + (pAndBmp->bmHeight * 2 * pAndBmp->bmWidthBytes) + 2*sizeof(RGB2);
     246    pBmpMask = (BITMAPINFO2 *)malloc(masksize);
     247    if(pBmpMask == NULL) {
     248        DebugInt3();
     249        return 0;
     250    }
     251    memset(pBmpMask, 0, masksize);
     252    pBmpMask->cbFix             = sizeof(BITMAPINFOHEADER2);
     253    pBmpMask->cx                = (USHORT)pAndBmp->bmWidth;
     254    pBmpMask->cy                = (USHORT)pAndBmp->bmHeight*2;
     255    pBmpMask->cPlanes           = pAndBmp->bmPlanes;
     256    pBmpMask->cBitCount         = 1;
     257    pBmpMask->ulCompression     = BCA_UNCOMP;
     258    pBmpMask->ulColorEncoding   = BCE_RGB;
     259    memset(&pBmpMask->argbColor[0], 0, sizeof(RGB2));
     260    memset(&pBmpMask->argbColor[1], 0xff, sizeof(RGB)); //not the reserved byte
     261    //Xor bits are already 0
     262    //copy And bits (must reverse scanlines because origin is top left instead of bottom left)
     263    src  = pAndBits;
     264    dest = ((char *)&pBmpMask->argbColor[2]) + (pAndBmp->bmHeight * 2 - 1) * (pAndBmp->bmWidthBytes);
     265    for(i=0;i<pAndBmp->bmHeight;i++) {
     266        memcpy(dest, src, pAndBmp->bmWidthBytes);
     267        dest -= pAndBmp->bmWidthBytes;
     268        src  += pAndBmp->bmWidthBytes;
     269    }
     270    hbmMask = GpiCreateBitmap(hps, (BITMAPINFOHEADER2 *)pBmpMask, CBM_INIT,
     271                              (PBYTE)&pBmpMask->argbColor[2], pBmpMask);
     272
     273    if(hbmMask == GPI_ERROR) {
     274        dprintf(("OSLibWinCreatePointer: GpiCreateBitmap failed!"));
     275        WinReleasePS(hps);
     276        free(pBmpMask);
     277        return 0;
     278    }
     279    if(pXorBits)
     280    {//color bitmap present
     281        RGBQUAD *rgb;
     282        RGB2    *os2rgb;
     283
     284        if(pXorBmp->bmBitsPixel <= 8)
     285             rgbsize = (1<<pXorBmp->bmBitsPixel)*sizeof(RGB2);
     286        else rgbsize = 0;
     287
     288        colorsize = sizeof(BITMAPINFO2) + (pXorBmp->bmHeight * pXorBmp->bmWidthBytes) + rgbsize;
     289        pBmpColor = (BITMAPINFO2 *)malloc(colorsize);
     290        if(pBmpColor == NULL) {
     291            DebugInt3();
     292            return 0;
     293        }
     294        memset(pBmpColor, 0, colorsize);
     295        pBmpColor->cbFix            = sizeof(BITMAPINFOHEADER2);
     296        pBmpColor->cx               = (USHORT)pXorBmp->bmWidth;
     297        pBmpColor->cy               = (USHORT)pXorBmp->bmHeight;
     298        pBmpColor->cPlanes          = pXorBmp->bmPlanes;
     299        pBmpColor->cBitCount        = pXorBmp->bmBitsPixel;
     300        pBmpColor->ulCompression    = BCA_UNCOMP;
     301        pBmpColor->ulColorEncoding  = BCE_RGB;
     302
     303            os2rgb                      = &pBmpColor->argbColor[0];
     304            rgb                         = (RGBQUAD *)(pXorBits);
     305
     306            if(pXorBmp->bmBitsPixel <= 8) {
     307                for(i=0;i<(1<<pXorBmp->bmBitsPixel);i++) {
     308                        os2rgb->bRed   = rgb->rgbRed;
     309                        os2rgb->bBlue  = rgb->rgbBlue;
     310                        os2rgb->bGreen = rgb->rgbGreen;
     311                        os2rgb++;
     312                        rgb++;
     313                }
     314        }
     315
     316        if(pXorBmp->bmBitsPixel == 1) {
     317                //copy Xor bits (must reverse scanlines because origin is top left instead of bottom left)
     318                src  = (char *)rgb;
     319                dest = ((char *)os2rgb) + (pXorBmp->bmHeight - 1) * pXorBmp->bmWidthBytes;
     320                for(i=0;i<pXorBmp->bmHeight;i++) {
     321                    memcpy(dest, src, pXorBmp->bmWidthBytes);
     322                    dest -= pXorBmp->bmWidthBytes;
     323                    src  += pXorBmp->bmWidthBytes;
     324                }
     325        }
     326        else    memcpy(os2rgb, rgb, pXorBmp->bmHeight * pXorBmp->bmWidthBytes);
     327
     328        hbmColor = GpiCreateBitmap(hps, (BITMAPINFOHEADER2 *)pBmpColor, CBM_INIT,
     329                              (PBYTE)os2rgb, pBmpColor);
     330
     331        if(hbmColor == GPI_ERROR) {
     332                dprintf(("OSLibWinCreateIcon: GpiCreateBitmap failed!"));
     333                GpiDeleteBitmap(hbmMask);
     334                WinReleasePS(hps);
     335                free(pBmpMask);
     336                return 0;
     337        }
     338    }
     339
     340    pointerInfo.fPointer   = TRUE;
     341    pointerInfo.xHotspot   = pInfo->ptHotSpot.x;
     342    pointerInfo.yHotspot   = mapY(pInfo->nHeight, pInfo->ptHotSpot.y);
     343    pointerInfo.hbmColor   = hbmColor;
     344    pointerInfo.hbmPointer = hbmMask;
     345    hPointer = WinCreatePointerIndirect(HWND_DESKTOP, &pointerInfo);
     346
     347    if(hPointer == NULL) {
     348        dprintf(("OSLibWinCreateCursor: WinCreatePointerIndirect failed! (lasterr=%x)", WinGetLastError(GetThreadHAB())));
     349    }
     350    GpiDeleteBitmap(hbmMask);
     351    if(hbmColor) GpiDeleteBitmap(hbmColor);
     352    WinReleasePS(hps);
     353
     354    free(pBmpMask);
     355    free(pBmpColor);
     356    return hPointer;
     357}
     358//******************************************************************************
    230359//******************************************************************************
    231360HANDLE OSLibWinQuerySysIcon(ULONG type,INT w,INT h)
     
    332461//******************************************************************************
    333462//******************************************************************************
     463VOID OSLibWinDestroyPointer(HANDLE hPointer)
     464{
     465    WinDestroyPointer(hPointer);
     466}
     467//******************************************************************************
     468//******************************************************************************
     469BOOL OSLibWinSetPointer(HANDLE hPointer)
     470{
     471    return WinSetPointer(HWND_DESKTOP, hPointer);
     472}
     473//******************************************************************************
     474//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.