Removed CURSORICON_IconToCursor now that we support color cursors.
This commit is contained in:
parent
36ed03e246
commit
70e192b9cf
|
@ -348,6 +348,8 @@ Cursor X11DRV_GetCursor( Display *display, CURSORICONINFO *ptr )
|
|||
|
||||
if (pixmapBits && pixmapMask && pixmapMaskInv)
|
||||
{
|
||||
POINT hotspot;
|
||||
|
||||
/* We have to do some magic here, as cursors are not fully
|
||||
* compatible between Windows and X11. Under X11, there
|
||||
* are only 3 possible color cursor: black, white and
|
||||
|
@ -393,8 +395,18 @@ Cursor X11DRV_GetCursor( Display *display, CURSORICONINFO *ptr )
|
|||
XCopyArea( display, pixmapMaskInv, pixmapBits, gc,
|
||||
0, 0, ptr->nWidth, ptr->nHeight, 1, 1 );
|
||||
XSetFunction( display, gc, GXcopy );
|
||||
|
||||
/* Make sure hotspot is valid */
|
||||
hotspot.x = ptr->ptHotSpot.x;
|
||||
hotspot.y = ptr->ptHotSpot.y;
|
||||
if (hotspot.x < 0 || hotspot.x >= ptr->nWidth ||
|
||||
hotspot.y < 0 || hotspot.y >= ptr->nHeight)
|
||||
{
|
||||
hotspot.x = ptr->nWidth / 2;
|
||||
hotspot.y = ptr->nHeight / 2;
|
||||
}
|
||||
cursor = XCreatePixmapCursor( display, pixmapBits, pixmapMask,
|
||||
&fg, &bg, ptr->ptHotSpot.x, ptr->ptHotSpot.y );
|
||||
&fg, &bg, hotspot.x, hotspot.y );
|
||||
}
|
||||
|
||||
/* Now free everything */
|
||||
|
|
|
@ -1877,9 +1877,8 @@ void X11DRV_SysCommandSizeMove( HWND hwnd, WPARAM wParam )
|
|||
|
||||
if( iconic ) /* create a cursor for dragging */
|
||||
{
|
||||
HICON hIcon = GetClassLongA( hwnd, GCL_HICON);
|
||||
if(!hIcon) hIcon = (HICON)SendMessageA( hwnd, WM_QUERYDRAGICON, 0, 0L);
|
||||
if( hIcon ) hDragCursor = CURSORICON_IconToCursor( hIcon, TRUE );
|
||||
hDragCursor = GetClassLongA( hwnd, GCL_HICON);
|
||||
if( !hDragCursor ) hDragCursor = (HCURSOR)SendMessageA( hwnd, WM_QUERYDRAGICON, 0, 0L);
|
||||
if( !hDragCursor ) iconic = FALSE;
|
||||
}
|
||||
|
||||
|
@ -2005,7 +2004,6 @@ void X11DRV_SysCommandSizeMove( HWND hwnd, WPARAM wParam )
|
|||
ShowCursor( FALSE );
|
||||
SetCursor( hOldCursor );
|
||||
}
|
||||
DestroyCursor( hDragCursor );
|
||||
}
|
||||
else if (moved && !DragFullWindows)
|
||||
draw_moving_frame( hdc, &sizingRect, thickframe );
|
||||
|
|
|
@ -84,9 +84,6 @@ typedef struct
|
|||
#define CID_WIN32 0x0004
|
||||
#define CID_NONSHARED 0x0008
|
||||
|
||||
extern HCURSOR16 CURSORICON_IconToCursor( HICON16 hIcon,
|
||||
BOOL bSemiTransparent );
|
||||
|
||||
extern HGLOBAL CURSORICON_Load( HINSTANCE hInstance, LPCWSTR name,
|
||||
int width, int height, int colors,
|
||||
BOOL fCursor, UINT loadflags);
|
||||
|
|
|
@ -51,7 +51,6 @@
|
|||
#include "wine/winbase16.h"
|
||||
#include "wine/winuser16.h"
|
||||
#include "wine/exception.h"
|
||||
#include "palette.h"
|
||||
#include "bitmap.h"
|
||||
#include "cursoricon.h"
|
||||
#include "module.h"
|
||||
|
@ -955,101 +954,6 @@ HGLOBAL CURSORICON_ExtCopy(HGLOBAL Handle, UINT nType,
|
|||
return hNew;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* CURSORICON_IconToCursor
|
||||
*
|
||||
* Converts bitmap to mono and truncates if icon is too large (should
|
||||
* probably do StretchBlt() instead).
|
||||
*/
|
||||
HCURSOR16 CURSORICON_IconToCursor(HICON16 hIcon, BOOL bSemiTransparent)
|
||||
{
|
||||
HCURSOR16 hRet = 0;
|
||||
CURSORICONINFO *pIcon = NULL;
|
||||
|
||||
if(hIcon)
|
||||
if (!(pIcon = (CURSORICONINFO*)GlobalLock16( hIcon ))) return FALSE;
|
||||
if (pIcon->bPlanes * pIcon->bBitsPerPixel == 1)
|
||||
{
|
||||
hRet = CURSORICON_Copy( 0, hIcon );
|
||||
|
||||
|
||||
pIcon = GlobalLock16(hRet);
|
||||
|
||||
pIcon->ptHotSpot.x = pIcon->ptHotSpot.y = 15;
|
||||
|
||||
GlobalUnlock16(hRet);
|
||||
}
|
||||
else
|
||||
{
|
||||
BYTE pAndBits[128];
|
||||
BYTE pXorBits[128];
|
||||
int maxx, maxy, ix, iy, bpp = pIcon->bBitsPerPixel;
|
||||
BYTE* psPtr, *pxbPtr = pXorBits;
|
||||
unsigned xor_width, and_width, val_base = 0xffffffff >> (32 - bpp);
|
||||
BYTE* pbc = NULL;
|
||||
|
||||
CURSORICONINFO cI;
|
||||
|
||||
TRACE_(icon)("[%04x] %ix%i %ibpp (bogus %ibps)\n",
|
||||
hIcon, pIcon->nWidth, pIcon->nHeight, pIcon->bBitsPerPixel, pIcon->nWidthBytes );
|
||||
|
||||
xor_width = BITMAP_GetWidthBytes( pIcon->nWidth, bpp );
|
||||
and_width = BITMAP_GetWidthBytes( pIcon->nWidth, 1 );
|
||||
psPtr = (BYTE *)(pIcon + 1) + pIcon->nHeight * and_width;
|
||||
|
||||
memset(pXorBits, 0, 128);
|
||||
cI.bBitsPerPixel = 1; cI.bPlanes = 1;
|
||||
cI.ptHotSpot.x = cI.ptHotSpot.y = 15;
|
||||
cI.nWidth = 32; cI.nHeight = 32;
|
||||
cI.nWidthBytes = 4; /* 32x1bpp */
|
||||
|
||||
maxx = (pIcon->nWidth > 32) ? 32 : pIcon->nWidth;
|
||||
maxy = (pIcon->nHeight > 32) ? 32 : pIcon->nHeight;
|
||||
|
||||
for( iy = 0; iy < maxy; iy++ )
|
||||
{
|
||||
unsigned shift = iy % 2;
|
||||
|
||||
memcpy( pAndBits + iy * 4, (BYTE *)(pIcon + 1) + iy * and_width,
|
||||
(and_width > 4) ? 4 : and_width );
|
||||
for( ix = 0; ix < maxx; ix++ )
|
||||
{
|
||||
if( bSemiTransparent && ((ix+shift)%2) )
|
||||
{
|
||||
/* set AND bit, XOR bit stays 0 */
|
||||
|
||||
pbc = pAndBits + iy * 4 + ix/8;
|
||||
*pbc |= 0x80 >> (ix%8);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* keep AND bit, set XOR bit */
|
||||
|
||||
unsigned *psc = (unsigned*)(psPtr + (ix * bpp)/8);
|
||||
unsigned val = ((*psc) >> (ix * bpp)%8) & val_base;
|
||||
if(PALETTE_Driver && !PALETTE_Driver->pIsDark(val))
|
||||
{
|
||||
pbc = pxbPtr + ix/8;
|
||||
*pbc |= 0x80 >> (ix%8);
|
||||
}
|
||||
}
|
||||
}
|
||||
psPtr += xor_width;
|
||||
pxbPtr += 4;
|
||||
}
|
||||
|
||||
hRet = CreateCursorIconIndirect16( 0 , &cI, pAndBits, pXorBits);
|
||||
|
||||
if( !hRet ) /* fall back on default drag cursor */
|
||||
hRet = CURSORICON_Copy( 0 ,
|
||||
CURSORICON_Load(0,MAKEINTRESOURCEW(OCR_DRAGOBJECT),
|
||||
GetSystemMetrics(SM_CXCURSOR),
|
||||
GetSystemMetrics(SM_CYCURSOR), 1, TRUE, 0) );
|
||||
}
|
||||
|
||||
return hRet;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* LoadCursor (USER.173)
|
||||
|
|
|
@ -3223,7 +3223,7 @@ DWORD WINAPI DragObject16( HWND16 hwndScope, HWND16 hWnd, UINT16 wObj,
|
|||
MSG msg;
|
||||
LPDRAGINFO16 lpDragInfo;
|
||||
SEGPTR spDragInfo;
|
||||
HCURSOR16 hDragCursor=0, hOldCursor=0, hBummer=0;
|
||||
HCURSOR16 hOldCursor=0, hBummer=0;
|
||||
HGLOBAL16 hDragInfo = GlobalAlloc16( GMEM_SHARE | GMEM_ZEROINIT, 2*sizeof(DRAGINFO16));
|
||||
HCURSOR16 hCurrentCursor = 0;
|
||||
HWND16 hCurrentWnd = 0;
|
||||
|
@ -3239,19 +3239,7 @@ DWORD WINAPI DragObject16( HWND16 hwndScope, HWND16 hWnd, UINT16 wObj,
|
|||
return 0L;
|
||||
}
|
||||
|
||||
if(hCursor)
|
||||
{
|
||||
if( !(hDragCursor = CURSORICON_IconToCursor(hCursor, FALSE)) )
|
||||
{
|
||||
GlobalFree16(hDragInfo);
|
||||
return 0L;
|
||||
}
|
||||
|
||||
if( hDragCursor == hCursor ) hDragCursor = 0;
|
||||
else hCursor = hDragCursor;
|
||||
|
||||
hOldCursor = SetCursor(hDragCursor);
|
||||
}
|
||||
if(hCursor) hOldCursor = SetCursor(hCursor);
|
||||
|
||||
lpDragInfo->hWnd = hWnd;
|
||||
lpDragInfo->hScope = 0;
|
||||
|
@ -3308,11 +3296,7 @@ DWORD WINAPI DragObject16( HWND16 hwndScope, HWND16 hWnd, UINT16 wObj,
|
|||
ReleaseCapture();
|
||||
ShowCursor( FALSE );
|
||||
|
||||
if( hCursor )
|
||||
{
|
||||
SetCursor( hOldCursor );
|
||||
if (hDragCursor) DestroyCursor( hDragCursor );
|
||||
}
|
||||
if( hCursor ) SetCursor( hOldCursor );
|
||||
|
||||
if( hCurrentCursor != hBummer )
|
||||
msg.lParam = SendMessage16( lpDragInfo->hScope, WM_DROPOBJECT,
|
||||
|
@ -3395,4 +3379,3 @@ BOOL WINAPI GetWindowInfo( HWND hwnd, PWINDOWINFO pwi)
|
|||
WIN_ReleasePtr(wndInfo);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue