1 static char RCSId[] = "$Id: resource.c,v 1.4 1993/07/04 04:04:21 root Exp root $";
2 static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
12 #include "prototypes.h"
22 /* #define DEBUG_RESOURCE */
23 /* #undef DEBUG_RESOURCE */
24 /* #define DEBUG_ACCEL */
25 /* #undef DEBUG_ACCEL */
27 #include "../rc/sysresbm.h"
29 #define MIN(a,b) ((a) < (b) ? (a) : (b))
32 extern HINSTANCE hSysRes;
34 extern int NE_FindResource(HANDLE, LPSTR, LPSTR, RESOURCE *);
35 extern int PE_FindResource(HANDLE, LPSTR, LPSTR, RESOURCE *);
36 extern HBITMAP OBM_LoadOEMBitmap( WORD id ); /* objects/oembitmap.c */
38 #define PrintId(name) \
39 if (HIWORD((DWORD)name)) \
40 printf(", %s", name); \
42 printf(", #%d", (int) name);
44 /**********************************************************************
45 * FindResource [KERNEL.60]
47 HANDLE FindResource(HANDLE instance, LPSTR name, LPSTR type)
54 printf("FindResource(%04X", instance);
60 if (instance == (HANDLE)NULL)
63 /* FIXME: did we already find this one ? */
65 if ((rh = GlobalAlloc(GMEM_MOVEABLE, sizeof(RESOURCE))) == 0)
68 r = (RESOURCE *)GlobalLock(rh);
74 if (HIWORD((DWORD)name))
75 r->name = strdup(name);
79 if (HIWORD((DWORD)type))
80 r->type = strdup(type);
84 r->wpnt = GetFileInfo(instance);
85 r->fd = dup(r->wpnt->fd);
87 status = NE_FindResource(instance, name, type, r);
89 status = PE_FindResource(instance, name, type, r);
92 if (HIWORD((DWORD)r->name))
95 if (HIWORD((DWORD)r->type))
106 /**********************************************************************
107 * AllocResource [KERNEL.66]
109 HANDLE AllocResource(HANDLE instance, HANDLE hResInfo, DWORD dwSize)
114 dprintf_resource(stddeb, "AllocResource(%04X, %04X, %08X);\n",
115 instance, hResInfo, (int) dwSize);
117 if (instance == (HANDLE)NULL)
120 if ((r = (RESOURCE *)GlobalLock(hResInfo)) == NULL)
123 image_size = r->size;
126 r->rsc_mem = GlobalAlloc(GMEM_MOVEABLE, image_size);
128 r->rsc_mem = GlobalAlloc(GMEM_MOVEABLE, dwSize);
130 GlobalUnlock(hResInfo);
135 /**********************************************************************
136 * AccessResource [KERNEL.64]
138 int AccessResource(HANDLE instance, HANDLE hResInfo)
143 dprintf_resource(stddeb, "AccessResource(%04X, %04X);\n",
146 if (instance == (HANDLE)NULL)
149 if ((r = (RESOURCE *)GlobalLock(hResInfo)) == NULL)
153 lseek(fd, r->offset, SEEK_SET);
154 GlobalUnlock(hResInfo);
159 /**********************************************************************
160 * SizeofResource [KERNEL.65]
162 WORD SizeofResource(HANDLE instance, HANDLE hResInfo)
167 dprintf_resource(stddeb, "SizeofResource(%04X, %04X);\n",
170 if (instance == (HANDLE)NULL)
173 if ((r = (RESOURCE *)GlobalLock(hResInfo)) == NULL)
177 GlobalUnlock(hResInfo);
182 /**********************************************************************
183 * LoadResource [KERNEL.61]
185 HANDLE LoadResource(HANDLE instance, HANDLE hResInfo)
192 dprintf_resource(stddeb, "LoadResource(%04X, %04X);\n", instance, hResInfo);
194 if (instance == (HANDLE)NULL)
197 if ((r = (RESOURCE *)GlobalLock(hResInfo)) == NULL)
200 h = r->rsc_mem = AllocResource(instance, hResInfo, 0);
201 image = GlobalLinearLock(h);
202 image_size = r->size;
203 fd = AccessResource(instance, hResInfo);
205 if (image == NULL || read(fd, image, image_size) != image_size) {
207 GlobalUnlock(hResInfo);
212 GlobalLinearUnlock(h);
213 GlobalUnlock(hResInfo);
217 /**********************************************************************
218 * LockResource [KERNEL.62]
220 LPSTR LockResource(HANDLE hResData)
222 return GlobalLock(hResData);
225 /**********************************************************************
226 * FreeResource [KERNEL.63]
228 HANDLE FreeResource(HANDLE hResData)
232 dprintf_resource(stddeb, "FreeResource: handle %04x\n", hResData);
234 for (r = rp = Top; r ; r = r->next) {
235 if (r->rsc_mem == hResData) {
242 if (HIWORD((DWORD)r->name))
244 if (HIWORD((DWORD)r->type))
246 GlobalFree(r->rsc_mem);
247 GlobalFree(r->info_mem);
257 /**********************************************************************
260 HBITMAP ConvertCoreBitmap( HDC hdc, BITMAPCOREHEADER * image )
262 BITMAPINFO * bmpInfo;
265 int i, size, n_colors;
267 n_colors = 1 << image->bcBitCount;
268 if (image->bcBitCount < 24)
270 size = sizeof(BITMAPINFOHEADER) + n_colors * sizeof(RGBQUAD);
271 bits = (char *) (image + 1) + (n_colors * sizeof(RGBTRIPLE));
275 size = sizeof(BITMAPINFOHEADER);
276 bits = (char *) (image + 1);
278 bmpInfo = (BITMAPINFO *) malloc( size );
280 bmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
281 bmpInfo->bmiHeader.biWidth = image->bcWidth;
282 bmpInfo->bmiHeader.biHeight = image->bcHeight;
283 bmpInfo->bmiHeader.biPlanes = image->bcPlanes;
284 bmpInfo->bmiHeader.biBitCount = image->bcBitCount;
285 bmpInfo->bmiHeader.biCompression = 0;
286 bmpInfo->bmiHeader.biSizeImage = 0;
287 bmpInfo->bmiHeader.biXPelsPerMeter = 0;
288 bmpInfo->bmiHeader.biYPelsPerMeter = 0;
289 bmpInfo->bmiHeader.biClrUsed = 0;
290 bmpInfo->bmiHeader.biClrImportant = 0;
292 if (image->bcBitCount < 24)
294 RGBTRIPLE * oldMap = (RGBTRIPLE *)(image + 1);
295 RGBQUAD * newMap = bmpInfo->bmiColors;
296 for (i = 0; i < n_colors; i++, oldMap++, newMap++)
298 newMap->rgbRed = oldMap->rgbtRed;
299 newMap->rgbGreen = oldMap->rgbtGreen;
300 newMap->rgbBlue = oldMap->rgbtBlue;
301 newMap->rgbReserved = 0;
305 hbitmap = CreateDIBitmap( hdc, &bmpInfo->bmiHeader, CBM_INIT,
306 bits, bmpInfo, DIB_RGB_COLORS );
311 /**********************************************************************
314 HBITMAP ConvertInfoBitmap( HDC hdc, BITMAPINFO * image )
316 char * bits = ((char *)image) + DIB_BitmapInfoSize(image, DIB_RGB_COLORS);
317 return CreateDIBitmap( hdc, &image->bmiHeader, CBM_INIT,
318 bits, image, DIB_RGB_COLORS );
321 /**********************************************************************
325 RSC_LoadResource(int instance, LPSTR rsc_name, LPSTR type, int *image_size_ret)
330 if (instance == (HANDLE)NULL)
333 dprintf_resource(stddeb, "RSC_LoadResource: instance = %04x, name = %08x, type = %08x\n",
334 instance, (int) rsc_name, (int) type);
336 if ((hResInfo = FindResource(instance, rsc_name, (LPSTR) type)) == (HANDLE) NULL) {
339 r = (RESOURCE *)GlobalLock(hResInfo);
341 *image_size_ret = r->size;
343 GlobalUnlock(hResInfo);
344 return LoadResource(instance, hResInfo);
347 /**********************************************************************
348 * LoadIcon [USER.174]
350 HICON LoadIcon(HANDLE instance, LPSTR icon_name)
355 ICONDESCRIP *lpicodesc;
359 BITMAPINFOHEADER *bih;
365 HBITMAP hbmpOld1, hbmpOld2;
367 #ifdef DEBUG_RESOURCE
368 printf("LoadIcon(%04X", instance);
373 if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
374 rsc_mem = RSC_LoadResource(instance, icon_name, (LPSTR) NE_RSCTYPE_GROUP_ICON,
376 if (rsc_mem == (HANDLE)NULL) {
377 printf("LoadIcon / Icon %04X not Found !\n", (int) icon_name);
378 ReleaseDC(GetDesktopWindow(), hdc);
381 lp = (WORD *)GlobalLock(rsc_mem);
384 ReleaseDC(GetDesktopWindow(), hdc);
387 lpicodesc = (ICONDESCRIP *)(lp + 3);
388 hIcon = GlobalAlloc(GMEM_MOVEABLE, sizeof(ICONALLOC) + 1024);
389 if (hIcon == (HICON)NULL) {
391 ReleaseDC(GetDesktopWindow(), hdc);
394 lpico = (ICONALLOC *)GlobalLock(hIcon);
395 lpico->descriptor = *lpicodesc;
396 width = lpicodesc->Width;
397 height = lpicodesc->Height;
398 GlobalUnlock(rsc_mem);
400 rsc_mem = RSC_LoadResource(instance,
401 MAKEINTRESOURCE(lpicodesc->icoDIBOffset),
402 (LPSTR) NE_RSCTYPE_ICON, &image_size);
403 if (rsc_mem == (HANDLE)NULL) {
404 printf("LoadIcon / Icon %04X Bitmaps not Found !\n", (int) icon_name);
405 ReleaseDC(GetDesktopWindow(), hdc);
408 lp = (WORD *)GlobalLock(rsc_mem);
411 ReleaseDC(GetDesktopWindow(), hdc);
414 bmi = (BITMAPINFO *)lp;
415 bih = (BITMAPINFOHEADER *)lp;
416 rgbq = &bmi->bmiColors[0];
417 bih->biHeight = bih->biHeight / 2;
419 printf("LoadIcon / image_size=%d width=%d height=%d bih->biBitCount=%d bih->biSizeImage=%ld\n",
420 image_size, width, height, bih->biBitCount, bih->biSizeImage);
422 if (bih->biSize == sizeof(BITMAPINFOHEADER))
423 lpico->hBitmap = ConvertInfoBitmap(hdc, (BITMAPINFO *)bih);
427 bih->biClrUsed = bih->biClrImportant = 2;
428 rgbq[0].rgbBlue = 0xFF;
429 rgbq[0].rgbGreen = 0xFF;
430 rgbq[0].rgbRed = 0xFF;
431 rgbq[0].rgbReserved = 0x00;
432 rgbq[1].rgbBlue = 0x00;
433 rgbq[1].rgbGreen = 0x00;
434 rgbq[1].rgbRed = 0x00;
435 rgbq[1].rgbReserved = 0x00;
436 if (bih->biSizeImage == 0) {
437 if (bih->biCompression != BI_RGB) {
438 fprintf(stderr,"Unknown size for compressed Icon bitmap.\n");
440 ReleaseDC(GetDesktopWindow(), hdc);
443 bih->biSizeImage = (bih->biWidth * bih->biHeight * bih->biBitCount
446 lpico->hBitMask = CreateDIBitmap(hdc, bih, CBM_INIT,
447 (LPSTR)lp + bih->biSizeImage - sizeof(BITMAPINFOHEADER) / 2 - 4,
448 (BITMAPINFO *)bih, DIB_RGB_COLORS );
449 GlobalUnlock(rsc_mem);
451 hMemDC = CreateCompatibleDC(hdc);
452 hMemDC2 = CreateCompatibleDC(hdc);
453 hbmpOld1 = SelectObject(hMemDC, lpico->hBitmap);
454 hbmpOld2 = SelectObject(hMemDC2, lpico->hBitMask);
455 BitBlt(hMemDC, 0, 0, bih->biWidth, bih->biHeight, hMemDC2, 0, 0,SRCINVERT);
456 SelectObject( hMemDC, hbmpOld1 );
457 SelectObject( hMemDC2, hbmpOld2 );
460 ReleaseDC(GetDesktopWindow(), hdc);
462 dprintf_resource(stddeb,"LoadIcon Alloc hIcon=%X\n", hIcon);
466 /**********************************************************************
467 * CreateIcon [USER.407]
469 HICON CreateIcon(HANDLE hInstance, int nWidth, int nHeight,
470 BYTE nPlanes, BYTE nBitsPixel, LPSTR lpANDbits,
476 dprintf_resource(stddeb, "CreateIcon: hInstance = %04x, nWidth = %08x, nHeight = %08x \n",
477 hInstance, nWidth, nHeight);
478 dprintf_resource(stddeb, " nPlanes = %04x, nBitsPixel = %04x,",nPlanes, nBitsPixel);
479 dprintf_resource(stddeb, " lpANDbits= %04x, lpXORbits = %04x, \n", (int)lpANDbits,
482 if (hInstance == (HANDLE)NULL) {
483 printf("CreateIcon / hInstance %04x not Found!\n",hInstance);
486 hIcon = GlobalAlloc(GMEM_MOVEABLE, sizeof(ICONALLOC) + 1024);
487 if (hIcon == (HICON)NULL) {
488 printf("Can't allocate memory for Icon in CreateIcon\n");
491 lpico= (ICONALLOC *)GlobalLock(hIcon);
493 lpico->descriptor.Width=nWidth;
494 lpico->descriptor.Height=nHeight;
495 lpico->descriptor.ColorCount=16; /* Dummy Value */
496 lpico->descriptor.Reserved1=0;
497 lpico->descriptor.Reserved2=nPlanes;
498 lpico->descriptor.Reserved3=nWidth*nHeight;
500 /* either nPlanes and/or nBitCount is set to one */
501 lpico->descriptor.icoDIBSize=nWidth*nHeight*nPlanes*nBitsPixel;
502 lpico->descriptor.icoDIBOffset=0;
504 if( !(lpico->hBitmap=CreateBitmap(nWidth, nHeight, nPlanes, nBitsPixel,
506 printf("CreateIcon: couldn't create the XOR bitmap\n");
510 /* the AND BitMask is always monochrome */
511 if( !(lpico->hBitMask=CreateBitmap(nWidth, nHeight, 1, 1, lpANDbits)) ) {
512 printf("CreateIcon: couldn't create the AND bitmap\n");
517 dprintf_resource(stddeb, "CreateIcon Alloc hIcon=%X\n", hIcon);
521 /**********************************************************************
522 * DestroyIcon [USER.457]
524 BOOL DestroyIcon(HICON hIcon)
528 if (hIcon == (HICON)NULL)
530 lpico = (ICONALLOC *)GlobalLock(hIcon);
531 if (lpico->hBitmap != (HBITMAP)NULL)
532 DeleteObject(lpico->hBitmap);
537 /**********************************************************************
538 * LoadAccelerators [USER.177]
540 HANDLE LoadAccelerators(HANDLE instance, LPSTR lpTableName)
545 ACCELHEADER *lpAccelTbl;
546 int i, image_size, n;
549 printf("LoadAccelerators(%04X", instance);
550 PrintId(lpTableName);
554 rsc_mem = RSC_LoadResource(instance, lpTableName, (LPSTR) NE_RSCTYPE_ACCELERATOR,
556 if (rsc_mem == (HANDLE)NULL) {
557 printf("LoadAccelerators(%04X", instance);
558 PrintId(lpTableName);
559 printf(") not found !\n");
562 lp = (BYTE *)GlobalLock(rsc_mem);
567 dprintf_accel(stddeb,"LoadAccelerators / image_size=%d\n", image_size);
569 hAccel = GlobalAlloc(GMEM_MOVEABLE,
570 sizeof(ACCELHEADER) + (n + 1)*sizeof(ACCELENTRY));
571 lpAccelTbl = (LPACCELHEADER)GlobalLock(hAccel);
572 lpAccelTbl->wCount = 0;
573 for (i = 0; i < n; i++) {
574 lpAccelTbl->tbl[i].type = *(lp++);
575 lpAccelTbl->tbl[i].wEvent = *((WORD *)lp);
577 lpAccelTbl->tbl[i].wIDval = *((WORD *)lp);
579 if (lpAccelTbl->tbl[i].wEvent == 0) break;
580 dprintf_accel(stddeb,
581 "Accelerator #%u / event=%04X id=%04X type=%02X \n",
582 i, lpAccelTbl->tbl[i].wEvent, lpAccelTbl->tbl[i].wIDval,
583 lpAccelTbl->tbl[i].type);
584 lpAccelTbl->wCount++;
586 GlobalUnlock(hAccel);
587 GlobalUnlock(rsc_mem);
592 /**********************************************************************
593 * TranslateAccelerator [USER.178]
595 int TranslateAccelerator(HWND hWnd, HANDLE hAccel, LPMSG msg)
597 ACCELHEADER *lpAccelTbl;
600 if (hAccel == 0 || msg == NULL) return 0;
601 if (msg->message != WM_KEYDOWN &&
602 msg->message != WM_KEYUP &&
603 msg->message != WM_CHAR) return 0;
605 dprintf_accel(stddeb, "TranslateAccelerators hAccel=%04X !\n", hAccel);
607 lpAccelTbl = (LPACCELHEADER)GlobalLock(hAccel);
608 for (i = 0; i < lpAccelTbl->wCount; i++) {
609 if (lpAccelTbl->tbl[i].type & VIRTKEY_ACCEL) {
610 if (msg->wParam == lpAccelTbl->tbl[i].wEvent &&
611 msg->message == WM_KEYDOWN) {
612 if ((lpAccelTbl->tbl[i].type & SHIFT_ACCEL) &&
613 !(GetKeyState(VK_SHIFT) & 0xf)) {
614 GlobalUnlock(hAccel);
617 if ((lpAccelTbl->tbl[i].type & CONTROL_ACCEL) &&
618 !(GetKeyState(VK_CONTROL) & 0xf)) {
619 GlobalUnlock(hAccel);
622 if ((lpAccelTbl->tbl[i].type & ALT_ACCEL) &&
623 !(GetKeyState(VK_MENU) & 0xf)) {
624 GlobalUnlock(hAccel);
627 SendMessage(hWnd, WM_COMMAND, lpAccelTbl->tbl[i].wIDval, 0x00010000L);
628 GlobalUnlock(hAccel);
631 if (msg->message == WM_KEYUP) return 1;
634 if (msg->wParam == lpAccelTbl->tbl[i].wEvent &&
635 msg->message == WM_CHAR) {
636 SendMessage(hWnd, WM_COMMAND, lpAccelTbl->tbl[i].wIDval, 0x00010000L);
637 GlobalUnlock(hAccel);
642 GlobalUnlock(hAccel);
646 /**********************************************************************
650 LoadString(HANDLE instance, WORD resource_id, LPSTR buffer, int buflen)
658 dprintf_resource(stddeb, "LoadString: instance = %04x, id = %d, buffer = %08x, "
659 "length = %d\n", instance, resource_id, (int) buffer, buflen);
661 hmem = RSC_LoadResource(instance, (char *) ((resource_id >> 4) + 1),
662 (LPSTR) NE_RSCTYPE_STRING, &rsc_size);
666 p = GlobalLock(hmem);
667 string_num = resource_id & 0x000f;
668 for (i = 0; i < string_num; i++)
671 i = MIN(buflen - 1, *p);
673 memcpy(buffer, p + 1, i);
681 fprintf(stderr,"LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen, *p);
682 fprintf(stderr,"LoadString // and try to obtain string '%s'\n", p + 1);
686 dprintf_resource(stddeb,"LoadString // '%s' copied !\n", buffer);
690 /**********************************************************************
691 * LoadMenu [USER.150]
693 HMENU LoadMenu(HINSTANCE instance, char *menu_name)
697 MENU_HEADER *menu_desc;
700 printf("LoadMenu(%04X", instance);
704 if (menu_name == NULL)
707 if ((hMenu_desc = RSC_LoadResource(instance, menu_name, (LPSTR) NE_RSCTYPE_MENU, NULL)) == (HANDLE) NULL)
710 menu_desc = (MENU_HEADER *) GlobalLock(hMenu_desc);
711 hMenu = LoadMenuIndirect((LPSTR)menu_desc);
715 /**********************************************************************
719 LoadBitmap(HANDLE instance, LPSTR bmp_name)
728 #ifdef DEBUG_RESOURCE
729 printf("LoadBitmap(%04X", instance);
735 struct ResourceTable *it;
736 hbitmap = OBM_LoadOEMBitmap(((int) bmp_name) & 0xffff);
739 /* Load from sysresbm */
740 dprintf_resource(stddeb,"Searching for %d\n",bmp_name);
741 for(it=sysresbmTable;it;it++){
742 if(it->type==NE_RSCTYPE_BITMAP)
743 if((((int)bmp_name & 0xFFFF0000) == 0))
744 {if(it->id==(int)bmp_name)break;}
745 else if(!strcmp(it->name,bmp_name))break;
748 dprintf_resource(stddeb,"Found %s\n",it->name);
750 rsc_mem=(HANDLE)NULL;
751 } else { /* Load from file - indent this code properly later */
753 rsc_mem = RSC_LoadResource(instance, bmp_name, (LPSTR) NE_RSCTYPE_BITMAP,
755 if (rsc_mem == (HANDLE)NULL) {
756 printf("LoadBitmap(%04X", instance);
758 printf(") NOT found!\n");
761 lp = (long *) GlobalLinearLock(rsc_mem);
767 } /* Load from file */
768 if (!(hdc = GetDC(0))) lp = NULL;
769 size = CONV_LONG (*lp);
770 if (size == sizeof(BITMAPCOREHEADER)){
771 CONV_BITMAPCOREHEADER (lp);
772 hbitmap = ConvertCoreBitmap( hdc, (BITMAPCOREHEADER *) lp );
773 } else if (size == sizeof(BITMAPINFOHEADER)){
774 CONV_BITMAPINFO (lp);
775 hbitmap = ConvertInfoBitmap( hdc, (BITMAPINFO *) lp );