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";
6 #include "prototypes.h"
11 #define MIN(a,b) ((a) < (b) ? (a) : (b))
13 /**********************************************************************
17 ConvertCoreBitmap( HDC hdc, BITMAPCOREHEADER * image )
22 int i, size, n_colors;
24 n_colors = 1 << image->bcBitCount;
26 if (image->bcBitCount < 24)
28 size = sizeof(BITMAPINFOHEADER) + n_colors * sizeof(RGBQUAD);
29 bits = (char *) (image + 1) + (n_colors * sizeof(RGBTRIPLE));
33 size = sizeof(BITMAPINFOHEADER);
34 bits = (char *) (image + 1);
36 bmpInfo = (BITMAPINFO *) malloc( size );
38 bmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
39 bmpInfo->bmiHeader.biWidth = image->bcWidth;
40 bmpInfo->bmiHeader.biHeight = image->bcHeight;
41 bmpInfo->bmiHeader.biPlanes = image->bcPlanes;
42 bmpInfo->bmiHeader.biBitCount = image->bcBitCount;
43 bmpInfo->bmiHeader.biCompression = 0;
44 bmpInfo->bmiHeader.biSizeImage = 0;
45 bmpInfo->bmiHeader.biXPelsPerMeter = 0;
46 bmpInfo->bmiHeader.biYPelsPerMeter = 0;
47 bmpInfo->bmiHeader.biClrUsed = 0;
48 bmpInfo->bmiHeader.biClrImportant = 0;
50 if (image->bcBitCount < 24)
52 RGBTRIPLE * oldMap = (RGBTRIPLE *)(image + 1);
53 RGBQUAD * newMap = bmpInfo->bmiColors;
54 for (i = 0; i < n_colors; i++, oldMap++, newMap++)
56 newMap->rgbRed = oldMap->rgbtRed;
57 newMap->rgbGreen = oldMap->rgbtGreen;
58 newMap->rgbBlue = oldMap->rgbtBlue;
59 newMap->rgbReserved = 0;
63 hbitmap = CreateDIBitmap( hdc, &bmpInfo->bmiHeader, CBM_INIT,
64 bits, bmpInfo, DIB_RGB_COLORS );
69 /**********************************************************************
73 ConvertInfoBitmap( HDC hdc, BITMAPINFO * image )
75 char * bits = ((char *)image) + DIB_BitmapInfoSize(image, DIB_RGB_COLORS);
76 return CreateDIBitmap( hdc, &image->bmiHeader, CBM_INIT,
77 bits, image, DIB_RGB_COLORS );
80 /**********************************************************************
81 * FindResourceByNumber
84 FindResourceByNumber(struct resource_nameinfo_s *result_p,
85 int type_id, int resource_id)
87 struct resource_typeinfo_s typeinfo;
88 struct resource_nameinfo_s nameinfo;
89 unsigned short size_shift;
93 * Move to beginning of resource table.
95 lseek(CurrentNEFile, (CurrentMZHeader->ne_offset +
96 CurrentNEHeader->resource_tab_offset), SEEK_SET);
101 if (read(CurrentNEFile, &size_shift, sizeof(size_shift)) !=
110 typeinfo.type_id = 0xffff;
111 while (typeinfo.type_id != 0)
113 if (read(CurrentNEFile, &typeinfo, sizeof(typeinfo)) !=
118 if (typeinfo.type_id != 0)
120 for (i = 0; i < typeinfo.count; i++)
122 if (read(CurrentNEFile, &nameinfo, sizeof(nameinfo)) !=
128 #if defined(DEBUG_RESOURCE) && defined(VERBOSE_DEBUG)
129 if (type_id == typeinfo.type_id)
131 printf("FindResource: type id = %d, resource id = %x\n",
132 type_id, nameinfo.id);
135 if ((type_id == -1 || typeinfo.type_id == type_id) &&
136 nameinfo.id == resource_id)
138 memcpy(result_p, &nameinfo, sizeof(nameinfo));
148 /**********************************************************************
152 FindResourceByName(struct resource_nameinfo_s *result_p,
153 int type_id, char *resource_name)
155 struct resource_typeinfo_s typeinfo;
156 struct resource_nameinfo_s nameinfo;
157 unsigned short size_shift;
158 off_t old_pos, new_pos;
159 unsigned char nbytes;
164 * Move to beginning of resource table.
166 lseek(CurrentNEFile, (CurrentMZHeader->ne_offset +
167 CurrentNEHeader->resource_tab_offset), SEEK_SET);
172 if (read(CurrentNEFile, &size_shift, sizeof(size_shift)) !=
181 typeinfo.type_id = 0xffff;
182 while (typeinfo.type_id != 0)
184 if (read(CurrentNEFile, &typeinfo, sizeof(typeinfo)) !=
189 if (typeinfo.type_id == type_id || type_id == -1)
191 for (i = 0; i < typeinfo.count; i++)
193 if (read(CurrentNEFile, &nameinfo, sizeof(nameinfo)) !=
199 if (nameinfo.id & 0x8000)
202 old_pos = lseek(CurrentNEFile, 0, SEEK_CUR);
203 new_pos = (CurrentMZHeader->ne_offset +
204 CurrentNEHeader->resource_tab_offset +
206 lseek(CurrentNEFile, new_pos, SEEK_SET);
207 read(CurrentNEFile, &nbytes, 1);
208 read(CurrentNEFile, name, nbytes);
209 lseek(CurrentNEFile, old_pos, SEEK_SET);
212 if (strcasecmp(name, resource_name) == 0)
214 memcpy(result_p, &nameinfo, sizeof(nameinfo));
224 /**********************************************************************
228 LoadString(HANDLE instance, WORD resource_id, LPSTR buffer, int buflen)
230 struct resource_nameinfo_s nameinfo;
231 unsigned short target_id;
232 unsigned char string_length;
237 #ifdef DEBUG_RESOURCE
238 printf("LoadString: instance = %04x, id = %d, "
239 "buffer = %08x, length = %d\n",
240 instance, resource_id, buffer, buflen);
246 target_id = (resource_id >> 4) + 0x8001;
247 string_num = resource_id & 0x000f;
249 size_shift = FindResourceByNumber(&nameinfo, NE_RSCTYPE_STRING, target_id);
250 if (size_shift == -1)
253 lseek(CurrentNEFile, (int) nameinfo.offset << size_shift, SEEK_SET);
255 for (i = 0; i < string_num; i++)
257 read(CurrentNEFile, &string_length, 1);
258 lseek(CurrentNEFile, string_length, SEEK_CUR);
261 read(CurrentNEFile, &string_length, 1);
262 i = MIN(string_length, buflen - 1);
263 read(CurrentNEFile, buffer, i);
265 #ifdef DEBUG_RESOURCE
266 printf(" '%s'\n", buffer);
271 /**********************************************************************
275 LoadIcon(HANDLE instance, LPSTR icon_name)
277 fprintf(stderr,"LoadIcon: (%d),%d\n",instance,icon_name);
281 /**********************************************************************
285 LoadCursor(HANDLE instance, LPSTR cursor_name)
287 fprintf(stderr,"LoadCursor: (%d),%d\n",instance,cursor_name);
291 /**********************************************************************
295 LoadAccelerators(HANDLE instance, LPSTR lpTableName)
297 fprintf(stderr,"LoadAccelerators: (%d),%d\n",instance,lpTableName);
301 /**********************************************************************
305 RSC_LoadResource(int instance, char *rsc_name, int type, int *image_size_ret)
307 struct resource_nameinfo_s nameinfo;
321 * Get resource by ordinal
323 else if (((int) rsc_name & 0xffff0000) == 0)
325 size_shift = FindResourceByNumber(&nameinfo, type,
326 (int) rsc_name | 0x8000);
329 * Get resource by name
333 size_shift = FindResourceByName(&nameinfo, type, rsc_name);
335 if (size_shift == -1)
341 lseek(CurrentNEFile, ((int) nameinfo.offset << size_shift), SEEK_SET);
343 image_size = nameinfo.length << size_shift;
344 if (image_size_ret != NULL)
345 *image_size_ret = image_size;
347 hmem = GlobalAlloc(GMEM_MOVEABLE, image_size);
348 image = GlobalLock(hmem);
349 if (image == NULL || read(CurrentNEFile, image, image_size) != image_size)
359 /**********************************************************************
363 RSC_LoadMenu(HANDLE instance, LPSTR menu_name)
365 return RSC_LoadResource(instance, menu_name, NE_RSCTYPE_MENU, NULL);
368 /**********************************************************************
372 LoadBitmap(HANDLE instance, LPSTR bmp_name)
380 #ifdef DEBUG_RESOURCE
381 printf("LoadBitmap: instance = %04x, name = %08x\n",
385 if (!(hdc = GetDC( 0 ))) return 0;
387 rsc_mem = RSC_LoadResource(instance, bmp_name, NE_RSCTYPE_BITMAP,
389 lp = (long *) GlobalLock(rsc_mem);
396 if (*lp == sizeof(BITMAPCOREHEADER))
397 hbitmap = ConvertCoreBitmap( hdc, (BITMAPCOREHEADER *) lp );
398 else if (*lp == sizeof(BITMAPINFOHEADER))
399 hbitmap = ConvertInfoBitmap( hdc, (BITMAPINFO *) lp );