windows-nt/Source/XPSP1/NT/base/mvdm/wow16/user/rmcreate.c

317 lines
9.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/****************************************************************************/
/* */
/* RMCREATE.C - */
/* */
/* Resource creating Routines. */
/* */
/****************************************************************************/
#define RESOURCESTRINGS
#include "user.h"
#ifdef NOT_USED_ANYMORE
#define NSMOVE 0x0010
HGLOBAL FAR PASCAL DirectResAlloc(HGLOBAL, WORD, WORD);
/******************************************************************************
**
** CreateCursorIconIndirect()
**
** This is the common function called by CreateCursor and
** CreateIcon()
** DirectResAlloc() is called instead of GlobalAlloc() because
** the Icons/Cursors created by one instance of the app can be used in
** a WNDCLASS structure to Register a class which will be used by other
** instances of the app and when the instance that created the icons/
** cursors terminates, the resources SHOULD NOT BE FREED; If GlobalAlloc()
** is used this is what will happen; At the same time, when the last
** instance also dies, the memory SHOULD BE FREED; To achieve this,
** DirectResAlloc() is used instead of GlobalAlloc();
**
******************************************************************************/
HGLOBAL CALLBACK CreateCursorIconIndirect(HINSTANCE hInstance,
LPCURSORSHAPE lpHeader,
CONST VOID FAR* lpANDplane,
CONST VOID FAR* lpXORplane)
{
register WORD ANDmaskSize;
register WORD XORmaskSize;
WORD wTotalSize;
HRSRC hResource;
LPSTR lpRes;
ANDmaskSize = lpHeader -> cbWidth * lpHeader -> cy;
XORmaskSize = (((lpHeader -> cx * lpHeader -> BitsPixel + 0x0F) & ~0x0F)
>> 3) * lpHeader -> cy * lpHeader -> Planes;
/* It is assumed that Cursor/Icon size won't be more than 64K */
wTotalSize = sizeof(CURSORSHAPE) + ANDmaskSize + XORmaskSize;
#ifdef NEVER
/* Allocate the required memory */
if((hResource = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT | GMEM_SHARE,
(DWORD)wTotalSize)) == NULL)
return(NULL);
#else
/* Let us preserve the long pointers */
SwapHandle(&lpANDplane);
SwapHandle(&lpXORplane);
hResource = DirectResAlloc(hInstance, NSMOVE, wTotalSize);
/* Let us restore the long pointers */
SwapHandle(&lpANDplane);
SwapHandle(&lpXORplane);
if(hResource == NULL)
return(NULL);
#endif
if(!(lpRes = GlobalLock(hResource)))
{
GlobalFree(hResource);
return(NULL);
}
LCopyStruct((LPSTR)lpHeader, lpRes, sizeof(CURSORSHAPE));
lpRes += sizeof(CURSORSHAPE);
LCopyStruct(lpANDplane, lpRes, ANDmaskSize);
lpRes += ANDmaskSize;
LCopyStruct(lpXORplane, lpRes, XORmaskSize);
GlobalUnlock(hResource);
return(hResource);
}
/******************************************************************************
**
** CreateCursor()
**
** This is the API call to create a Cursor "on-the-fly";
**
*******************************************************************************/
HCURSOR API ICreateCursor(hInstance, iXhotspot, iYhotspot, iWidth,
iHeight, lpANDplane, lpXORplane)
HINSTANCE hInstance;
int iXhotspot;
int iYhotspot;
int iWidth;
int iHeight;
CONST VOID FAR* lpANDplane;
CONST VOID FAR* lpXORplane;
{
CURSORSHAPE Header;
Header.xHotSpot = iXhotspot;
Header.yHotSpot = iYhotspot;
Header.cx = iWidth;
Header.cy = iHeight;
Header.Planes = 1; /* Cursors are only monochrome */
Header.BitsPixel = 1;
Header.cbWidth = ((iWidth + 0x0F) & ~0x0F) >> 3;
return(CreateCursorIconIndirect(hInstance, &Header,
lpANDplane, lpXORplane));
}
/******************************************************************************
**
** CreateIcon()
**
** This is the API call to create an Icon "on-the-fly";
**
*******************************************************************************/
HICON API ICreateIcon(hInstance, iWidth, iHeight, bPlanes,
bBitsPixel, lpANDplane, lpXORplane)
HINSTANCE hInstance;
int iWidth;
int iHeight;
BYTE bPlanes;
BYTE bBitsPixel;
CONST VOID FAR* lpANDplane;
CONST VOID FAR* lpXORplane;
{
CURSORSHAPE Header;
Header.xHotSpot = iWidth/2;
Header.yHotSpot = iHeight/2;
Header.cx = iWidth;
Header.cy = iHeight;
Header.Planes = bPlanes; /* Icons can be in color */
Header.BitsPixel = bBitsPixel;
Header.cbWidth = ((iWidth + 0x0F) & ~0x0F) >> 3;
return(CreateCursorIconIndirect(hInstance, (LPCURSORSHAPE)&Header,
lpANDplane, lpXORplane));
}
/******************************************************************************
*
* DestroyIcon(hIcon)
* This can be called to delete only those icons created "on the fly"
* using the CreateIcon() function
* Returns:
* TRUE if successful, FALSE otherwise.
*
******************************************************************************/
BOOL API IDestroyIcon(HICON hIcon)
{
return(!FreeResource(hIcon));
}
/******************************************************************************
*
* DestroyCursor(hIcon)
* This can be called to delete only those icons created "on the fly"
* using the CreateIcon() function
* Returns:
* TRUE if successful, FALSE otherwise.
*
******************************************************************************/
BOOL API IDestroyCursor(HCURSOR hCursor)
{
if (hCursor == hCurCursor)
{
/* #12068: if currently selected cursor resore arrow cursor and RIP [lalithar] */
SetCursor(hCursNormal);
DebugErr(DBF_ERROR, "DestroyCursor: Destroying current cursor");
}
return(!FreeResource(hCursor));
}
#endif /* NOT_USED_ANYMORE */
/****************************************************************************
**
** DumpIcon()
**
** This function is called to get the details of a given Icon;
**
** The caller must lock hIcon using LockResource() and pass the pointer
** thro lpIcon; This is the pointer to the header structure;
** Thro lpHeaderSize, the size of header is returned;
** Thro lplpANDplane and lplpXORplane pointers to actual bit info is
** returned;
** This function returns a DWORD with the size of AND plane in loword
** and size of XOR plane in hiword;
**
****************************************************************************/
DWORD CALLBACK DumpIcon(LPSTR lpIcon,
WORD FAR * lpHeaderSize,
LPSTR FAR * lplpANDplane,
LPSTR FAR * lplpXORplane)
{
register WORD ANDmaskSize;
register WORD XORmaskSize;
LPCURSORSHAPE lpHeader;
*lpHeaderSize = sizeof(CURSORSHAPE);
if(!lpIcon)
return((DWORD)0);
lpHeader = (LPCURSORSHAPE)lpIcon;
ANDmaskSize = lpHeader -> cbWidth * lpHeader -> cy;
XORmaskSize = (((lpHeader -> cx * lpHeader -> BitsPixel + 0x0F) & ~0x0F)
>> 3) * lpHeader -> cy * lpHeader -> Planes;
*lplpANDplane = (lpIcon += sizeof(CURSORSHAPE));
*lplpXORplane = (lpIcon + ANDmaskSize);
return(MAKELONG(ANDmaskSize, XORmaskSize));
}
#ifdef NOT_USED_ANYMORE
/****************************************************************************
**
** GetInternalIconHeader(lpIcon, lpDestBuff)
**
** This function has been added to fix bug #6351 with cornerstone
** XTRA_LARGE display driver. (It uses 64 X 64 Icons; Internally we
** keep the size as 32 X 32. Progman must know this internal size sothat
** it can tell that to WinOldApp.
****************************************************************************/
void API IGetInternalIconHeader(LPSTR lpIcon, LPSTR lpDestBuff)
{
LCopyStruct(lpIcon, lpDestBuff, sizeof(CURSORSHAPE));
}
#endif /* NOT_USED_ANYMORE */
/* APIs to make a copy of an icon or cursor */
HICON API ICopyIcon(HINSTANCE hInstance, HICON hIcon)
{
LPSTR lpAND;
LPSTR lpXOR;
LPSTR lpIcon;
WORD wHeaderSize;
HICON hIconCopy;
LPCURSORSHAPE lpHeader;
lpIcon = LockResource(hIcon);
if (!lpIcon)
return NULL;
lpHeader = (LPCURSORSHAPE)lpIcon;
DumpIcon(lpIcon, &wHeaderSize, &lpAND, &lpXOR);
hIconCopy = CreateIcon(hInstance,
lpHeader->cx,
lpHeader->cy,
lpHeader->Planes,
lpHeader->BitsPixel,
lpAND, lpXOR);
UnlockResource(hIcon);
return(hIconCopy);
}
HCURSOR API ICopyCursor(HINSTANCE hInstance, HICON hCursor)
{
LPSTR lpAND;
LPSTR lpXOR;
LPSTR lpCursor;
WORD wHeaderSize;
HCURSOR hCursorCopy;
LPCURSORSHAPE lpHeader;
lpCursor = LockResource(hCursor);
if (!lpCursor)
return NULL;
lpHeader = (LPCURSORSHAPE)lpCursor;
DumpIcon(lpCursor, &wHeaderSize, &lpAND, &lpXOR);
hCursorCopy = CreateCursor(hInstance,
lpHeader->xHotSpot,
lpHeader->yHotSpot,
lpHeader->cx,
lpHeader->cy,
lpAND, lpXOR);
UnlockResource(hCursor);
return(hCursorCopy);
}