2 static char RCSId[] = "$Id: resource.c,v 1.4 1993/07/04 04:04:21 root Exp root $";
3 static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
25 #include "../rc/sysresbm.h"
27 #define MIN(a,b) ((a) < (b) ? (a) : (b))
31 extern int NE_FindResource(HANDLE, LPSTR, LPSTR, RESOURCE *);
32 extern int PE_FindResource(HANDLE, LPSTR, LPSTR, RESOURCE *);
33 extern HBITMAP OBM_LoadOEMBitmap( WORD id ); /* objects/oembitmap.c */
35 #define PrintId(name) \
36 if (HIWORD((DWORD)name)) \
37 printf(", %s", name); \
39 printf(", #%d", (int) name);
41 /**********************************************************************
42 * FindResource [KERNEL.60]
44 HANDLE FindResource(HANDLE instance, LPSTR name, LPSTR type)
50 if(debugging_resource){
51 printf("FindResource(%04X", instance);
57 if (instance == (HANDLE)NULL)
60 /* FIXME: did we already find this one ? */
62 if ((rh = GlobalAlloc(GMEM_MOVEABLE, sizeof(RESOURCE))) == 0)
65 r = (RESOURCE *)GlobalLock(rh);
71 if (HIWORD((DWORD)name))
72 r->name = strdup(name);
76 if (HIWORD((DWORD)type))
77 r->type = strdup(type);
81 r->wpnt = GetFileInfo(instance);
82 r->fd = dup(r->wpnt->fd);
84 status = NE_FindResource(instance, name, type, r);
86 status = PE_FindResource(instance, name, type, r);
89 if (HIWORD((DWORD)r->name))
92 if (HIWORD((DWORD)r->type))
103 /**********************************************************************
104 * AllocResource [KERNEL.66]
106 HANDLE AllocResource(HANDLE instance, HANDLE hResInfo, DWORD dwSize)
111 dprintf_resource(stddeb, "AllocResource(%04X, %04X, %08X);\n",
112 instance, hResInfo, (int) dwSize);
114 if (instance == (HANDLE)NULL)
117 if ((r = (RESOURCE *)GlobalLock(hResInfo)) == NULL)
120 image_size = r->size;
123 r->rsc_mem = GlobalAlloc(GMEM_MOVEABLE, image_size);
125 r->rsc_mem = GlobalAlloc(GMEM_MOVEABLE, dwSize);
127 GlobalUnlock(hResInfo);
132 /**********************************************************************
133 * AccessResource [KERNEL.64]
135 int AccessResource(HANDLE instance, HANDLE hResInfo)
140 dprintf_resource(stddeb, "AccessResource(%04X, %04X);\n",
143 if (instance == (HANDLE)NULL)
146 if ((r = (RESOURCE *)GlobalLock(hResInfo)) == NULL)
150 lseek(fd, r->offset, SEEK_SET);
151 GlobalUnlock(hResInfo);
156 /**********************************************************************
157 * SizeofResource [KERNEL.65]
159 WORD SizeofResource(HANDLE instance, HANDLE hResInfo)
164 dprintf_resource(stddeb, "SizeofResource(%04X, %04X);\n",
167 if (instance == (HANDLE)NULL)
170 if ((r = (RESOURCE *)GlobalLock(hResInfo)) == NULL)
174 GlobalUnlock(hResInfo);
179 /**********************************************************************
180 * LoadResource [KERNEL.61]
182 HANDLE LoadResource(HANDLE instance, HANDLE hResInfo)
189 dprintf_resource(stddeb, "LoadResource(%04X, %04X);\n", instance, hResInfo);
191 if (instance == (HANDLE)NULL)
194 if ((r = (RESOURCE *)GlobalLock(hResInfo)) == NULL)
197 h = r->rsc_mem = AllocResource(instance, hResInfo, 0);
198 image = GlobalLinearLock(h);
199 image_size = r->size;
200 fd = AccessResource(instance, hResInfo);
202 if (image == NULL || read(fd, image, image_size) != image_size) {
204 GlobalUnlock(hResInfo);
209 GlobalLinearUnlock(h);
210 GlobalUnlock(hResInfo);
214 /**********************************************************************
215 * LockResource [KERNEL.62]
217 LPSTR LockResource(HANDLE hResData)
219 return GlobalLock(hResData);
222 /**********************************************************************
223 * FreeResource [KERNEL.63]
225 HANDLE FreeResource(HANDLE hResData)
229 dprintf_resource(stddeb, "FreeResource: handle %04x\n", hResData);
231 for (r = rp = Top; r ; r = r->next) {
232 if (r->rsc_mem == hResData) {
239 if (HIWORD((DWORD)r->name))
241 if (HIWORD((DWORD)r->type))
243 GlobalFree(r->rsc_mem);
244 GlobalFree(r->info_mem);
254 /**********************************************************************
257 HBITMAP ConvertCoreBitmap( HDC hdc, BITMAPCOREHEADER * image )
259 BITMAPINFO * bmpInfo;
262 int i, size, n_colors;
264 n_colors = 1 << image->bcBitCount;
265 if (image->bcBitCount < 24)
267 size = sizeof(BITMAPINFOHEADER) + n_colors * sizeof(RGBQUAD);
268 bits = (char *) (image + 1) + (n_colors * sizeof(RGBTRIPLE));
272 size = sizeof(BITMAPINFOHEADER);
273 bits = (char *) (image + 1);
275 bmpInfo = (BITMAPINFO *) malloc( size );
277 bmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
278 bmpInfo->bmiHeader.biWidth = image->bcWidth;
279 bmpInfo->bmiHeader.biHeight = image->bcHeight;
280 bmpInfo->bmiHeader.biPlanes = image->bcPlanes;
281 bmpInfo->bmiHeader.biBitCount = image->bcBitCount;
282 bmpInfo->bmiHeader.biCompression = 0;
283 bmpInfo->bmiHeader.biSizeImage = 0;
284 bmpInfo->bmiHeader.biXPelsPerMeter = 0;
285 bmpInfo->bmiHeader.biYPelsPerMeter = 0;
286 bmpInfo->bmiHeader.biClrUsed = 0;
287 bmpInfo->bmiHeader.biClrImportant = 0;
289 if (image->bcBitCount < 24)
291 RGBTRIPLE * oldMap = (RGBTRIPLE *)(image + 1);
292 RGBQUAD * newMap = bmpInfo->bmiColors;
293 for (i = 0; i < n_colors; i++, oldMap++, newMap++)
295 newMap->rgbRed = oldMap->rgbtRed;
296 newMap->rgbGreen = oldMap->rgbtGreen;
297 newMap->rgbBlue = oldMap->rgbtBlue;
298 newMap->rgbReserved = 0;
302 hbitmap = CreateDIBitmap( hdc, &bmpInfo->bmiHeader, CBM_INIT,
303 bits, bmpInfo, DIB_RGB_COLORS );
308 /**********************************************************************
311 HBITMAP ConvertInfoBitmap( HDC hdc, BITMAPINFO * image )
313 char * bits = ((char *)image) + DIB_BitmapInfoSize(image, DIB_RGB_COLORS);
314 return CreateDIBitmap( hdc, &image->bmiHeader, CBM_INIT,
315 bits, image, DIB_RGB_COLORS );
318 /**********************************************************************
322 RSC_LoadResource(int instance, LPSTR rsc_name, LPSTR type, int *image_size_ret)
327 if (instance == (HANDLE)NULL)
330 dprintf_resource(stddeb, "RSC_LoadResource: instance = %04x, name = %08x, type = %08x\n",
331 instance, (int) rsc_name, (int) type);
333 if ((hResInfo = FindResource(instance, rsc_name, (LPSTR) type)) == (HANDLE) NULL) {
336 r = (RESOURCE *)GlobalLock(hResInfo);
338 *image_size_ret = r->size;
340 GlobalUnlock(hResInfo);
341 return LoadResource(instance, hResInfo);
344 /**********************************************************************
345 * LoadIcon [USER.174]
347 HICON LoadIcon(HANDLE instance, LPSTR icon_name)
352 ICONDESCRIP *lpicodesc;
356 BITMAPINFOHEADER *bih;
361 if(debugging_resource){
362 printf("LoadIcon(%04X", instance);
367 if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
368 rsc_mem = RSC_LoadResource(instance, icon_name, (LPSTR) NE_RSCTYPE_GROUP_ICON,
370 if (rsc_mem == (HANDLE)NULL) {
371 printf("LoadIcon / Icon %04X not Found !\n", (int) icon_name);
372 ReleaseDC(GetDesktopWindow(), hdc);
375 lp = (WORD *)GlobalLock(rsc_mem);
378 ReleaseDC(GetDesktopWindow(), hdc);
381 lpicodesc = (ICONDESCRIP *)(lp + 3);
382 hIcon = GlobalAlloc(GMEM_MOVEABLE, sizeof(ICONALLOC) + 1024);
383 if (hIcon == (HICON)NULL) {
385 ReleaseDC(GetDesktopWindow(), hdc);
388 lpico = (ICONALLOC *)GlobalLock(hIcon);
389 lpico->descriptor = *lpicodesc;
390 width = lpicodesc->Width;
391 height = lpicodesc->Height;
392 GlobalUnlock(rsc_mem);
394 rsc_mem = RSC_LoadResource(instance,
395 MAKEINTRESOURCE(lpicodesc->icoDIBOffset),
396 (LPSTR) NE_RSCTYPE_ICON, &image_size);
397 if (rsc_mem == (HANDLE)NULL) {
398 printf("LoadIcon / Icon %04X Bitmaps not Found !\n", (int) icon_name);
399 ReleaseDC(GetDesktopWindow(), hdc);
402 lp = (WORD *)GlobalLock(rsc_mem);
405 ReleaseDC(GetDesktopWindow(), hdc);
408 bmi = (BITMAPINFO *)lp;
409 bih = (BITMAPINFOHEADER *)lp;
410 rgbq = &bmi->bmiColors[0];
411 bih->biHeight = bih->biHeight / 2;
413 printf("LoadIcon / image_size=%d width=%d height=%d bih->biBitCount=%d bih->biSizeImage=%ld\n",
414 image_size, width, height, bih->biBitCount, bih->biSizeImage);
416 if (bih->biSize == sizeof(BITMAPINFOHEADER))
417 lpico->hBitmap = ConvertInfoBitmap(hdc, (BITMAPINFO *)bih);
421 bih->biClrUsed = bih->biClrImportant = 2;
422 rgbq[0].rgbBlue = rgbq[0].rgbGreen = rgbq[0].rgbRed = 0x00;
423 rgbq[1].rgbBlue = rgbq[1].rgbGreen = rgbq[1].rgbRed = 0xff;
424 rgbq[0].rgbReserved = rgbq[1].rgbReserved = 0;
425 if (bih->biSizeImage == 0) {
426 if (bih->biCompression != BI_RGB) {
427 fprintf(stderr,"Unknown size for compressed Icon bitmap.\n");
429 ReleaseDC(GetDesktopWindow(), hdc);
432 bih->biSizeImage = (bih->biWidth * bih->biHeight * bih->biBitCount
435 lpico->hBitMask = CreateDIBitmap(hdc, bih, CBM_INIT,
436 (LPSTR)lp + bih->biSizeImage - sizeof(BITMAPINFOHEADER) / 2 - 4,
437 (BITMAPINFO *)bih, DIB_RGB_COLORS );
438 GlobalUnlock(rsc_mem);
440 ReleaseDC(GetDesktopWindow(), hdc);
442 dprintf_resource(stddeb,"LoadIcon Alloc hIcon=%X\n", hIcon);
446 /**********************************************************************
447 * CreateIcon [USER.407]
449 HICON CreateIcon(HANDLE hInstance, int nWidth, int nHeight,
450 BYTE nPlanes, BYTE nBitsPixel, LPSTR lpANDbits,
456 dprintf_resource(stddeb, "CreateIcon: hInstance = %04x, nWidth = %08x, nHeight = %08x \n",
457 hInstance, nWidth, nHeight);
458 dprintf_resource(stddeb, " nPlanes = %04x, nBitsPixel = %04x,",nPlanes, nBitsPixel);
459 dprintf_resource(stddeb, " lpANDbits= %04x, lpXORbits = %04x, \n", (int)lpANDbits,
462 if (hInstance == (HANDLE)NULL) {
463 printf("CreateIcon / hInstance %04x not Found!\n",hInstance);
466 hIcon = GlobalAlloc(GMEM_MOVEABLE, sizeof(ICONALLOC) + 1024);
467 if (hIcon == (HICON)NULL) {
468 printf("Can't allocate memory for Icon in CreateIcon\n");
471 lpico= (ICONALLOC *)GlobalLock(hIcon);
473 lpico->descriptor.Width=nWidth;
474 lpico->descriptor.Height=nHeight;
475 lpico->descriptor.ColorCount=16; /* Dummy Value */
476 lpico->descriptor.Reserved1=0;
477 lpico->descriptor.Reserved2=nPlanes;
478 lpico->descriptor.Reserved3=nWidth*nHeight;
480 /* either nPlanes and/or nBitCount is set to one */
481 lpico->descriptor.icoDIBSize=nWidth*nHeight*nPlanes*nBitsPixel;
482 lpico->descriptor.icoDIBOffset=0;
484 if( !(lpico->hBitmap=CreateBitmap(nWidth, nHeight, nPlanes, nBitsPixel,
486 printf("CreateIcon: couldn't create the XOR bitmap\n");
490 /* the AND BitMask is always monochrome */
491 if( !(lpico->hBitMask=CreateBitmap(nWidth, nHeight, 1, 1, lpANDbits)) ) {
492 printf("CreateIcon: couldn't create the AND bitmap\n");
497 dprintf_resource(stddeb, "CreateIcon Alloc hIcon=%X\n", hIcon);
501 /**********************************************************************
502 * DestroyIcon [USER.457]
504 BOOL DestroyIcon(HICON hIcon)
508 if (hIcon == (HICON)NULL)
510 lpico = (ICONALLOC *)GlobalLock(hIcon);
511 if (lpico->hBitmap != (HBITMAP)NULL)
512 DeleteObject(lpico->hBitmap);
517 /**********************************************************************
518 * LoadAccelerators [USER.177]
520 HANDLE LoadAccelerators(HANDLE instance, LPSTR lpTableName)
525 ACCELHEADER *lpAccelTbl;
526 int i, image_size, n;
529 printf("LoadAccelerators(%04X", instance);
530 PrintId(lpTableName);
534 rsc_mem = RSC_LoadResource(instance, lpTableName, (LPSTR) NE_RSCTYPE_ACCELERATOR,
536 if (rsc_mem == (HANDLE)NULL) {
537 printf("LoadAccelerators(%04X", instance);
538 PrintId(lpTableName);
539 printf(") not found !\n");
542 lp = (BYTE *)GlobalLock(rsc_mem);
547 dprintf_accel(stddeb,"LoadAccelerators / image_size=%d\n", image_size);
549 hAccel = GlobalAlloc(GMEM_MOVEABLE,
550 sizeof(ACCELHEADER) + (n + 1)*sizeof(ACCELENTRY));
551 lpAccelTbl = (LPACCELHEADER)GlobalLock(hAccel);
552 lpAccelTbl->wCount = 0;
553 for (i = 0; i < n; i++) {
554 lpAccelTbl->tbl[i].type = *(lp++);
555 lpAccelTbl->tbl[i].wEvent = *((WORD *)lp);
557 lpAccelTbl->tbl[i].wIDval = *((WORD *)lp);
559 if (lpAccelTbl->tbl[i].wEvent == 0) break;
560 dprintf_accel(stddeb,
561 "Accelerator #%u / event=%04X id=%04X type=%02X \n",
562 i, lpAccelTbl->tbl[i].wEvent, lpAccelTbl->tbl[i].wIDval,
563 lpAccelTbl->tbl[i].type);
564 lpAccelTbl->wCount++;
566 GlobalUnlock(hAccel);
567 GlobalUnlock(rsc_mem);
572 /**********************************************************************
573 * TranslateAccelerator [USER.178]
575 int TranslateAccelerator(HWND hWnd, HANDLE hAccel, LPMSG msg)
577 ACCELHEADER *lpAccelTbl;
580 if (hAccel == 0 || msg == NULL) return 0;
581 if (msg->message != WM_KEYDOWN &&
582 msg->message != WM_KEYUP &&
583 msg->message != WM_CHAR) return 0;
585 dprintf_accel(stddeb, "TranslateAccelerators hAccel=%04X !\n", hAccel);
587 lpAccelTbl = (LPACCELHEADER)GlobalLock(hAccel);
588 for (i = 0; i < lpAccelTbl->wCount; i++) {
589 if (lpAccelTbl->tbl[i].type & VIRTKEY_ACCEL) {
590 if (msg->wParam == lpAccelTbl->tbl[i].wEvent &&
591 msg->message == WM_KEYDOWN) {
592 if ((lpAccelTbl->tbl[i].type & SHIFT_ACCEL) &&
593 !(GetKeyState(VK_SHIFT) & 0xf)) {
594 GlobalUnlock(hAccel);
597 if ((lpAccelTbl->tbl[i].type & CONTROL_ACCEL) &&
598 !(GetKeyState(VK_CONTROL) & 0xf)) {
599 GlobalUnlock(hAccel);
602 if ((lpAccelTbl->tbl[i].type & ALT_ACCEL) &&
603 !(GetKeyState(VK_MENU) & 0xf)) {
604 GlobalUnlock(hAccel);
607 SendMessage(hWnd, WM_COMMAND, lpAccelTbl->tbl[i].wIDval, 0x00010000L);
608 GlobalUnlock(hAccel);
611 if (msg->message == WM_KEYUP) return 1;
614 if (msg->wParam == lpAccelTbl->tbl[i].wEvent &&
615 msg->message == WM_CHAR) {
616 SendMessage(hWnd, WM_COMMAND, lpAccelTbl->tbl[i].wIDval, 0x00010000L);
617 GlobalUnlock(hAccel);
622 GlobalUnlock(hAccel);
626 /**********************************************************************
630 LoadString(HANDLE instance, WORD resource_id, LPSTR buffer, int buflen)
638 dprintf_resource(stddeb, "LoadString: instance = %04x, id = %d, buffer = %08x, "
639 "length = %d\n", instance, resource_id, (int) buffer, buflen);
641 hmem = RSC_LoadResource(instance, (char *) ((resource_id >> 4) + 1),
642 (LPSTR) NE_RSCTYPE_STRING, &rsc_size);
646 p = GlobalLock(hmem);
647 string_num = resource_id & 0x000f;
648 for (i = 0; i < string_num; i++)
651 i = MIN(buflen - 1, *p);
653 memcpy(buffer, p + 1, i);
661 fprintf(stderr,"LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen, *p);
662 fprintf(stderr,"LoadString // and try to obtain string '%s'\n", p + 1);
666 dprintf_resource(stddeb,"LoadString // '%s' copied !\n", buffer);
670 /**********************************************************************
671 * LoadMenu [USER.150]
673 HMENU LoadMenu(HINSTANCE instance, char *menu_name)
677 MENU_HEADER *menu_desc;
680 printf("LoadMenu(%04X", instance);
684 if (menu_name == NULL)
687 if ((hMenu_desc = RSC_LoadResource(instance, menu_name, (LPSTR) NE_RSCTYPE_MENU, NULL)) == (HANDLE) NULL)
690 menu_desc = (MENU_HEADER *) GlobalLock(hMenu_desc);
691 hMenu = LoadMenuIndirect((LPSTR)menu_desc);
695 /**********************************************************************
699 LoadBitmap(HANDLE instance, LPSTR bmp_name)
708 if(debugging_resource){
709 printf("LoadBitmap(%04X", instance);
715 struct ResourceTable *it;
716 hbitmap = OBM_LoadOEMBitmap(((int) bmp_name) & 0xffff);
719 /* Load from sysresbm */
720 dprintf_resource(stddeb,"Searching for %d\n", (int) bmp_name);
721 for(it=sysresbmTable;it->value;it++){
722 if(it->type==NE_RSCTYPE_BITMAP)
723 if((((int)bmp_name & 0xFFFF0000) == 0))
724 {if(it->id==(int)bmp_name)break;}
725 else if(!strcmp(it->name,bmp_name))break;
727 if(!it->value)return 0;
728 dprintf_resource(stddeb,"Found %s\n",it->name);
729 lp=(long *)it->value;
730 rsc_mem=(HANDLE)NULL;
731 } else { /* Load from file - indent this code properly later */
733 rsc_mem = RSC_LoadResource(instance, bmp_name, (LPSTR) NE_RSCTYPE_BITMAP,
735 if (rsc_mem == (HANDLE)NULL) {
736 printf("LoadBitmap(%04X", instance);
738 printf(") NOT found!\n");
741 lp = (long *) GlobalLinearLock(rsc_mem);
747 } /* Load from file */
748 if (!(hdc = GetDC(0))) lp = NULL;
749 size = CONV_LONG (*lp);
750 if (size == sizeof(BITMAPCOREHEADER)){
751 CONV_BITMAPCOREHEADER (lp);
752 hbitmap = ConvertCoreBitmap( hdc, (BITMAPCOREHEADER *) lp );
753 } else if (size == sizeof(BITMAPINFOHEADER)){
754 CONV_BITMAPINFO (lp);
755 hbitmap = ConvertInfoBitmap( hdc, (BITMAPINFO *) lp );