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";
26 #define MIN(a,b) ((a) < (b) ? (a) : (b))
30 extern int NE_FindResource(HANDLE, LPSTR, LPSTR, RESOURCE *);
31 extern int PE_FindResource(HANDLE, LPSTR, LPSTR, RESOURCE *);
33 #define PrintId(name) \
34 if (HIWORD((DWORD)name)) \
35 printf(", %s", name); \
37 printf(", #%d", (int) name);
39 /**********************************************************************
40 * FindResource [KERNEL.60]
42 HANDLE FindResource(HANDLE instance, LPSTR name, LPSTR type)
48 if(debugging_resource){
49 printf("FindResource(%04X", instance);
55 /* FIXME: did we already find this one ? */
57 if ((rh = GlobalAlloc(GMEM_MOVEABLE, sizeof(RESOURCE))) == 0)
60 r = (RESOURCE *)GlobalLock(rh);
66 if (HIWORD((DWORD)name))
67 r->name = strdup(name);
71 if (HIWORD((DWORD)type))
72 r->type = strdup(type);
76 r->wpnt = GetFileInfo(instance);
77 r->fd = dup(r->wpnt->fd);
79 status = NE_FindResource(instance, name, type, r);
81 status = PE_FindResource(instance, name, type, r);
84 if (HIWORD((DWORD)r->name))
87 if (HIWORD((DWORD)r->type))
98 /**********************************************************************
99 * AllocResource [KERNEL.66]
101 HANDLE AllocResource(HANDLE instance, HANDLE hResInfo, DWORD dwSize)
106 dprintf_resource(stddeb, "AllocResource(%04X, %04X, %08X);\n",
107 instance, hResInfo, (int) dwSize);
109 if ((r = (RESOURCE *)GlobalLock(hResInfo)) == NULL)
112 image_size = r->size;
115 r->rsc_mem = GlobalAlloc(GMEM_MOVEABLE, image_size);
117 r->rsc_mem = GlobalAlloc(GMEM_MOVEABLE, dwSize);
119 GlobalUnlock(hResInfo);
124 /**********************************************************************
125 * AccessResource [KERNEL.64]
127 int AccessResource(HANDLE instance, HANDLE hResInfo)
132 dprintf_resource(stddeb, "AccessResource(%04X, %04X);\n",
135 if ((r = (RESOURCE *)GlobalLock(hResInfo)) == NULL)
139 lseek(fd, r->offset, SEEK_SET);
140 GlobalUnlock(hResInfo);
145 /**********************************************************************
146 * SizeofResource [KERNEL.65]
148 WORD SizeofResource(HANDLE instance, HANDLE hResInfo)
153 dprintf_resource(stddeb, "SizeofResource(%04X, %04X);\n",
156 if ((r = (RESOURCE *)GlobalLock(hResInfo)) == NULL)
160 GlobalUnlock(hResInfo);
165 /**********************************************************************
166 * LoadResource [KERNEL.61]
168 HANDLE LoadResource(HANDLE instance, HANDLE hResInfo)
175 dprintf_resource(stddeb, "LoadResource(%04X, %04X);\n", instance, hResInfo);
177 if ((r = (RESOURCE *)GlobalLock(hResInfo)) == NULL)
180 h = r->rsc_mem = AllocResource(instance, hResInfo, 0);
181 image = GlobalLinearLock(h);
182 image_size = r->size;
183 fd = AccessResource(instance, hResInfo);
185 if (image == NULL || read(fd, image, image_size) != image_size) {
187 GlobalUnlock(hResInfo);
192 GlobalLinearUnlock(h);
193 GlobalUnlock(hResInfo);
197 /**********************************************************************
198 * LockResource [KERNEL.62]
200 LPSTR LockResource(HANDLE hResData)
202 return GlobalLock(hResData);
205 /**********************************************************************
206 * FreeResource [KERNEL.63]
208 HANDLE FreeResource(HANDLE hResData)
212 dprintf_resource(stddeb, "FreeResource: handle %04x\n", hResData);
214 for (r = rp = Top; r ; r = r->next) {
215 if (r->rsc_mem == hResData) {
222 if (HIWORD((DWORD)r->name))
224 if (HIWORD((DWORD)r->type))
226 GlobalFree(r->rsc_mem);
227 GlobalFree(r->info_mem);
237 /**********************************************************************
240 HBITMAP ConvertCoreBitmap( HDC hdc, BITMAPCOREHEADER * image )
242 BITMAPINFO * bmpInfo;
245 int i, size, n_colors;
247 n_colors = 1 << image->bcBitCount;
248 if (image->bcBitCount < 24)
250 size = sizeof(BITMAPINFOHEADER) + n_colors * sizeof(RGBQUAD);
251 bits = (char *) (image + 1) + (n_colors * sizeof(RGBTRIPLE));
255 size = sizeof(BITMAPINFOHEADER);
256 bits = (char *) (image + 1);
258 bmpInfo = (BITMAPINFO *) malloc( size );
260 bmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
261 bmpInfo->bmiHeader.biWidth = image->bcWidth;
262 bmpInfo->bmiHeader.biHeight = image->bcHeight;
263 bmpInfo->bmiHeader.biPlanes = image->bcPlanes;
264 bmpInfo->bmiHeader.biBitCount = image->bcBitCount;
265 bmpInfo->bmiHeader.biCompression = 0;
266 bmpInfo->bmiHeader.biSizeImage = 0;
267 bmpInfo->bmiHeader.biXPelsPerMeter = 0;
268 bmpInfo->bmiHeader.biYPelsPerMeter = 0;
269 bmpInfo->bmiHeader.biClrUsed = 0;
270 bmpInfo->bmiHeader.biClrImportant = 0;
272 if (image->bcBitCount < 24)
274 RGBTRIPLE * oldMap = (RGBTRIPLE *)(image + 1);
275 RGBQUAD * newMap = bmpInfo->bmiColors;
276 for (i = 0; i < n_colors; i++, oldMap++, newMap++)
278 newMap->rgbRed = oldMap->rgbtRed;
279 newMap->rgbGreen = oldMap->rgbtGreen;
280 newMap->rgbBlue = oldMap->rgbtBlue;
281 newMap->rgbReserved = 0;
285 hbitmap = CreateDIBitmap( hdc, &bmpInfo->bmiHeader, CBM_INIT,
286 bits, bmpInfo, DIB_RGB_COLORS );
291 /**********************************************************************
294 HBITMAP ConvertInfoBitmap( HDC hdc, BITMAPINFO * image )
296 char * bits = ((char *)image) + DIB_BitmapInfoSize(image, DIB_RGB_COLORS);
297 return CreateDIBitmap( hdc, &image->bmiHeader, CBM_INIT,
298 bits, image, DIB_RGB_COLORS );
301 /**********************************************************************
305 RSC_LoadResource(int instance, LPSTR rsc_name, LPSTR type, int *image_size_ret)
310 dprintf_resource(stddeb, "RSC_LoadResource: instance = %04x, name = %08x, type = %08x\n",
311 instance, (int) rsc_name, (int) type);
313 if ((hResInfo = FindResource(instance, rsc_name, (LPSTR) type)) == (HANDLE) NULL) {
316 r = (RESOURCE *)GlobalLock(hResInfo);
318 *image_size_ret = r->size;
320 GlobalUnlock(hResInfo);
321 return LoadResource(instance, hResInfo);
324 /**********************************************************************
325 * LoadIcon [USER.174]
327 HICON LoadIcon(HANDLE instance, LPSTR icon_name)
332 ICONDESCRIP *lpicodesc;
336 BITMAPINFOHEADER *bih;
341 if(debugging_resource){
342 printf("LoadIcon(%04X", instance);
349 if (HIWORD((int)icon_name)) return 0; /* FIXME: should handle '#xxx' */
350 return OBM_LoadIcon( LOWORD((int)icon_name) );
353 if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
354 rsc_mem = RSC_LoadResource(instance, icon_name, (LPSTR) NE_RSCTYPE_GROUP_ICON,
356 if (rsc_mem == (HANDLE)NULL) {
357 printf("LoadIcon / Icon %04X not Found !\n", (int) icon_name);
358 ReleaseDC(GetDesktopWindow(), hdc);
361 lp = (WORD *)GlobalLock(rsc_mem);
364 ReleaseDC(GetDesktopWindow(), hdc);
367 lpicodesc = (ICONDESCRIP *)(lp + 3);
368 hIcon = GlobalAlloc(GMEM_MOVEABLE, sizeof(ICONALLOC) + 1024);
369 if (hIcon == (HICON)NULL) {
371 ReleaseDC(GetDesktopWindow(), hdc);
374 lpico = (ICONALLOC *)GlobalLock(hIcon);
375 lpico->descriptor = *lpicodesc;
376 width = lpicodesc->Width;
377 height = lpicodesc->Height;
378 GlobalUnlock(rsc_mem);
380 rsc_mem = RSC_LoadResource(instance,
381 MAKEINTRESOURCE(lpicodesc->icoDIBOffset),
382 (LPSTR) NE_RSCTYPE_ICON, &image_size);
383 if (rsc_mem == (HANDLE)NULL) {
384 printf("LoadIcon / Icon %04X Bitmaps not Found !\n", (int) icon_name);
385 ReleaseDC(GetDesktopWindow(), hdc);
388 lp = (WORD *)GlobalLock(rsc_mem);
391 ReleaseDC(GetDesktopWindow(), hdc);
394 bmi = (BITMAPINFO *)lp;
395 bih = (BITMAPINFOHEADER *)lp;
396 rgbq = &bmi->bmiColors[0];
397 bih->biHeight = bih->biHeight / 2;
399 printf("LoadIcon / image_size=%d width=%d height=%d bih->biBitCount=%d bih->biSizeImage=%ld\n",
400 image_size, width, height, bih->biBitCount, bih->biSizeImage);
402 if (bih->biSize == sizeof(BITMAPINFOHEADER))
403 lpico->hBitmap = ConvertInfoBitmap(hdc, (BITMAPINFO *)bih);
407 bih->biClrUsed = bih->biClrImportant = 2;
408 rgbq[0].rgbBlue = rgbq[0].rgbGreen = rgbq[0].rgbRed = 0x00;
409 rgbq[1].rgbBlue = rgbq[1].rgbGreen = rgbq[1].rgbRed = 0xff;
410 rgbq[0].rgbReserved = rgbq[1].rgbReserved = 0;
411 if (bih->biSizeImage == 0) {
412 if (bih->biCompression != BI_RGB) {
413 fprintf(stderr,"Unknown size for compressed Icon bitmap.\n");
415 ReleaseDC(GetDesktopWindow(), hdc);
418 bih->biSizeImage = (bih->biWidth * bih->biHeight * bih->biBitCount
421 lpico->hBitMask = CreateDIBitmap(hdc, bih, CBM_INIT,
422 (LPSTR)lp + bih->biSizeImage - sizeof(BITMAPINFOHEADER) / 2 - 4,
423 (BITMAPINFO *)bih, DIB_RGB_COLORS );
424 GlobalUnlock(rsc_mem);
426 ReleaseDC(GetDesktopWindow(), hdc);
428 dprintf_resource(stddeb,"LoadIcon Alloc hIcon=%X\n", hIcon);
432 /**********************************************************************
433 * CreateIcon [USER.407]
435 HICON CreateIcon(HANDLE hInstance, int nWidth, int nHeight,
436 BYTE nPlanes, BYTE nBitsPixel, LPSTR lpANDbits,
442 dprintf_resource(stddeb, "CreateIcon: hInstance = %04x, nWidth = %08x, nHeight = %08x \n",
443 hInstance, nWidth, nHeight);
444 dprintf_resource(stddeb, " nPlanes = %04x, nBitsPixel = %04x,",nPlanes, nBitsPixel);
445 dprintf_resource(stddeb, " lpANDbits= %04x, lpXORbits = %04x, \n", (int)lpANDbits,
448 if (hInstance == (HANDLE)NULL) {
449 printf("CreateIcon / hInstance %04x not Found!\n",hInstance);
452 hIcon = GlobalAlloc(GMEM_MOVEABLE, sizeof(ICONALLOC) + 1024);
453 if (hIcon == (HICON)NULL) {
454 printf("Can't allocate memory for Icon in CreateIcon\n");
457 lpico= (ICONALLOC *)GlobalLock(hIcon);
459 lpico->descriptor.Width=nWidth;
460 lpico->descriptor.Height=nHeight;
461 lpico->descriptor.ColorCount=16; /* Dummy Value */
462 lpico->descriptor.Reserved1=0;
463 lpico->descriptor.Reserved2=nPlanes;
464 lpico->descriptor.Reserved3=nWidth*nHeight;
466 /* either nPlanes and/or nBitCount is set to one */
467 lpico->descriptor.icoDIBSize=nWidth*nHeight*nPlanes*nBitsPixel;
468 lpico->descriptor.icoDIBOffset=0;
470 if( !(lpico->hBitmap=CreateBitmap(nWidth, nHeight, nPlanes, nBitsPixel,
472 printf("CreateIcon: couldn't create the XOR bitmap\n");
476 /* the AND BitMask is always monochrome */
477 if( !(lpico->hBitMask=CreateBitmap(nWidth, nHeight, 1, 1, lpANDbits)) ) {
478 printf("CreateIcon: couldn't create the AND bitmap\n");
483 dprintf_resource(stddeb, "CreateIcon Alloc hIcon=%X\n", hIcon);
487 /**********************************************************************
488 * DestroyIcon [USER.457]
490 BOOL DestroyIcon(HICON hIcon)
494 if (hIcon == (HICON)NULL)
496 lpico = (ICONALLOC *)GlobalLock(hIcon);
497 if (lpico->hBitmap != (HBITMAP)NULL)
498 DeleteObject(lpico->hBitmap);
503 /**********************************************************************
504 * LoadAccelerators [USER.177]
506 HANDLE LoadAccelerators(HANDLE instance, LPSTR lpTableName)
511 ACCELHEADER *lpAccelTbl;
512 int i, image_size, n;
515 printf("LoadAccelerators(%04X", instance);
516 PrintId(lpTableName);
520 rsc_mem = RSC_LoadResource(instance, lpTableName, (LPSTR) NE_RSCTYPE_ACCELERATOR,
522 if (rsc_mem == (HANDLE)NULL) {
523 printf("LoadAccelerators(%04X", instance);
524 PrintId(lpTableName);
525 printf(") not found !\n");
528 lp = (BYTE *)GlobalLock(rsc_mem);
533 dprintf_accel(stddeb,"LoadAccelerators / image_size=%d\n", image_size);
535 hAccel = GlobalAlloc(GMEM_MOVEABLE,
536 sizeof(ACCELHEADER) + (n + 1)*sizeof(ACCELENTRY));
537 lpAccelTbl = (LPACCELHEADER)GlobalLock(hAccel);
538 lpAccelTbl->wCount = 0;
539 for (i = 0; i < n; i++) {
540 lpAccelTbl->tbl[i].type = *(lp++);
541 lpAccelTbl->tbl[i].wEvent = *((WORD *)lp);
543 lpAccelTbl->tbl[i].wIDval = *((WORD *)lp);
545 if (lpAccelTbl->tbl[i].wEvent == 0) break;
546 dprintf_accel(stddeb,
547 "Accelerator #%u / event=%04X id=%04X type=%02X \n",
548 i, lpAccelTbl->tbl[i].wEvent, lpAccelTbl->tbl[i].wIDval,
549 lpAccelTbl->tbl[i].type);
550 lpAccelTbl->wCount++;
552 GlobalUnlock(hAccel);
553 GlobalUnlock(rsc_mem);
558 /**********************************************************************
559 * TranslateAccelerator [USER.178]
561 int TranslateAccelerator(HWND hWnd, HANDLE hAccel, LPMSG msg)
563 ACCELHEADER *lpAccelTbl;
566 if (hAccel == 0 || msg == NULL) return 0;
567 if (msg->message != WM_KEYDOWN &&
568 msg->message != WM_KEYUP &&
569 msg->message != WM_CHAR) return 0;
571 dprintf_accel(stddeb, "TranslateAccelerators hAccel=%04X !\n", hAccel);
573 lpAccelTbl = (LPACCELHEADER)GlobalLock(hAccel);
574 for (i = 0; i < lpAccelTbl->wCount; i++) {
575 if (lpAccelTbl->tbl[i].type & VIRTKEY_ACCEL) {
576 if (msg->wParam == lpAccelTbl->tbl[i].wEvent &&
577 msg->message == WM_KEYDOWN) {
578 if ((lpAccelTbl->tbl[i].type & SHIFT_ACCEL) &&
579 !(GetKeyState(VK_SHIFT) & 0xf)) {
580 GlobalUnlock(hAccel);
583 if ((lpAccelTbl->tbl[i].type & CONTROL_ACCEL) &&
584 !(GetKeyState(VK_CONTROL) & 0xf)) {
585 GlobalUnlock(hAccel);
588 if ((lpAccelTbl->tbl[i].type & ALT_ACCEL) &&
589 !(GetKeyState(VK_MENU) & 0xf)) {
590 GlobalUnlock(hAccel);
593 SendMessage(hWnd, WM_COMMAND, lpAccelTbl->tbl[i].wIDval, 0x00010000L);
594 GlobalUnlock(hAccel);
597 if (msg->message == WM_KEYUP) return 1;
600 if (msg->wParam == lpAccelTbl->tbl[i].wEvent &&
601 msg->message == WM_CHAR) {
602 SendMessage(hWnd, WM_COMMAND, lpAccelTbl->tbl[i].wIDval, 0x00010000L);
603 GlobalUnlock(hAccel);
608 GlobalUnlock(hAccel);
612 /**********************************************************************
616 LoadString(HANDLE instance, WORD resource_id, LPSTR buffer, int buflen)
624 dprintf_resource(stddeb, "LoadString: instance = %04x, id = %d, buffer = %08x, "
625 "length = %d\n", instance, resource_id, (int) buffer, buflen);
627 hmem = RSC_LoadResource(instance, (char *) ((resource_id >> 4) + 1),
628 (LPSTR) NE_RSCTYPE_STRING, &rsc_size);
632 p = GlobalLock(hmem);
633 string_num = resource_id & 0x000f;
634 for (i = 0; i < string_num; i++)
637 i = MIN(buflen - 1, *p);
639 memcpy(buffer, p + 1, i);
647 fprintf(stderr,"LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen, *p);
648 fprintf(stderr,"LoadString // and try to obtain string '%s'\n", p + 1);
652 dprintf_resource(stddeb,"LoadString // '%s' copied !\n", buffer);
656 /**********************************************************************
657 * LoadMenu [USER.150]
659 HMENU LoadMenu(HINSTANCE instance, char *menu_name)
663 MENU_HEADER *menu_desc;
666 printf("LoadMenu(%04X", instance);
670 if (menu_name == NULL)
673 if ((hMenu_desc = RSC_LoadResource(instance, menu_name, (LPSTR) NE_RSCTYPE_MENU, NULL)) == (HANDLE) NULL)
676 menu_desc = (MENU_HEADER *) GlobalLock(hMenu_desc);
677 hMenu = LoadMenuIndirect((LPSTR)menu_desc);
681 /**********************************************************************
685 LoadBitmap(HANDLE instance, LPSTR bmp_name)
694 if(debugging_resource){
695 printf("LoadBitmap(%04X", instance);
702 if (HIWORD((int)bmp_name)) return 0; /* FIXME: should handle '#xxx' */
703 return OBM_LoadBitmap( LOWORD((int)bmp_name) );
706 rsc_mem = RSC_LoadResource(instance, bmp_name, (LPSTR) NE_RSCTYPE_BITMAP,
708 if (rsc_mem == (HANDLE)NULL) {
709 printf("LoadBitmap(%04X", instance);
711 printf(") NOT found!\n");
714 lp = (long *) GlobalLinearLock(rsc_mem);
720 if (!(hdc = GetDC(0))) lp = NULL;
721 size = CONV_LONG (*lp);
722 if (size == sizeof(BITMAPCOREHEADER)){
723 CONV_BITMAPCOREHEADER (lp);
724 hbitmap = ConvertCoreBitmap( hdc, (BITMAPCOREHEADER *) lp );
725 } else if (size == sizeof(BITMAPINFOHEADER)){
726 CONV_BITMAPINFO (lp);
727 hbitmap = ConvertInfoBitmap( hdc, (BITMAPINFO *) lp );