1 /* mswindows-specific glyph objects.
2 Copyright (C) 1998, 1999, 2000 Andy Piper.
4 This file is part of XEmacs.
6 XEmacs is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with XEmacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 /* Synched up with: Not in FSF. */
23 /* written by Andy Piper <andy@xemacs.org> plagerising bits from
30 #define OEMRESOURCE /* Define OCR_ and friend constants */
31 #include "console-msw.h"
32 #include "glyphs-msw.h"
33 #include "objects-msw.h"
46 #include "file-coding.h"
54 #define WIDGET_GLYPH_SLOT 0
56 DECLARE_IMAGE_INSTANTIATOR_FORMAT (nothing);
57 DECLARE_IMAGE_INSTANTIATOR_FORMAT (string);
58 DECLARE_IMAGE_INSTANTIATOR_FORMAT (formatted_string);
59 DECLARE_IMAGE_INSTANTIATOR_FORMAT (inherit);
60 DECLARE_IMAGE_INSTANTIATOR_FORMAT (layout);
62 DECLARE_IMAGE_INSTANTIATOR_FORMAT (jpeg);
65 DECLARE_IMAGE_INSTANTIATOR_FORMAT (tiff);
68 DECLARE_IMAGE_INSTANTIATOR_FORMAT (png);
71 DECLARE_IMAGE_INSTANTIATOR_FORMAT (gif);
74 DEFINE_DEVICE_IIFORMAT (mswindows, xpm);
76 DEFINE_DEVICE_IIFORMAT (mswindows, xbm);
78 DEFINE_DEVICE_IIFORMAT (mswindows, xface);
80 DEFINE_DEVICE_IIFORMAT (mswindows, button);
81 DEFINE_DEVICE_IIFORMAT (mswindows, edit_field);
82 DEFINE_DEVICE_IIFORMAT (mswindows, subwindow);
83 DEFINE_DEVICE_IIFORMAT (mswindows, widget);
84 DEFINE_DEVICE_IIFORMAT (mswindows, label);
85 DEFINE_DEVICE_IIFORMAT (mswindows, scrollbar);
86 DEFINE_DEVICE_IIFORMAT (mswindows, combo_box);
87 DEFINE_DEVICE_IIFORMAT (mswindows, progress_gauge);
88 DEFINE_DEVICE_IIFORMAT (mswindows, tree_view);
89 DEFINE_DEVICE_IIFORMAT (mswindows, tab_control);
91 DEFINE_IMAGE_INSTANTIATOR_FORMAT (bmp);
93 Lisp_Object Vmswindows_bitmap_file_path;
94 static COLORREF transparent_color = RGB (1,1,1);
96 DEFINE_IMAGE_INSTANTIATOR_FORMAT (mswindows_resource);
97 Lisp_Object Q_resource_type, Q_resource_id;
98 Lisp_Object Qmswindows_resource;
101 mswindows_initialize_dibitmap_image_instance (Lisp_Image_Instance *ii,
103 enum image_instance_type type);
105 mswindows_initialize_image_instance_mask (Lisp_Image_Instance* image,
108 #define BPLINE(width) ((int)(~3UL & (unsigned long)((width) +3)))
110 /************************************************************************/
111 /* convert from a series of RGB triples to a BITMAPINFO formated for the*/
113 /************************************************************************/
114 static BITMAPINFO* convert_EImage_to_DIBitmap (Lisp_Object device,
115 int width, int height,
118 unsigned char** bmp_data)
120 struct device *d = XDEVICE (device);
124 BITMAPINFO* bmp_info;
125 unsigned char *ip, *dp;
127 if (DEVICE_MSWINDOWS_BITSPIXEL (d) > 0)
129 int bpline = BPLINE(width * 3);
130 /* FIXME: we can do this because 24bpp implies no color table, once
131 * we start palettizing this is no longer true. The X versions of
132 * this function quantises to 256 colors or bit masks down to a
133 * long. Windows can actually handle rgb triples in the raw so I
134 * don't see much point trying to optimize down to the best
135 * structure - unless it has memory / color allocation implications
137 bmp_info=xnew_and_zero (BITMAPINFO);
144 bmp_info->bmiHeader.biBitCount=24; /* just RGB triples for now */
145 bmp_info->bmiHeader.biCompression=BI_RGB; /* just RGB triples for now */
146 bmp_info->bmiHeader.biSizeImage=width*height*3;
148 /* bitmap data needs to be in blue, green, red triples - in that
149 order, eimage is in RGB format so we need to convert */
150 *bmp_data = xnew_array_and_zero (unsigned char, bpline * height);
151 *bit_count = bpline * height;
160 for (i = height-1; i >= 0; i--) {
161 dp = (*bmp_data) + (i * bpline);
162 for (j = 0; j < width; j++) {
170 else /* scale to 256 colors */
174 int bpline = BPLINE (width * 3);
175 /* Quantize the image and get a histogram while we're at it.
176 Do this first to save memory */
177 qtable = build_EImage_quantable(pic, width, height, 256);
178 if (qtable == NULL) return NULL;
180 /* use our quantize table to allocate the colors */
181 ncolors = qtable->num_active_colors;
182 bmp_info=(BITMAPINFO*)xmalloc_and_zero (sizeof(BITMAPINFOHEADER) +
183 sizeof(RGBQUAD) * ncolors);
190 colortbl=(RGBQUAD*)(((unsigned char*)bmp_info)+sizeof(BITMAPINFOHEADER));
192 bmp_info->bmiHeader.biBitCount=8;
193 bmp_info->bmiHeader.biCompression=BI_RGB;
194 bmp_info->bmiHeader.biSizeImage=bpline*height;
195 bmp_info->bmiHeader.biClrUsed=ncolors;
196 bmp_info->bmiHeader.biClrImportant=ncolors;
198 *bmp_data = (unsigned char *) xmalloc_and_zero (bpline * height);
199 *bit_count = bpline * height;
208 /* build up an RGBQUAD colortable */
209 for (i = 0; i < qtable->num_active_colors; i++) {
210 colortbl[i].rgbRed = (BYTE) qtable->rm[i];
211 colortbl[i].rgbGreen = (BYTE) qtable->gm[i];
212 colortbl[i].rgbBlue = (BYTE) qtable->bm[i];
213 colortbl[i].rgbReserved = 0;
216 /* now build up the data. picture has to be upside-down and
217 back-to-front for msw bitmaps */
219 for (i = height-1; i >= 0; i--) {
220 dp = (*bmp_data) + (i * bpline);
221 for (j = 0; j < width; j++) {
225 *dp++ = QUANT_GET_COLOR (qtable,rd,gr,bl);
230 /* fix up the standard stuff */
231 bmp_info->bmiHeader.biWidth=width;
232 bmp_info->bmiHeader.biHeight=height;
233 bmp_info->bmiHeader.biPlanes=1;
234 bmp_info->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
235 bmp_info->bmiHeader.biXPelsPerMeter=0; /* unless you know better */
236 bmp_info->bmiHeader.biYPelsPerMeter=0;
241 /* Given a pixmap filename, look through all of the "standard" places
242 where the file might be located. Return a full pathname if found;
243 otherwise, return Qnil. */
246 mswindows_locate_pixmap_file (Lisp_Object name)
248 /* This function can GC if IN_REDISPLAY is false */
251 /* Check non-absolute pathnames with a directory component relative to
252 the search path; that's the way Xt does it. */
253 if (IS_DIRECTORY_SEP(XSTRING_BYTE (name, 0)) ||
254 (XSTRING_BYTE (name, 0) == '.' &&
255 (IS_DIRECTORY_SEP(XSTRING_BYTE (name, 1)) ||
256 (XSTRING_BYTE (name, 1) == '.' &&
257 (IS_DIRECTORY_SEP(XSTRING_BYTE (name, 2)))))))
259 if (!NILP (Ffile_readable_p (name)))
260 return Fexpand_file_name (name, Qnil);
265 if (locate_file (Vmswindows_bitmap_file_path, name, Qnil, &found, R_OK) < 0)
267 Lisp_Object temp = list1 (Vdata_directory);
271 locate_file (temp, name, Qnil, &found, R_OK);
279 /* Initialize an image instance from a bitmap
281 DEST_MASK specifies the mask of allowed image types.
283 If this fails, signal an error. INSTANTIATOR is only used
284 in the error message. */
287 init_image_instance_from_dibitmap (Lisp_Image_Instance *ii,
288 BITMAPINFO *bmp_info,
293 Lisp_Object instantiator,
294 int x_hot, int y_hot,
297 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
298 struct device *d = XDEVICE (device);
305 if (!DEVICE_MSWINDOWS_P (d))
306 signal_simple_error ("Not an mswindows device", device);
308 if (NILP (DEVICE_SELECTED_FRAME (d)))
309 signal_simple_error ("No selected frame on mswindows device", device);
311 f = XFRAME (DEVICE_SELECTED_FRAME (d));
313 if (dest_mask & IMAGE_COLOR_PIXMAP_MASK)
314 type = IMAGE_COLOR_PIXMAP;
315 else if (dest_mask & IMAGE_POINTER_MASK)
316 type = IMAGE_POINTER;
318 incompatible_image_types (instantiator, dest_mask,
319 IMAGE_COLOR_PIXMAP_MASK | IMAGE_POINTER_MASK);
320 hdc = FRAME_MSWINDOWS_CDC (f);
322 bitmap=CreateDIBSection (hdc,
328 if (!bitmap || !bmp_buf)
329 signal_simple_error ("Unable to create bitmap", instantiator);
331 /* copy in the actual bitmap */
332 memcpy (bmp_buf, bmp_data, bmp_bits);
334 mswindows_initialize_dibitmap_image_instance (ii, slices, type);
336 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) =
337 find_keyword_in_vector (instantiator, Q_file);
339 /* Fixup a set of bitmaps. */
340 IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = bitmap;
342 IMAGE_INSTANCE_MSWINDOWS_MASK (ii) = NULL;
343 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = bmp_info->bmiHeader.biWidth;
344 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = bmp_info->bmiHeader.biHeight;
345 IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = bmp_info->bmiHeader.biBitCount;
346 XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii), x_hot);
347 XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii), y_hot);
351 mswindows_initialize_image_instance_mask (ii, f);
354 if (type == IMAGE_POINTER)
356 mswindows_initialize_image_instance_icon(ii, TRUE);
361 image_instance_add_dibitmap (Lisp_Image_Instance *ii,
362 BITMAPINFO *bmp_info,
366 Lisp_Object instantiator)
368 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
369 struct device *d = XDEVICE (device);
370 struct frame *f = XFRAME (DEVICE_SELECTED_FRAME (d));
372 HDC hdc = FRAME_MSWINDOWS_CDC (f);
373 HBITMAP bitmap = CreateDIBSection (hdc,
379 if (!bitmap || !bmp_buf)
380 signal_simple_error ("Unable to create bitmap", instantiator);
382 /* copy in the actual bitmap */
383 memcpy (bmp_buf, bmp_data, bmp_bits);
384 IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICE (ii, slice) = bitmap;
388 mswindows_init_image_instance_from_eimage (Lisp_Image_Instance *ii,
389 int width, int height,
391 unsigned char *eimage,
393 Lisp_Object instantiator,
396 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
397 BITMAPINFO* bmp_info;
398 unsigned char* bmp_data;
403 if (!DEVICE_MSWINDOWS_P (XDEVICE (device)))
404 signal_simple_error ("Not an mswindows device", device);
406 /* this is a hack but MaskBlt and TransparentBlt are not supported
407 on most windows variants */
408 bkcolor = COLOR_INSTANCE_MSWINDOWS_COLOR
409 (XCOLOR_INSTANCE (FACE_BACKGROUND (Vdefault_face, domain)));
411 for (slice = 0; slice < slices; slice++)
413 /* build a bitmap from the eimage */
414 if (!(bmp_info=convert_EImage_to_DIBitmap (device, width, height,
415 eimage + (width * height * 3 * slice),
416 &bmp_bits, &bmp_data)))
418 signal_simple_error ("EImage to DIBitmap conversion failed",
422 /* Now create the pixmap and set up the image instance */
424 init_image_instance_from_dibitmap (ii, bmp_info, dest_mask,
425 bmp_data, bmp_bits, slices, instantiator,
428 image_instance_add_dibitmap (ii, bmp_info, bmp_data, bmp_bits, slice,
436 static void set_mono_pixel ( unsigned char* bits,
437 int bpline, int height,
438 int x, int y, int white )
441 unsigned char bitnum;
442 /* Find the byte on which this scanline begins */
443 i = (height - y - 1) * bpline;
444 /* Find the byte containing this pixel */
446 /* Which bit is it? */
447 bitnum = (unsigned char)( 7 - (x % 8) );
448 if( white ) /* Turn it on */
449 bits[i] |= (1<<bitnum);
450 else /* Turn it off */
451 bits[i] &= ~(1<<bitnum);
455 mswindows_initialize_image_instance_mask (Lisp_Image_Instance* image,
460 HDC hcdc = FRAME_MSWINDOWS_CDC (f);
461 unsigned char* dibits;
462 BITMAPINFO* bmp_info =
463 xmalloc_and_zero (sizeof(BITMAPINFO) + sizeof(RGBQUAD));
465 int height = IMAGE_INSTANCE_PIXMAP_HEIGHT (image);
468 int maskbpline = BPLINE ((IMAGE_INSTANCE_PIXMAP_WIDTH (image)+7)/8);
469 int bpline = BPLINE (IMAGE_INSTANCE_PIXMAP_WIDTH (image) * 3);
474 bmp_info->bmiHeader.biWidth=IMAGE_INSTANCE_PIXMAP_WIDTH (image);
475 bmp_info->bmiHeader.biHeight = height;
476 bmp_info->bmiHeader.biPlanes=1;
477 bmp_info->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
478 bmp_info->bmiHeader.biBitCount=1;
479 bmp_info->bmiHeader.biCompression=BI_RGB;
480 bmp_info->bmiHeader.biClrUsed = 2;
481 bmp_info->bmiHeader.biClrImportant = 2;
482 bmp_info->bmiHeader.biSizeImage = height * maskbpline;
483 bmp_info->bmiColors[0].rgbRed = 0;
484 bmp_info->bmiColors[0].rgbGreen = 0;
485 bmp_info->bmiColors[0].rgbBlue = 0;
486 bmp_info->bmiColors[0].rgbReserved = 0;
487 bmp_info->bmiColors[1].rgbRed = 255;
488 bmp_info->bmiColors[1].rgbGreen = 255;
489 bmp_info->bmiColors[1].rgbBlue = 255;
490 bmp_info->bmiColors[0].rgbReserved = 0;
492 if (!(mask = CreateDIBSection (hcdc,
502 old = SelectObject (hcdc, IMAGE_INSTANCE_MSWINDOWS_BITMAP (image));
503 /* build up an in-memory set of bits to mess with */
506 bmp_info->bmiHeader.biWidth=IMAGE_INSTANCE_PIXMAP_WIDTH (image);
507 bmp_info->bmiHeader.biHeight = -height;
508 bmp_info->bmiHeader.biPlanes=1;
509 bmp_info->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
510 bmp_info->bmiHeader.biBitCount=24;
511 bmp_info->bmiHeader.biCompression=BI_RGB;
512 bmp_info->bmiHeader.biClrUsed = 0;
513 bmp_info->bmiHeader.biClrImportant = 0;
514 bmp_info->bmiHeader.biSizeImage = height * bpline;
516 dibits = xmalloc_and_zero (bpline * height);
518 IMAGE_INSTANCE_MSWINDOWS_BITMAP (image),
523 DIB_RGB_COLORS) <= 0)
529 /* now set the colored bits in the mask and transparent ones to
530 black in the original */
531 for(i=0; i<IMAGE_INSTANCE_PIXMAP_WIDTH (image); i++)
533 for(j=0; j<height; j++)
535 unsigned char* idx = &dibits[j * bpline + i * 3];
537 if( RGB (idx[2], idx[1], idx[0]) == transparent_color )
539 idx[0] = idx[1] = idx[2] = 0;
540 set_mono_pixel( and_bits, maskbpline, height, i, j, TRUE );
544 set_mono_pixel( and_bits, maskbpline, height, i, j, FALSE );
550 IMAGE_INSTANCE_MSWINDOWS_BITMAP (image),
560 SelectObject(hcdc, old);
562 IMAGE_INSTANCE_MSWINDOWS_MASK (image) = mask;
566 mswindows_initialize_image_instance_icon (Lisp_Image_Instance* image,
571 /* we rely on windows to do any resizing necessary */
572 x_icon.fIcon=cursor ? FALSE : TRUE;
573 x_icon.xHotspot=XINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (image));
574 x_icon.yHotspot=XINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (image));
575 x_icon.hbmMask=IMAGE_INSTANCE_MSWINDOWS_MASK (image);
576 x_icon.hbmColor=IMAGE_INSTANCE_MSWINDOWS_BITMAP (image);
578 IMAGE_INSTANCE_MSWINDOWS_ICON (image)=
579 CreateIconIndirect (&x_icon);
583 mswindows_create_resized_bitmap (Lisp_Image_Instance* ii,
589 HDC hcdc = FRAME_MSWINDOWS_CDC (f);
590 HDC hdcDst = CreateCompatibleDC (hcdc);
592 old1 = SelectObject (hcdc, IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii));
594 newbmp = CreateCompatibleBitmap (hcdc, newx, newy);
596 old2 = SelectObject (hdcDst, newbmp);
598 if (!StretchBlt (hdcDst, 0, 0, newx, newy,
600 IMAGE_INSTANCE_PIXMAP_WIDTH (ii),
601 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii),
604 DeleteObject (newbmp);
609 SelectObject (hdcDst, old2);
610 SelectObject (hcdc, old1);
617 mswindows_create_resized_mask (Lisp_Image_Instance* ii,
621 if (IMAGE_INSTANCE_MSWINDOWS_MASK (ii))
625 HDC hcdc = FRAME_MSWINDOWS_CDC (f);
626 HDC hdcDst = CreateCompatibleDC (hcdc);
628 old1 = SelectObject (hcdc, IMAGE_INSTANCE_MSWINDOWS_MASK (ii));
629 newmask = CreateCompatibleBitmap(hcdc, newx, newy);
630 old2 = SelectObject (hdcDst, newmask);
632 if (!StretchBlt(hdcDst, 0, 0, newx, newy,
634 IMAGE_INSTANCE_PIXMAP_WIDTH (ii),
635 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii),
638 DeleteObject (newmask);
643 SelectObject (hdcDst, old2);
644 SelectObject (hcdc, old1);
655 mswindows_resize_dibitmap_instance (Lisp_Image_Instance* ii,
659 HBITMAP newbmp = mswindows_create_resized_bitmap (ii, f, newx, newy);
660 HBITMAP newmask = mswindows_create_resized_mask (ii, f, newx, newy);
665 if (IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii))
666 DeleteObject (IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii));
667 if (IMAGE_INSTANCE_MSWINDOWS_MASK (ii))
668 DeleteObject (IMAGE_INSTANCE_MSWINDOWS_MASK (ii));
670 IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = newbmp;
671 IMAGE_INSTANCE_MSWINDOWS_MASK (ii) = newmask;
672 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = newx;
673 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = newy;
678 /**********************************************************************
680 **********************************************************************/
690 static struct color_symbol*
691 extract_xpm_color_names (Lisp_Object device,
693 Lisp_Object color_symbol_alist,
696 /* This function can GC */
698 Lisp_Object results = Qnil;
700 struct color_symbol *colortbl;
701 struct gcpro gcpro1, gcpro2;
703 GCPRO2 (results, device);
705 /* We built up results to be (("name" . #<color>) ...) so that if an
706 error happens we don't lose any malloc()ed data, or more importantly,
707 leave any pixels allocated in the server. */
709 LIST_LOOP (rest, color_symbol_alist)
711 Lisp_Object cons = XCAR (rest);
712 Lisp_Object name = XCAR (cons);
713 Lisp_Object value = XCDR (cons);
719 (value, device, encode_error_behavior_flag (ERROR_ME_NOT));
722 assert (COLOR_SPECIFIERP (value));
723 value = Fspecifier_instance (value, domain, Qnil, Qnil);
727 results = noseeum_cons (noseeum_cons (name, value), results);
730 UNGCPRO; /* no more evaluation */
733 if (i == 0) return 0;
735 colortbl = xnew_array_and_zero (struct color_symbol, i);
739 Lisp_Object cons = XCAR (results);
741 COLOR_INSTANCE_MSWINDOWS_COLOR (XCOLOR_INSTANCE (XCDR (cons)));
743 TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (cons),
744 C_STRING_ALLOCA, colortbl[j].name,
746 colortbl[j].name = xstrdup (colortbl[j].name); /* mustn't lose this when we return */
747 free_cons (XCONS (cons));
749 results = XCDR (results);
750 free_cons (XCONS (cons));
755 static int xpm_to_eimage (Lisp_Object image, const Extbyte *buffer,
756 unsigned char** data,
757 int* width, int* height,
758 int* x_hot, int* y_hot,
760 struct color_symbol* color_symbols,
765 int result, i, j, transp_idx, maskbpline;
768 COLORREF color; /* the american spelling virus hits again .. */
773 xpminfo.valuemask=XpmHotspot;
776 result = XpmCreateXpmImageFromBuffer ((char*)buffer,
785 signal_simple_error ("Invalid XPM data", image);
789 signal_double_file_error ("Parsing pixmap data",
790 "out of memory", image);
794 signal_double_file_error_2 ("Parsing pixmap data",
795 "unknown error code",
796 make_int (result), image);
800 *width = xpmimage.width;
801 *height = xpmimage.height;
802 maskbpline = BPLINE ((~7UL & (unsigned long)(*width + 7)) / 8);
804 *data = xnew_array_and_zero (unsigned char, *width * *height * 3);
808 XpmFreeXpmImage (&xpmimage);
809 XpmFreeXpmInfo (&xpminfo);
813 /* build a color table to speed things up */
814 colortbl = xnew_array_and_zero (COLORREF, xpmimage.ncolors);
818 XpmFreeXpmImage (&xpmimage);
819 XpmFreeXpmInfo (&xpminfo);
823 for (i=0; i<xpmimage.ncolors; i++)
826 /* pick up symbolic colors in preference */
827 if (xpmimage.colorTable[i].symbolic)
829 if (!strcasecmp (xpmimage.colorTable[i].symbolic,"BgColor")
831 !strcasecmp (xpmimage.colorTable[i].symbolic,"None"))
834 colortbl[i]=transparent_color;
836 goto label_found_color;
838 else if (color_symbols)
840 for (j = 0; j<nsymbols; j++)
842 if (!strcmp (xpmimage.colorTable[i].symbolic,
843 color_symbols[j].name ))
845 colortbl[i]=color_symbols[j].color;
846 goto label_found_color;
850 else if (xpmimage.colorTable[i].c_color == 0)
855 /* pick up transparencies */
856 if (!strcasecmp (xpmimage.colorTable[i].c_color,"None"))
859 colortbl[i]=transparent_color;
861 goto label_found_color;
863 /* finally pick up a normal color spec */
864 if (xpmimage.colorTable[i].c_color)
867 mswindows_string_to_color (xpmimage.colorTable[i].c_color);
868 goto label_found_color;
874 XpmFreeXpmImage (&xpmimage);
875 XpmFreeXpmInfo (&xpminfo);
881 /* convert the image */
884 for (i = 0; i< *width * *height; i++)
886 color = colortbl[*sptr++];
888 /* split out the 0x02bbggrr colorref into an rgb triple */
889 *dptr++=GetRValue (color); /* red */
890 *dptr++=GetGValue (color); /* green */
891 *dptr++=GetBValue (color); /* blue */
894 *x_hot=xpminfo.x_hotspot;
895 *y_hot=xpminfo.y_hotspot;
897 XpmFreeXpmImage (&xpmimage);
898 XpmFreeXpmInfo (&xpminfo);
904 mswindows_xpm_instantiate (Lisp_Object image_instance,
905 Lisp_Object instantiator,
906 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
907 int dest_mask, Lisp_Object domain)
909 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
910 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
911 const Extbyte *bytes;
913 unsigned char *eimage;
914 int width, height, x_hot, y_hot;
915 BITMAPINFO* bmp_info;
916 unsigned char* bmp_data;
918 int nsymbols=0, transp;
919 struct color_symbol* color_symbols=NULL;
921 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
922 Lisp_Object color_symbol_alist = find_keyword_in_vector (instantiator,
925 if (!DEVICE_MSWINDOWS_P (XDEVICE (device)))
926 signal_simple_error ("Not an mswindows device", device);
928 assert (!NILP (data));
930 TO_EXTERNAL_FORMAT (LISP_STRING, data,
931 ALLOCA, (bytes, len),
934 /* in case we have color symbols */
935 color_symbols = extract_xpm_color_names (device, domain,
936 color_symbol_alist, &nsymbols);
938 /* convert to an eimage to make processing easier */
939 if (!xpm_to_eimage (image_instance, bytes, &eimage, &width, &height,
940 &x_hot, &y_hot, &transp, color_symbols, nsymbols))
942 signal_simple_error ("XPM to EImage conversion failed",
950 xfree (color_symbols[nsymbols].name);
952 xfree(color_symbols);
955 /* build a bitmap from the eimage */
956 if (!(bmp_info=convert_EImage_to_DIBitmap (device, width, height, eimage,
957 &bmp_bits, &bmp_data)))
959 signal_simple_error ("XPM to EImage conversion failed",
964 /* Now create the pixmap and set up the image instance */
965 init_image_instance_from_dibitmap (ii, bmp_info, dest_mask,
966 bmp_data, bmp_bits, 1, instantiator,
967 x_hot, y_hot, transp);
972 #endif /* HAVE_XPM */
974 /**********************************************************************
976 **********************************************************************/
979 bmp_validate (Lisp_Object instantiator)
981 file_or_data_must_be_present (instantiator);
985 bmp_normalize (Lisp_Object inst, Lisp_Object console_type)
987 return simple_image_type_normalize (inst, console_type, Qbmp);
991 bmp_possible_dest_types (void)
993 return IMAGE_COLOR_PIXMAP_MASK;
997 bmp_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
998 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
999 int dest_mask, Lisp_Object domain)
1001 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
1002 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
1003 const Extbyte *bytes;
1005 BITMAPFILEHEADER* bmp_file_header;
1006 BITMAPINFO* bmp_info;
1009 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
1011 if (!DEVICE_MSWINDOWS_P (XDEVICE (device)))
1012 signal_simple_error ("Not an mswindows device", device);
1014 assert (!NILP (data));
1016 TO_EXTERNAL_FORMAT (LISP_STRING, data,
1017 ALLOCA, (bytes, len),
1020 /* Then slurp the image into memory, decoding along the way.
1021 The result is the image in a simple one-byte-per-pixel
1024 bmp_file_header=(BITMAPFILEHEADER*)bytes;
1025 bmp_info = (BITMAPINFO*)(bytes + sizeof(BITMAPFILEHEADER));
1026 bmp_data = (Extbyte*)bytes + bmp_file_header->bfOffBits;
1027 bmp_bits = bmp_file_header->bfSize - bmp_file_header->bfOffBits;
1029 /* Now create the pixmap and set up the image instance */
1030 init_image_instance_from_dibitmap (ii, bmp_info, dest_mask,
1031 bmp_data, bmp_bits, 1, instantiator,
1036 /**********************************************************************
1038 **********************************************************************/
1041 mswindows_resource_validate (Lisp_Object instantiator)
1043 if ((NILP (find_keyword_in_vector (instantiator, Q_file))
1045 NILP (find_keyword_in_vector (instantiator, Q_resource_id)))
1047 NILP (find_keyword_in_vector (instantiator, Q_resource_type)))
1048 signal_simple_error ("Must supply :file, :resource-id and :resource-type",
1053 mswindows_resource_normalize (Lisp_Object inst, Lisp_Object console_type)
1055 /* This function can call lisp */
1056 Lisp_Object file = Qnil;
1057 struct gcpro gcpro1, gcpro2;
1058 Lisp_Object alist = Qnil;
1060 GCPRO2 (file, alist);
1062 file = potential_pixmap_file_instantiator (inst, Q_file, Q_data,
1065 if (CONSP (file)) /* failure locating filename */
1066 signal_double_file_error ("Opening pixmap file",
1067 "no such file or directory",
1070 if (NILP (file)) /* no conversion necessary */
1071 RETURN_UNGCPRO (inst);
1073 alist = tagged_vector_to_alist (inst);
1076 alist = remassq_no_quit (Q_file, alist);
1077 alist = Fcons (Fcons (Q_file, file), alist);
1081 Lisp_Object result = alist_to_tagged_vector (Qmswindows_resource, alist);
1083 RETURN_UNGCPRO (result);
1088 mswindows_resource_possible_dest_types (void)
1090 return IMAGE_POINTER_MASK | IMAGE_COLOR_PIXMAP_MASK;
1100 #define OCR_ICOCUR 32647
1101 #define OIC_SAMPLE 32512
1102 #define OIC_HAND 32513
1103 #define OIC_QUES 32514
1104 #define OIC_BANG 32515
1105 #define OIC_NOTE 32516
1106 #define OIC_WINLOGO 32517
1107 #if defined (__CYGWIN32__) && CYGWIN_VERSION_DLL_MAJOR < 21
1108 #define LR_SHARED 0x8000
1112 static const resource_t bitmap_table[] =
1115 { "close", OBM_CLOSE },
1116 { "uparrow", OBM_UPARROW },
1117 { "dnarrow", OBM_DNARROW },
1118 { "rgarrow", OBM_RGARROW },
1119 { "lfarrow", OBM_LFARROW },
1120 { "reduce", OBM_REDUCE },
1121 { "zoom", OBM_ZOOM },
1122 { "restore", OBM_RESTORE },
1123 { "reduced", OBM_REDUCED },
1124 { "zoomd", OBM_ZOOMD },
1125 { "restored", OBM_RESTORED },
1126 { "uparrowd", OBM_UPARROWD },
1127 { "dnarrowd", OBM_DNARROWD },
1128 { "rgarrowd", OBM_RGARROWD },
1129 { "lfarrowd", OBM_LFARROWD },
1130 { "mnarrow", OBM_MNARROW },
1131 { "combo", OBM_COMBO },
1132 { "uparrowi", OBM_UPARROWI },
1133 { "dnarrowi", OBM_DNARROWI },
1134 { "rgarrowi", OBM_RGARROWI },
1135 { "lfarrowi", OBM_LFARROWI },
1136 { "size", OBM_SIZE },
1137 { "btsize", OBM_BTSIZE },
1138 { "check", OBM_CHECK },
1139 { "checkboxes", OBM_CHECKBOXES },
1140 { "btncorners" , OBM_BTNCORNERS },
1144 static const resource_t cursor_table[] =
1147 { "normal", OCR_NORMAL },
1148 { "ibeam", OCR_IBEAM },
1149 { "wait", OCR_WAIT },
1150 { "cross", OCR_CROSS },
1152 /* { "icon", OCR_ICON }, */
1153 { "sizenwse", OCR_SIZENWSE },
1154 { "sizenesw", OCR_SIZENESW },
1155 { "sizewe", OCR_SIZEWE },
1156 { "sizens", OCR_SIZENS },
1157 { "sizeall", OCR_SIZEALL },
1158 /* { "icour", OCR_ICOCUR }, */
1163 static const resource_t icon_table[] =
1166 { "sample", OIC_SAMPLE },
1167 { "hand", OIC_HAND },
1168 { "ques", OIC_QUES },
1169 { "bang", OIC_BANG },
1170 { "note", OIC_NOTE },
1171 { "winlogo", OIC_WINLOGO },
1175 static int resource_name_to_resource (Lisp_Object name, int type)
1177 const resource_t* res = (type == IMAGE_CURSOR ? cursor_table
1178 : type == IMAGE_ICON ? icon_table
1185 else if (!STRINGP (name))
1187 signal_simple_error ("invalid resource identifier", name);
1192 TO_EXTERNAL_FORMAT (LISP_STRING, name,
1193 C_STRING_ALLOCA, nm,
1195 if (!strcasecmp ((char*)res->name, nm))
1196 return res->resource_id;
1197 } while ((++res)->name);
1202 resource_symbol_to_type (Lisp_Object data)
1204 if (EQ (data, Qcursor))
1205 return IMAGE_CURSOR;
1206 else if (EQ (data, Qicon))
1208 else if (EQ (data, Qbitmap))
1209 return IMAGE_BITMAP;
1215 mswindows_resource_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
1216 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
1217 int dest_mask, Lisp_Object domain)
1219 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
1220 unsigned int type = 0;
1221 HANDLE himage = NULL;
1223 HINSTANCE hinst = NULL;
1227 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
1229 Lisp_Object file = find_keyword_in_vector (instantiator, Q_file);
1230 Lisp_Object resource_type = find_keyword_in_vector (instantiator,
1232 Lisp_Object resource_id = find_keyword_in_vector (instantiator,
1237 if (!DEVICE_MSWINDOWS_P (XDEVICE (device)))
1238 signal_simple_error ("Not an mswindows device", device);
1240 type = resource_symbol_to_type (resource_type);
1242 if (dest_mask & IMAGE_POINTER_MASK && type == IMAGE_CURSOR)
1243 iitype = IMAGE_POINTER;
1244 else if (dest_mask & IMAGE_COLOR_PIXMAP_MASK)
1245 iitype = IMAGE_COLOR_PIXMAP;
1247 incompatible_image_types (instantiator, dest_mask,
1248 IMAGE_COLOR_PIXMAP_MASK | IMAGE_POINTER_MASK);
1250 /* mess with the keyword info we were provided with */
1254 TO_EXTERNAL_FORMAT (LISP_STRING, file,
1258 CYGWIN_WIN32_PATH (f, fname);
1263 if (NILP (resource_id))
1264 resid = (LPCTSTR)fname;
1267 hinst = LoadLibraryEx (fname, NULL,
1268 LOAD_LIBRARY_AS_DATAFILE);
1269 resid = MAKEINTRESOURCE (resource_name_to_resource (resource_id,
1273 TO_EXTERNAL_FORMAT (LISP_STRING, resource_id,
1274 C_STRING_ALLOCA, resid,
1278 else if (!(resid = MAKEINTRESOURCE (resource_name_to_resource (resource_id,
1280 signal_simple_error ("Invalid resource identifier", resource_id);
1282 /* load the image */
1283 if (!(himage = LoadImage (hinst, resid, type, 0, 0,
1284 LR_CREATEDIBSECTION | LR_DEFAULTSIZE |
1286 (!NILP (file) ? LR_LOADFROMFILE : 0))))
1288 signal_simple_error ("Cannot load image", instantiator);
1292 FreeLibrary (hinst);
1294 mswindows_initialize_dibitmap_image_instance (ii, 1, iitype);
1296 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = file;
1297 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) =
1298 GetSystemMetrics (type == IMAGE_CURSOR ? SM_CXCURSOR : SM_CXICON);
1299 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) =
1300 GetSystemMetrics (type == IMAGE_CURSOR ? SM_CYCURSOR : SM_CYICON);
1301 IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = 1;
1303 /* hey, we've got an icon type thing so we can reverse engineer the
1305 if (type != IMAGE_BITMAP)
1307 GetIconInfo (himage, &iconinfo);
1308 IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = iconinfo.hbmColor;
1309 IMAGE_INSTANCE_MSWINDOWS_MASK (ii) = iconinfo.hbmMask;
1310 XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii), iconinfo.xHotspot);
1311 XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii), iconinfo.yHotspot);
1312 IMAGE_INSTANCE_MSWINDOWS_ICON (ii) = himage;
1316 IMAGE_INSTANCE_MSWINDOWS_ICON (ii) = NULL;
1317 IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = himage;
1318 IMAGE_INSTANCE_MSWINDOWS_MASK (ii) = NULL;
1319 XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii), 0);
1320 XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii), 0);
1325 check_valid_resource_symbol (Lisp_Object data)
1327 CHECK_SYMBOL (data);
1328 if (!resource_symbol_to_type (data))
1329 signal_simple_error ("invalid resource type", data);
1333 check_valid_resource_id (Lisp_Object data)
1335 if (!resource_name_to_resource (data, IMAGE_CURSOR)
1337 !resource_name_to_resource (data, IMAGE_ICON)
1339 !resource_name_to_resource (data, IMAGE_BITMAP))
1340 signal_simple_error ("invalid resource identifier", data);
1343 /**********************************************************************
1345 **********************************************************************/
1346 #ifndef HAVE_X_WINDOWS
1347 /* $XConsortium: RdBitF.c,v 1.10 94/04/17 20:16:13 kaleb Exp $ */
1351 Copyright (c) 1988 X Consortium
1353 Permission is hereby granted, free of charge, to any person obtaining a copy
1354 of this software and associated documentation files (the "Software"), to deal
1355 in the Software without restriction, including without limitation the rights
1356 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1357 copies of the Software, and to permit persons to whom the Software is
1358 furnished to do so, subject to the following conditions:
1360 The above copyright notice and this permission notice shall be included in
1361 all copies or substantial portions of the Software.
1363 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1364 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1365 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1366 X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
1367 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
1368 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1370 Except as contained in this notice, the name of the X Consortium shall not be
1371 used in advertising or otherwise to promote the sale, use or other dealings
1372 in this Software without prior written authorization from the X Consortium.
1377 * This file contains miscellaneous utility routines and is not part of the
1380 * Public entry points:
1382 * XmuReadBitmapData read data from FILE descriptor
1383 * XmuReadBitmapDataFromFile read X10 or X11 format bitmap files
1386 * Note that this file and ../X/XRdBitF.c look very similar.... Keep them
1387 * that way (but don't use common source code so that people can have one
1388 * without the other).
1393 * Based on an optimized version provided by Jim Becker, August 5, 1988.
1395 #ifndef BitmapSuccess
1396 #define BitmapSuccess 0
1397 #define BitmapOpenFailed 1
1398 #define BitmapFileInvalid 2
1399 #define BitmapNoMemory 3
1401 #define MAX_SIZE 255
1403 /* shared data for the image read/parse logic */
1404 static short hexTable[256]; /* conversion value */
1405 static int initialized = FALSE; /* easier to fill in at run time */
1408 * Table index for the hex values. Initialized once, first time.
1409 * Used for translation value or delimiter significance lookup.
1411 static void initHexTable()
1414 * We build the table at run time for several reasons:
1416 * 1. portable to non-ASCII machines.
1417 * 2. still reentrant since we set the init flag after setting table.
1418 * 3. easier to extend.
1419 * 4. less prone to bugs.
1421 hexTable['0'] = 0; hexTable['1'] = 1;
1422 hexTable['2'] = 2; hexTable['3'] = 3;
1423 hexTable['4'] = 4; hexTable['5'] = 5;
1424 hexTable['6'] = 6; hexTable['7'] = 7;
1425 hexTable['8'] = 8; hexTable['9'] = 9;
1426 hexTable['A'] = 10; hexTable['B'] = 11;
1427 hexTable['C'] = 12; hexTable['D'] = 13;
1428 hexTable['E'] = 14; hexTable['F'] = 15;
1429 hexTable['a'] = 10; hexTable['b'] = 11;
1430 hexTable['c'] = 12; hexTable['d'] = 13;
1431 hexTable['e'] = 14; hexTable['f'] = 15;
1433 /* delimiters of significance are flagged w/ negative value */
1434 hexTable[' '] = -1; hexTable[','] = -1;
1435 hexTable['}'] = -1; hexTable['\n'] = -1;
1436 hexTable['\t'] = -1;
1442 * read next hex value in the input stream, return -1 if EOF
1444 static int NextInt ( FILE *fstream )
1451 /* loop, accumulate hex value until find delimiter */
1452 /* skip any initial delimiters found in read stream */
1460 /* trim high bits, check type and accumulate */
1462 if (isascii(ch) && isxdigit(ch)) {
1463 value = (value << 4) + hexTable[ch];
1465 } else if ((hexTable[ch]) < 0 && gotone)
1474 * The data returned by the following routine is always in left-most byte
1475 * first and left-most bit first. If it doesn't return BitmapSuccess then
1476 * its arguments won't have been touched. This routine should look as much
1477 * like the Xlib routine XReadBitmapfile as possible.
1479 int read_bitmap_data (fstream, width, height, datap, x_hot, y_hot)
1480 FILE *fstream; /* handle on file */
1481 unsigned int *width, *height; /* RETURNED */
1482 unsigned char **datap; /* RETURNED */
1483 int *x_hot, *y_hot; /* RETURNED */
1485 unsigned char *data = NULL; /* working variable */
1486 char line[MAX_SIZE]; /* input line from file */
1487 int size; /* number of bytes of data */
1488 char name_and_type[MAX_SIZE]; /* an input line */
1489 char *type; /* for parsing */
1490 int value; /* from an input line */
1491 int version10p; /* boolean, old format */
1492 int padding; /* to handle alignment */
1493 int bytes_per_line; /* per scanline of data */
1494 unsigned int ww = 0; /* width */
1495 unsigned int hh = 0; /* height */
1496 int hx = -1; /* x hotspot */
1497 int hy = -1; /* y hotspot */
1499 #define Xmalloc(size) malloc(size)
1501 /* first time initialization */
1502 if (initialized == FALSE) initHexTable();
1504 /* error cleanup and return macro */
1505 #define RETURN(code) { if (data) free (data); return code; }
1507 while (fgets(line, MAX_SIZE, fstream)) {
1508 if (strlen(line) == MAX_SIZE-1) {
1509 RETURN (BitmapFileInvalid);
1511 if (sscanf(line,"#define %s %d",name_and_type,&value) == 2) {
1512 if (!(type = strrchr(name_and_type, '_')))
1513 type = name_and_type;
1517 if (!strcmp("width", type))
1518 ww = (unsigned int) value;
1519 if (!strcmp("height", type))
1520 hh = (unsigned int) value;
1521 if (!strcmp("hot", type)) {
1522 if (type-- == name_and_type || type-- == name_and_type)
1524 if (!strcmp("x_hot", type))
1526 if (!strcmp("y_hot", type))
1532 if (sscanf(line, "static short %s = {", name_and_type) == 1)
1534 else if (sscanf(line,"static unsigned char %s = {",name_and_type) == 1)
1536 else if (sscanf(line, "static char %s = {", name_and_type) == 1)
1541 if (!(type = strrchr(name_and_type, '_')))
1542 type = name_and_type;
1546 if (strcmp("bits[]", type))
1550 RETURN (BitmapFileInvalid);
1552 if ((ww % 16) && ((ww % 16) < 9) && version10p)
1557 bytes_per_line = (ww+7)/8 + padding;
1559 size = bytes_per_line * hh;
1560 data = (unsigned char *) Xmalloc ((unsigned int) size);
1562 RETURN (BitmapNoMemory);
1568 for (bytes=0, ptr=data; bytes<size; (bytes += 2)) {
1569 if ((value = NextInt(fstream)) < 0)
1570 RETURN (BitmapFileInvalid);
1572 if (!padding || ((bytes+2) % bytes_per_line))
1573 *(ptr++) = value >> 8;
1579 for (bytes=0, ptr=data; bytes<size; bytes++, ptr++) {
1580 if ((value = NextInt(fstream)) < 0)
1581 RETURN (BitmapFileInvalid);
1589 RETURN (BitmapFileInvalid);
1596 if (x_hot) *x_hot = hx;
1597 if (y_hot) *y_hot = hy;
1599 RETURN (BitmapSuccess);
1603 int read_bitmap_data_from_file (const char *filename, unsigned int *width,
1604 unsigned int *height, unsigned char **datap,
1605 int *x_hot, int *y_hot)
1610 if ((fstream = fopen (filename, "r")) == NULL) {
1611 return BitmapOpenFailed;
1613 status = read_bitmap_data (fstream, width, height, datap, x_hot, y_hot);
1617 #endif /* HAVE_X_WINDOWS */
1619 /* this table flips four bits around. */
1620 static int flip_table[] =
1622 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15
1625 /* the bitmap data comes in the following format: Widths are padded to
1626 a multiple of 8. Scan lines are stored in increasing byte order
1627 from left to right, little-endian within a byte. 0 = white, 1 =
1628 black. It must be converted to the following format: Widths are
1629 padded to a multiple of 16. Scan lines are stored in increasing
1630 byte order from left to right, big-endian within a byte. 0 =
1631 black, 1 = white. */
1633 xbm_create_bitmap_from_data (HDC hdc, char *data,
1634 unsigned int width, unsigned int height,
1635 int mask, COLORREF fg, COLORREF bg)
1637 int old_width = (width + 7)/8;
1638 int new_width = BPLINE (2*((width + 15)/16));
1639 unsigned char *offset;
1641 unsigned char *new_data, *new_offset;
1643 BITMAPINFO* bmp_info =
1644 xmalloc_and_zero (sizeof(BITMAPINFO) + sizeof(RGBQUAD));
1650 new_data = (unsigned char *) xmalloc_and_zero (height * new_width);
1658 for (i=0; i<height; i++)
1660 offset = data + i*old_width;
1661 new_offset = new_data + i*new_width;
1663 for (j=0; j<old_width; j++)
1665 int byte = offset[j];
1666 new_offset[j] = ~ (unsigned char)
1667 ((flip_table[byte & 0xf] << 4) + flip_table[byte >> 4]);
1671 /* if we want a mask invert the bits */
1674 new_offset = &new_data[height * new_width];
1675 while (new_offset-- != new_data)
1677 *new_offset ^= 0xff;
1681 bmp_info->bmiHeader.biWidth=width;
1682 bmp_info->bmiHeader.biHeight=-(LONG)height;
1683 bmp_info->bmiHeader.biPlanes=1;
1684 bmp_info->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
1685 bmp_info->bmiHeader.biBitCount=1;
1686 bmp_info->bmiHeader.biCompression=BI_RGB;
1687 bmp_info->bmiHeader.biClrUsed = 2;
1688 bmp_info->bmiHeader.biClrImportant = 2;
1689 bmp_info->bmiHeader.biSizeImage = height * new_width;
1690 bmp_info->bmiColors[0].rgbRed = GetRValue (fg);
1691 bmp_info->bmiColors[0].rgbGreen = GetGValue (fg);
1692 bmp_info->bmiColors[0].rgbBlue = GetBValue (fg);
1693 bmp_info->bmiColors[0].rgbReserved = 0;
1694 bmp_info->bmiColors[1].rgbRed = GetRValue (bg);
1695 bmp_info->bmiColors[1].rgbGreen = GetGValue (bg);
1696 bmp_info->bmiColors[1].rgbBlue = GetBValue (bg);
1697 bmp_info->bmiColors[1].rgbReserved = 0;
1699 bitmap = CreateDIBSection (hdc,
1707 if (!bitmap || !bmp_buf)
1713 /* copy in the actual bitmap */
1714 memcpy (bmp_buf, new_data, height * new_width);
1720 /* Given inline data for a mono pixmap, initialize the given
1721 image instance accordingly. */
1724 init_image_instance_from_xbm_inline (Lisp_Image_Instance *ii,
1725 int width, int height,
1726 /* Note that data is in ext-format! */
1728 Lisp_Object instantiator,
1729 Lisp_Object pointer_fg,
1730 Lisp_Object pointer_bg,
1733 Lisp_Object mask_filename)
1735 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
1736 struct frame* f = XFRAME (DEVICE_SELECTED_FRAME (XDEVICE (device)));
1737 Lisp_Object foreground = find_keyword_in_vector (instantiator, Q_foreground);
1738 Lisp_Object background = find_keyword_in_vector (instantiator, Q_background);
1739 enum image_instance_type type;
1740 COLORREF black = PALETTERGB (0,0,0);
1741 COLORREF white = PALETTERGB (255,255,255);
1743 HDC hdc = FRAME_MSWINDOWS_CDC (f);
1745 if (!DEVICE_MSWINDOWS_P (XDEVICE (device)))
1746 signal_simple_error ("Not an MS-Windows device", device);
1748 if ((dest_mask & IMAGE_MONO_PIXMAP_MASK) &&
1749 (dest_mask & IMAGE_COLOR_PIXMAP_MASK))
1751 if (!NILP (foreground) || !NILP (background))
1752 type = IMAGE_COLOR_PIXMAP;
1754 type = IMAGE_MONO_PIXMAP;
1756 else if (dest_mask & IMAGE_MONO_PIXMAP_MASK)
1757 type = IMAGE_MONO_PIXMAP;
1758 else if (dest_mask & IMAGE_COLOR_PIXMAP_MASK)
1759 type = IMAGE_COLOR_PIXMAP;
1760 else if (dest_mask & IMAGE_POINTER_MASK)
1761 type = IMAGE_POINTER;
1763 incompatible_image_types (instantiator, dest_mask,
1764 IMAGE_MONO_PIXMAP_MASK | IMAGE_COLOR_PIXMAP_MASK
1765 | IMAGE_POINTER_MASK);
1767 mswindows_initialize_dibitmap_image_instance (ii, 1, type);
1769 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) =
1770 find_keyword_in_vector (instantiator, Q_file);
1771 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = width;
1772 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = height;
1773 IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = 1;
1774 XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii), 0);
1775 XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii), 0);
1776 IMAGE_INSTANCE_MSWINDOWS_MASK (ii) = mask ? mask :
1777 xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height,
1778 TRUE, black, white);
1782 case IMAGE_MONO_PIXMAP:
1783 IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) =
1784 xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height,
1785 FALSE, black, black);
1788 case IMAGE_COLOR_PIXMAP:
1790 COLORREF fg = black;
1791 COLORREF bg = white;
1793 if (!NILP (foreground) && !COLOR_INSTANCEP (foreground))
1795 Fmake_color_instance (foreground, device,
1796 encode_error_behavior_flag (ERROR_ME));
1798 if (COLOR_INSTANCEP (foreground))
1799 fg = COLOR_INSTANCE_MSWINDOWS_COLOR (XCOLOR_INSTANCE (foreground));
1801 if (!NILP (background) && !COLOR_INSTANCEP (background))
1803 Fmake_color_instance (background, device,
1804 encode_error_behavior_flag (ERROR_ME));
1806 if (COLOR_INSTANCEP (background))
1807 bg = COLOR_INSTANCE_MSWINDOWS_COLOR (XCOLOR_INSTANCE (background));
1809 IMAGE_INSTANCE_PIXMAP_FG (ii) = foreground;
1810 IMAGE_INSTANCE_PIXMAP_BG (ii) = background;
1812 IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) =
1813 xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height,
1820 COLORREF fg = black;
1821 COLORREF bg = white;
1823 if (NILP (foreground))
1824 foreground = pointer_fg;
1825 if (NILP (background))
1826 background = pointer_bg;
1828 IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii) =
1829 find_keyword_in_vector (instantiator, Q_hotspot_x);
1830 IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii) =
1831 find_keyword_in_vector (instantiator, Q_hotspot_y);
1832 IMAGE_INSTANCE_PIXMAP_FG (ii) = foreground;
1833 IMAGE_INSTANCE_PIXMAP_BG (ii) = background;
1834 if (COLOR_INSTANCEP (foreground))
1835 fg = COLOR_INSTANCE_MSWINDOWS_COLOR (XCOLOR_INSTANCE (foreground));
1836 if (COLOR_INSTANCEP (background))
1837 bg = COLOR_INSTANCE_MSWINDOWS_COLOR (XCOLOR_INSTANCE (background));
1839 IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) =
1840 xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height,
1842 mswindows_initialize_image_instance_icon (ii, TRUE);
1852 xbm_instantiate_1 (Lisp_Object image_instance, Lisp_Object instantiator,
1853 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
1854 int dest_mask, int width, int height,
1855 /* Note that data is in ext-format! */
1858 Lisp_Object mask_data = find_keyword_in_vector (instantiator, Q_mask_data);
1859 Lisp_Object mask_file = find_keyword_in_vector (instantiator, Q_mask_file);
1860 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
1861 struct frame* f = XFRAME (DEVICE_SELECTED_FRAME
1862 (XDEVICE (IMAGE_INSTANCE_DEVICE (ii))));
1863 HDC hdc = FRAME_MSWINDOWS_CDC (f);
1866 if (!NILP (mask_data))
1868 const char *ext_data;
1870 TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (XCDR (XCDR (mask_data))),
1871 C_STRING_ALLOCA, ext_data,
1873 mask = xbm_create_bitmap_from_data (hdc,
1874 (unsigned char *) ext_data,
1875 XINT (XCAR (mask_data)),
1876 XINT (XCAR (XCDR (mask_data))),
1879 PALETTERGB (255,255,255));
1882 init_image_instance_from_xbm_inline (ii, width, height, bits,
1883 instantiator, pointer_fg, pointer_bg,
1884 dest_mask, mask, mask_file);
1887 /* Instantiate method for XBM's. */
1890 mswindows_xbm_instantiate (Lisp_Object image_instance,
1891 Lisp_Object instantiator,
1892 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
1893 int dest_mask, Lisp_Object domain)
1895 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
1896 const char *ext_data;
1898 assert (!NILP (data));
1900 TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (XCDR (XCDR (data))),
1901 C_STRING_ALLOCA, ext_data,
1904 xbm_instantiate_1 (image_instance, instantiator, pointer_fg,
1905 pointer_bg, dest_mask, XINT (XCAR (data)),
1906 XINT (XCAR (XCDR (data))), ext_data);
1910 /**********************************************************************
1912 **********************************************************************/
1914 /* This is about to get redefined! */
1917 /* We have to define SYSV32 so that compface.h includes string.h
1918 instead of strings.h. */
1923 #include <compface.h>
1927 /* JMP_BUF cannot be used here because if it doesn't get defined
1928 to jmp_buf we end up with a conflicting type error with the
1929 definition in compface.h */
1930 extern jmp_buf comp_env;
1934 mswindows_xface_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
1935 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
1936 int dest_mask, Lisp_Object domain)
1938 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
1940 char *p, *bits, *bp;
1941 const char * volatile emsg = 0;
1942 const char * volatile dstring;
1944 assert (!NILP (data));
1946 TO_EXTERNAL_FORMAT (LISP_STRING, data,
1947 C_STRING_ALLOCA, dstring,
1950 if ((p = strchr (dstring, ':')))
1955 /* Must use setjmp not SETJMP because we used jmp_buf above not JMP_BUF */
1956 if (!(stattis = setjmp (comp_env)))
1958 UnCompAll ((char *) dstring);
1965 emsg = "uncompface: internal error";
1968 emsg = "uncompface: insufficient or invalid data";
1971 emsg = "uncompface: excess data ignored";
1976 signal_simple_error_2 (emsg, data, Qimage);
1978 bp = bits = (char *) alloca (PIXELS / 8);
1980 /* the compface library exports char F[], which uses a single byte per
1981 pixel to represent a 48x48 bitmap. Yuck. */
1982 for (i = 0, p = F; i < (PIXELS / 8); ++i)
1985 /* reverse the bit order of each byte... */
1986 for (b = n = 0; b < 8; ++b)
1993 xbm_instantiate_1 (image_instance, instantiator, pointer_fg,
1994 pointer_bg, dest_mask, 48, 48, bits);
1996 #endif /* HAVE_XFACE */
1999 /************************************************************************/
2000 /* image instance methods */
2001 /************************************************************************/
2004 mswindows_print_image_instance (Lisp_Image_Instance *p,
2005 Lisp_Object printcharfun,
2010 switch (IMAGE_INSTANCE_TYPE (p))
2012 case IMAGE_MONO_PIXMAP:
2013 case IMAGE_COLOR_PIXMAP:
2015 sprintf (buf, " (0x%lx",
2016 (unsigned long) IMAGE_INSTANCE_MSWINDOWS_BITMAP (p));
2017 write_c_string (buf, printcharfun);
2018 if (IMAGE_INSTANCE_MSWINDOWS_MASK (p))
2020 sprintf (buf, "/0x%lx",
2021 (unsigned long) IMAGE_INSTANCE_MSWINDOWS_MASK (p));
2022 write_c_string (buf, printcharfun);
2024 write_c_string (")", printcharfun);
2032 #ifdef DEBUG_WIDGETS
2033 extern int debug_widget_instances;
2037 mswindows_finalize_image_instance (Lisp_Image_Instance *p)
2039 if (DEVICE_LIVE_P (XDEVICE (p->device)))
2041 if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET
2043 IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW)
2045 #ifdef DEBUG_WIDGETS
2046 debug_widget_instances--;
2047 stderr_out ("widget destroyed, %d left\n", debug_widget_instances);
2049 if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
2051 DestroyWindow (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p));
2052 DestroyWindow (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p));
2053 IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0;
2059 if (IMAGE_INSTANCE_PIXMAP_TIMEOUT (p))
2060 disable_glyph_animated_timeout (IMAGE_INSTANCE_PIXMAP_TIMEOUT (p));
2062 if (IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICES (p))
2064 for (i = 0; i < IMAGE_INSTANCE_PIXMAP_MAXSLICE (p); i++)
2066 if (IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICE (p, i))
2067 DeleteObject (IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICE (p, i));
2068 IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICE (p, i) = 0;
2070 xfree (IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICES (p));
2071 IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICES (p) = 0;
2073 if (IMAGE_INSTANCE_MSWINDOWS_MASK (p))
2074 DeleteObject (IMAGE_INSTANCE_MSWINDOWS_MASK (p));
2075 IMAGE_INSTANCE_MSWINDOWS_MASK (p) = 0;
2076 if (IMAGE_INSTANCE_MSWINDOWS_ICON (p))
2077 DestroyIcon (IMAGE_INSTANCE_MSWINDOWS_ICON (p));
2078 IMAGE_INSTANCE_MSWINDOWS_ICON (p) = 0;
2089 /************************************************************************/
2090 /* subwindow and widget support */
2091 /************************************************************************/
2094 mswindows_widget_hfont (Lisp_Image_Instance *p,
2097 Lisp_Object face = IMAGE_INSTANCE_WIDGET_FACE (p);
2098 int under = FACE_UNDERLINE_P (face, domain);
2099 int strike = FACE_STRIKETHRU_P (face, domain);
2100 Lisp_Object font = query_string_font (IMAGE_INSTANCE_WIDGET_TEXT (p),
2103 return mswindows_get_hfont (XFONT_INSTANCE (font), under, strike);
2106 /* unmap the image if it is a widget. This is used by redisplay via
2107 redisplay_unmap_subwindows */
2109 mswindows_unmap_subwindow (Lisp_Image_Instance *p)
2111 if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
2113 SetWindowPos (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p),
2116 SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE
2117 | SWP_NOSENDCHANGING);
2118 if (GetFocus() == WIDGET_INSTANCE_MSWINDOWS_HANDLE (p))
2119 SetFocus (GetParent (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p)));
2123 /* map the subwindow. This is used by redisplay via
2124 redisplay_output_subwindow */
2126 mswindows_map_subwindow (Lisp_Image_Instance *p, int x, int y,
2127 struct display_glyph_area* dga)
2129 /* move the window before mapping it ... */
2130 SetWindowPos (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p),
2132 x, y, dga->width, dga->height,
2134 | SWP_NOCOPYBITS | SWP_NOSENDCHANGING);
2135 /* ... adjust the child ... */
2136 SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p),
2138 -dga->xoffset, -dga->yoffset, 0, 0,
2139 SWP_NOZORDER | SWP_NOSIZE
2140 | SWP_NOCOPYBITS | SWP_NOSENDCHANGING);
2141 /* ... now map it - we are not allowed to move it at the same time. */
2142 SetWindowPos (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p),
2145 SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE
2146 | SWP_SHOWWINDOW | SWP_NOCOPYBITS
2147 | SWP_NOSENDCHANGING);
2150 /* resize the subwindow instance */
2152 mswindows_resize_subwindow (Lisp_Image_Instance* ii, int w, int h)
2154 /* Set the size of the control .... */
2155 SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii),
2158 SWP_NOZORDER | SWP_NOMOVE
2159 | SWP_NOCOPYBITS | SWP_NOSENDCHANGING);
2162 /* Simply resize the window here. */
2164 mswindows_update_subwindow (Lisp_Image_Instance *p)
2166 mswindows_resize_subwindow (p,
2167 IMAGE_INSTANCE_WIDTH (p),
2168 IMAGE_INSTANCE_HEIGHT (p));
2171 /* when you click on a widget you may activate another widget this
2172 needs to be checked and all appropriate widgets updated */
2174 mswindows_update_widget (Lisp_Image_Instance *p)
2176 /* Possibly update the face font and colors. */
2177 if (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (p))
2179 /* set the widget font from the widget face */
2180 SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p),
2182 (WPARAM) mswindows_widget_hfont
2183 (p, IMAGE_INSTANCE_SUBWINDOW_FRAME (p)),
2184 MAKELPARAM (TRUE, 0));
2186 /* Possibly update the dimensions. */
2187 if (IMAGE_INSTANCE_SIZE_CHANGED (p))
2189 mswindows_resize_subwindow (p,
2190 IMAGE_INSTANCE_WIDTH (p),
2191 IMAGE_INSTANCE_HEIGHT (p));
2193 /* Possibly update the text in the widget. */
2194 if (IMAGE_INSTANCE_TEXT_CHANGED (p))
2197 TO_EXTERNAL_FORMAT (LISP_STRING, IMAGE_INSTANCE_WIDGET_TEXT (p),
2198 C_STRING_ALLOCA, lparam,
2200 SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p),
2201 WM_SETTEXT, 0, (LPARAM)lparam);
2205 /* register widgets into our hastable so that we can cope with the
2206 callbacks. The hashtable is weak so deregistration is handled
2209 mswindows_register_gui_item (Lisp_Object gui, Lisp_Object domain)
2211 Lisp_Object frame = FW_FRAME (domain);
2212 struct frame* f = XFRAME (frame);
2213 int id = gui_item_id_hash (FRAME_MSWINDOWS_WIDGET_HASH_TABLE (f),
2216 Fputhash (make_int (id),
2217 XGUI_ITEM (gui)->callback,
2218 FRAME_MSWINDOWS_WIDGET_HASH_TABLE (f));
2223 mswindows_register_widget_instance (Lisp_Object instance, Lisp_Object domain)
2225 return mswindows_register_gui_item (XIMAGE_INSTANCE_WIDGET_ITEM (instance),
2230 mswindows_subwindow_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2231 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2232 int dest_mask, Lisp_Object domain)
2234 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2235 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
2236 struct device* d = XDEVICE (device);
2237 Lisp_Object frame = FW_FRAME (domain);
2240 if (!DEVICE_MSWINDOWS_P (d))
2241 signal_simple_error ("Not an mswindows device", device);
2243 /* have to set the type this late in case there is no device
2244 instantiation for a widget */
2245 IMAGE_INSTANCE_TYPE (ii) = IMAGE_SUBWINDOW;
2246 /* Allocate space for the clip window */
2247 ii->data = xnew_and_zero (struct mswindows_subwindow_data);
2249 if ((IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii)
2252 XEMACS_CONTROL_CLASS,
2254 WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_CHILD,
2255 0, /* starting x position */
2256 0, /* starting y position */
2257 IMAGE_INSTANCE_WIDGET_WIDTH (ii),
2258 IMAGE_INSTANCE_WIDGET_HEIGHT (ii),
2260 FRAME_MSWINDOWS_HANDLE (XFRAME (frame)),
2262 NULL, /* must be null for this class */
2264 signal_simple_error ("window creation failed with code",
2265 make_int (GetLastError()));
2267 wnd = CreateWindow( "STATIC",
2270 0, /* starting x position */
2271 0, /* starting y position */
2272 IMAGE_INSTANCE_WIDGET_WIDTH (ii),
2273 IMAGE_INSTANCE_WIDGET_HEIGHT (ii),
2274 IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii),
2277 GetWindowLong (FRAME_MSWINDOWS_HANDLE (XFRAME (frame)),
2281 SetWindowLong (wnd, GWL_USERDATA, (LONG)LISP_TO_VOID(image_instance));
2282 IMAGE_INSTANCE_SUBWINDOW_ID (ii) = wnd;
2286 mswindows_image_instance_equal (Lisp_Image_Instance *p1,
2287 Lisp_Image_Instance *p2, int depth)
2289 switch (IMAGE_INSTANCE_TYPE (p1))
2291 case IMAGE_MONO_PIXMAP:
2292 case IMAGE_COLOR_PIXMAP:
2294 if (IMAGE_INSTANCE_MSWINDOWS_BITMAP (p1)
2295 != IMAGE_INSTANCE_MSWINDOWS_BITMAP (p2))
2306 static unsigned long
2307 mswindows_image_instance_hash (Lisp_Image_Instance *p, int depth)
2309 switch (IMAGE_INSTANCE_TYPE (p))
2311 case IMAGE_MONO_PIXMAP:
2312 case IMAGE_COLOR_PIXMAP:
2314 return (unsigned long) IMAGE_INSTANCE_MSWINDOWS_BITMAP (p);
2321 /* Set all the slots in an image instance structure to reasonable
2322 default values. This is used somewhere within an instantiate
2323 method. It is assumed that the device slot within the image
2324 instance is already set -- this is the case when instantiate
2325 methods are called. */
2328 mswindows_initialize_dibitmap_image_instance (Lisp_Image_Instance *ii,
2330 enum image_instance_type type)
2332 ii->data = xnew_and_zero (struct mswindows_image_instance_data);
2333 IMAGE_INSTANCE_TYPE (ii) = type;
2334 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = Qnil;
2335 IMAGE_INSTANCE_PIXMAP_MASK_FILENAME (ii) = Qnil;
2336 IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii) = Qnil;
2337 IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii) = Qnil;
2338 IMAGE_INSTANCE_PIXMAP_FG (ii) = Qnil;
2339 IMAGE_INSTANCE_PIXMAP_BG (ii) = Qnil;
2340 IMAGE_INSTANCE_PIXMAP_MAXSLICE (ii) = slices;
2341 IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICES (ii) =
2342 xnew_array_and_zero (HBITMAP, slices);
2348 /************************************************************************/
2350 /************************************************************************/
2352 mswindows_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2353 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2354 int dest_mask, Lisp_Object domain,
2355 const char* class, int flags, int exflags)
2357 /* this function can call lisp */
2358 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2359 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii), style;
2360 struct device* d = XDEVICE (device);
2361 Lisp_Object frame = FW_FRAME (domain);
2365 Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii);
2366 Lisp_Gui_Item* pgui = XGUI_ITEM (gui);
2368 if (!DEVICE_MSWINDOWS_P (d))
2369 signal_simple_error ("Not an mswindows device", device);
2371 if (!gui_item_active_p (gui))
2372 flags |= WS_DISABLED;
2374 style = pgui->style;
2376 if (!NILP (pgui->callback))
2378 id = mswindows_register_widget_instance (image_instance, domain);
2381 if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii)))
2382 TO_EXTERNAL_FORMAT (LISP_STRING, IMAGE_INSTANCE_WIDGET_TEXT (ii),
2383 C_STRING_ALLOCA, nm,
2386 /* allocate space for the clip window and then allocate the clip window */
2387 ii->data = xnew_and_zero (struct mswindows_subwindow_data);
2389 if ((IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii)
2391 WS_EX_CONTROLPARENT, /* EX flags */
2392 XEMACS_CONTROL_CLASS,
2394 WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_CHILD,
2395 0, /* starting x position */
2396 0, /* starting y position */
2397 IMAGE_INSTANCE_WIDGET_WIDTH (ii),
2398 IMAGE_INSTANCE_WIDGET_HEIGHT (ii),
2400 FRAME_MSWINDOWS_HANDLE (XFRAME (frame)),
2401 (HMENU)id, /* No menu */
2402 NULL, /* must be null for this class */
2404 signal_simple_error ("window creation failed with code",
2405 make_int (GetLastError()));
2407 if ((wnd = CreateWindowEx(
2408 exflags /* | WS_EX_NOPARENTNOTIFY*/,
2411 flags | WS_CHILD | WS_VISIBLE,
2412 0, /* starting x position */
2413 0, /* starting y position */
2414 IMAGE_INSTANCE_WIDGET_WIDTH (ii),
2415 IMAGE_INSTANCE_WIDGET_HEIGHT (ii),
2417 IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii),
2418 (HMENU)id, /* No menu */
2421 (FRAME_MSWINDOWS_HANDLE (XFRAME (frame)),
2424 signal_simple_error ("window creation failed with code",
2425 make_int (GetLastError()));
2427 IMAGE_INSTANCE_SUBWINDOW_ID (ii) = wnd;
2428 SetWindowLong (wnd, GWL_USERDATA, (LONG)LISP_TO_VOID(image_instance));
2429 /* set the widget font from the widget face */
2430 SendMessage (wnd, WM_SETFONT,
2431 (WPARAM) mswindows_widget_hfont (ii, domain),
2432 MAKELPARAM (TRUE, 0));
2435 /* Instantiate a button widget. Unfortunately instantiated widgets are
2436 particular to a frame since they need to have a parent. It's not
2437 like images where you just select the image into the context you
2438 want to display it in and BitBlt it. So image instances can have a
2439 many-to-one relationship with things you see, whereas widgets can
2440 only be one-to-one (i.e. per frame) */
2442 mswindows_button_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2443 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2444 int dest_mask, Lisp_Object domain)
2446 /* this function can call lisp */
2447 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2449 int flags = WS_TABSTOP;/* BS_NOTIFY #### is needed to get exotic feedback
2450 only. Since we seem to want nothing beyond BN_CLICK,
2451 the style is perhaps not necessary -- kkm */
2453 Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii);
2454 Lisp_Gui_Item* pgui = XGUI_ITEM (gui);
2455 Lisp_Object glyph = find_keyword_in_vector (instantiator, Q_image);
2459 if (!IMAGE_INSTANCEP (glyph))
2460 glyph = glyph_image_instance (glyph, domain, ERROR_ME, 1);
2462 if (IMAGE_INSTANCEP (glyph))
2463 flags |= XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ?
2464 BS_BITMAP : BS_ICON;
2467 style = pgui->style;
2469 /* #### consider using the default face for radio and toggle
2471 if (EQ (style, Qradio))
2473 flags |= BS_RADIOBUTTON;
2475 else if (EQ (style, Qtoggle))
2477 flags |= BS_AUTOCHECKBOX;
2481 flags |= BS_DEFPUSHBUTTON;
2484 mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
2485 pointer_bg, dest_mask, domain, "BUTTON",
2488 wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
2489 /* set the checked state */
2490 if (gui_item_selected_p (gui))
2491 SendMessage (wnd, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
2493 SendMessage (wnd, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
2494 /* add the image if one was given */
2495 if (!NILP (glyph) && IMAGE_INSTANCEP (glyph)
2497 IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (glyph)))
2499 SendMessage (wnd, BM_SETIMAGE,
2500 (WPARAM) (XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ?
2501 IMAGE_BITMAP : IMAGE_ICON),
2502 (XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ?
2503 (LPARAM) XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) :
2504 (LPARAM) XIMAGE_INSTANCE_MSWINDOWS_ICON (glyph)));
2508 /* Update the state of a button. */
2510 mswindows_button_update (Lisp_Object image_instance)
2512 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2513 /* buttons checked or otherwise */
2514 if (gui_item_selected_p (IMAGE_INSTANCE_WIDGET_ITEM (ii)))
2515 SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii),
2516 BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
2518 SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii),
2519 BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
2522 /* instantiate an edit control */
2524 mswindows_edit_field_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2525 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2526 int dest_mask, Lisp_Object domain)
2528 mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
2529 pointer_bg, dest_mask, domain, "EDIT",
2530 ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP
2531 | WS_BORDER, WS_EX_CLIENTEDGE);
2534 /* instantiate a progress gauge */
2536 mswindows_progress_gauge_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2537 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2538 int dest_mask, Lisp_Object domain)
2541 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2542 mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
2543 pointer_bg, dest_mask, domain, PROGRESS_CLASS,
2544 WS_BORDER | PBS_SMOOTH, WS_EX_CLIENTEDGE);
2545 wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
2546 /* set the colors */
2547 #ifdef PBS_SETBKCOLOR
2548 SendMessage (wnd, PBS_SETBKCOLOR, 0,
2549 (LPARAM) (COLOR_INSTANCE_MSWINDOWS_COLOR
2552 (XIMAGE_INSTANCE_WIDGET_FACE (ii),
2553 XIMAGE_INSTANCE_SUBWINDOW_FRAME (ii))))));
2555 #ifdef PBS_SETBARCOLOR
2556 SendMessage (wnd, PBS_SETBARCOLOR, 0,
2557 (L:PARAM) (COLOR_INSTANCE_MSWINDOWS_COLOR
2560 (XIMAGE_INSTANCE_WIDGET_FACE (ii),
2561 XIMAGE_INSTANCE_SUBWINDOW_FRAME (ii))))));
2565 /* instantiate a tree view widget */
2566 static HTREEITEM add_tree_item (Lisp_Object image_instance,
2567 HWND wnd, HTREEITEM parent, Lisp_Object item,
2568 int children, Lisp_Object domain)
2570 TV_INSERTSTRUCT tvitem;
2573 tvitem.hParent = parent;
2574 tvitem.hInsertAfter = TVI_LAST;
2575 tvitem.item.mask = TVIF_TEXT | TVIF_CHILDREN;
2576 tvitem.item.cChildren = children;
2578 if (GUI_ITEMP (item))
2580 tvitem.item.lParam = mswindows_register_gui_item (item, domain);
2581 tvitem.item.mask |= TVIF_PARAM;
2582 TO_EXTERNAL_FORMAT (LISP_STRING, XGUI_ITEM (item)->name,
2583 C_STRING_ALLOCA, tvitem.item.pszText,
2587 TO_EXTERNAL_FORMAT (LISP_STRING, item,
2588 C_STRING_ALLOCA, tvitem.item.pszText,
2591 tvitem.item.cchTextMax = strlen (tvitem.item.pszText);
2593 if ((ret = (HTREEITEM)SendMessage (wnd, TVM_INSERTITEM,
2594 0, (LPARAM)&tvitem)) == 0)
2595 signal_simple_error ("error adding tree view entry", item);
2600 static void add_tree_item_list (Lisp_Object image_instance,
2601 HWND wnd, HTREEITEM parent, Lisp_Object list,
2606 /* get the first item */
2607 parent = add_tree_item (image_instance, wnd, parent, XCAR (list), TRUE, domain);
2608 /* recursively add items to the tree view */
2609 LIST_LOOP (rest, XCDR (list))
2611 if (LISTP (XCAR (rest)))
2612 add_tree_item_list (image_instance, wnd, parent, XCAR (rest), domain);
2614 add_tree_item (image_instance, wnd, parent, XCAR (rest), FALSE, domain);
2619 mswindows_tree_view_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2620 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2621 int dest_mask, Lisp_Object domain)
2626 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2627 mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
2628 pointer_bg, dest_mask, domain, WC_TREEVIEW,
2629 WS_TABSTOP | WS_BORDER | PBS_SMOOTH
2630 | TVS_HASLINES | TVS_HASBUTTONS,
2633 wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
2636 parent = add_tree_item (image_instance, wnd, NULL,
2637 XCAR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)),
2640 /* recursively add items to the tree view */
2641 /* add items to the tab */
2642 LIST_LOOP (rest, XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)))
2644 if (LISTP (XCAR (rest)))
2645 add_tree_item_list (image_instance, wnd, parent, XCAR (rest), domain);
2647 add_tree_item (image_instance, wnd, parent, XCAR (rest), FALSE, domain);
2651 /* instantiate a tab control */
2652 static TC_ITEM* add_tab_item (Lisp_Object image_instance,
2653 HWND wnd, Lisp_Object item,
2654 Lisp_Object domain, int i)
2656 TC_ITEM tvitem, *ret;
2658 tvitem.mask = TCIF_TEXT;
2660 if (GUI_ITEMP (item))
2662 tvitem.lParam = mswindows_register_gui_item (item, domain);
2663 tvitem.mask |= TCIF_PARAM;
2664 TO_EXTERNAL_FORMAT (LISP_STRING, XGUI_ITEM (item)->name,
2665 C_STRING_ALLOCA, tvitem.pszText,
2670 CHECK_STRING (item);
2671 TO_EXTERNAL_FORMAT (LISP_STRING, item,
2672 C_STRING_ALLOCA, tvitem.pszText,
2676 tvitem.cchTextMax = strlen (tvitem.pszText);
2678 if ((ret = (TC_ITEM*)SendMessage (wnd, TCM_INSERTITEM,
2679 i, (LPARAM)&tvitem)) < 0)
2680 signal_simple_error ("error adding tab entry", item);
2686 mswindows_tab_control_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2687 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2688 int dest_mask, Lisp_Object domain)
2693 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2694 Lisp_Object orient = find_keyword_in_vector (instantiator, Q_orientation);
2695 unsigned int flags = WS_TABSTOP;
2697 if (EQ (orient, Qleft) || EQ (orient, Qright))
2699 flags |= TCS_VERTICAL | TCS_MULTILINE;
2701 if (EQ (orient, Qright) || EQ (orient, Qbottom))
2703 flags |= TCS_BOTTOM;
2706 mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
2707 pointer_bg, dest_mask, domain, WC_TABCONTROL,
2708 /* borders don't suit tabs so well */
2711 wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
2712 /* add items to the tab */
2713 LIST_LOOP (rest, XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)))
2715 add_tab_item (image_instance, wnd, XCAR (rest), domain, i);
2720 /* set the properties of a tab control */
2722 mswindows_tab_control_update (Lisp_Object image_instance)
2724 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2726 if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii));
2728 HWND wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
2732 /* delete the pre-existing items */
2733 SendMessage (wnd, TCM_DELETEALLITEMS, 0, 0);
2735 /* add items to the tab */
2736 LIST_LOOP (rest, XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)))
2738 add_tab_item (image_instance, wnd, XCAR (rest),
2739 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii), i);
2745 /* instantiate a static control possible for putting other things in */
2747 mswindows_label_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2748 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2749 int dest_mask, Lisp_Object domain)
2751 mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
2752 pointer_bg, dest_mask, domain, "STATIC",
2753 0, WS_EX_STATICEDGE);
2756 /* instantiate a scrollbar control */
2758 mswindows_scrollbar_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2759 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2760 int dest_mask, Lisp_Object domain)
2762 mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
2763 pointer_bg, dest_mask, domain, "SCROLLBAR",
2764 WS_TABSTOP, WS_EX_CLIENTEDGE);
2767 /* instantiate a combo control */
2769 mswindows_combo_box_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2770 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2771 int dest_mask, Lisp_Object domain)
2773 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2776 Lisp_Object data = Fplist_get (find_keyword_in_vector (instantiator, Q_properties),
2780 /* Maybe ought to generalise this more but it may be very windows
2781 specific. In windows the window height of a combo box is the
2782 height when the combo box is open. Thus we need to set the height
2783 before creating the window and then reset it to a single line
2784 after the window is created so that redisplay does the right
2786 widget_instantiate (image_instance, instantiator, pointer_fg,
2787 pointer_bg, dest_mask, domain);
2789 /* We now have everything right apart from the height. */
2790 default_face_font_info (domain, 0, 0, &height, 0, 0);
2791 GET_LIST_LENGTH (data, len);
2793 height = (height + WIDGET_BORDER_HEIGHT * 2 ) * len;
2794 IMAGE_INSTANCE_HEIGHT (ii) = height;
2796 /* Now create the widget. */
2797 mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
2798 pointer_bg, dest_mask, domain, "COMBOBOX",
2799 WS_BORDER | WS_TABSTOP | CBS_DROPDOWN
2801 | CBS_HASSTRINGS | WS_VSCROLL,
2803 /* Reset the height. layout will probably do this safely, but better make sure. */
2804 image_instance_layout (image_instance,
2805 IMAGE_UNSPECIFIED_GEOMETRY,
2806 IMAGE_UNSPECIFIED_GEOMETRY,
2809 wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
2810 /* add items to the combo box */
2811 SendMessage (wnd, CB_RESETCONTENT, 0, 0);
2812 LIST_LOOP (rest, Fplist_get (IMAGE_INSTANCE_WIDGET_PROPS (ii), Q_items, Qnil))
2815 TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (rest),
2816 C_STRING_ALLOCA, lparam,
2818 if (SendMessage (wnd, CB_ADDSTRING, 0, (LPARAM)lparam) == CB_ERR)
2819 signal_simple_error ("error adding combo entries", instantiator);
2823 /* get properties of a control */
2825 mswindows_widget_property (Lisp_Object image_instance, Lisp_Object prop)
2827 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2828 HANDLE wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
2829 /* get the text from a control */
2830 if (EQ (prop, Q_text))
2832 Extcount len = SendMessage (wnd, WM_GETTEXTLENGTH, 0, 0);
2833 Extbyte* buf =alloca (len+1);
2835 SendMessage (wnd, WM_GETTEXT, (WPARAM)len+1, (LPARAM) buf);
2836 return build_ext_string (buf, Qnative);
2841 /* get properties of a button */
2843 mswindows_button_property (Lisp_Object image_instance, Lisp_Object prop)
2845 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2846 HANDLE wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
2847 /* check the state of a button */
2848 if (EQ (prop, Q_selected))
2850 if (SendMessage (wnd, BM_GETSTATE, 0, 0) & BST_CHECKED)
2858 /* get properties of a combo box */
2860 mswindows_combo_box_property (Lisp_Object image_instance, Lisp_Object prop)
2862 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2863 HANDLE wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii);
2864 /* get the text from a control */
2865 if (EQ (prop, Q_text))
2867 long item = SendMessage (wnd, CB_GETCURSEL, 0, 0);
2868 Extcount len = SendMessage (wnd, CB_GETLBTEXTLEN, (WPARAM)item, 0);
2869 Extbyte* buf = alloca (len+1);
2870 SendMessage (wnd, CB_GETLBTEXT, (WPARAM)item, (LPARAM)buf);
2871 return build_ext_string (buf, Qnative);
2876 /* set the properties of a progres guage */
2878 mswindows_progress_gauge_update (Lisp_Object image_instance)
2880 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2882 if (IMAGE_INSTANCE_WIDGET_PERCENT_CHANGED (ii))
2884 /* #### I'm not convinced we should store this in the plist. */
2885 Lisp_Object val = Fplist_get (IMAGE_INSTANCE_WIDGET_PROPS (ii),
2888 SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii),
2889 PBM_SETPOS, (WPARAM)XINT (val), 0);
2894 mswindows_control_wnd_proc (HWND hwnd, UINT msg,
2895 WPARAM wParam, LPARAM lParam)
2901 case WM_CTLCOLORBTN:
2902 case WM_CTLCOLORLISTBOX:
2903 case WM_CTLCOLOREDIT:
2904 case WM_CTLCOLORSTATIC:
2905 case WM_CTLCOLORSCROLLBAR:
2907 return mswindows_wnd_proc (GetParent (hwnd), msg, wParam, lParam);
2909 return DefWindowProc (hwnd, msg, wParam, lParam);
2913 #endif /* HAVE_WIDGETS */
2916 /************************************************************************/
2917 /* initialization */
2918 /************************************************************************/
2921 syms_of_glyphs_mswindows (void)
2923 defkeyword (&Q_resource_id, ":resource-id");
2924 defkeyword (&Q_resource_type, ":resource-type");
2928 console_type_create_glyphs_mswindows (void)
2932 CONSOLE_HAS_METHOD (mswindows, print_image_instance);
2933 CONSOLE_HAS_METHOD (mswindows, finalize_image_instance);
2934 CONSOLE_HAS_METHOD (mswindows, unmap_subwindow);
2935 CONSOLE_HAS_METHOD (mswindows, map_subwindow);
2936 CONSOLE_HAS_METHOD (mswindows, update_subwindow);
2937 CONSOLE_HAS_METHOD (mswindows, update_widget);
2938 CONSOLE_HAS_METHOD (mswindows, image_instance_equal);
2939 CONSOLE_HAS_METHOD (mswindows, image_instance_hash);
2940 CONSOLE_HAS_METHOD (mswindows, init_image_instance_from_eimage);
2941 CONSOLE_HAS_METHOD (mswindows, locate_pixmap_file);
2942 CONSOLE_HAS_METHOD (mswindows, resize_subwindow);
2946 image_instantiator_format_create_glyphs_mswindows (void)
2948 IIFORMAT_VALID_CONSOLE (mswindows, nothing);
2949 IIFORMAT_VALID_CONSOLE (mswindows, string);
2950 IIFORMAT_VALID_CONSOLE (mswindows, layout);
2951 IIFORMAT_VALID_CONSOLE (mswindows, formatted_string);
2952 IIFORMAT_VALID_CONSOLE (mswindows, inherit);
2953 /* image-instantiator types */
2955 INITIALIZE_DEVICE_IIFORMAT (mswindows, xpm);
2956 IIFORMAT_HAS_DEVMETHOD (mswindows, xpm, instantiate);
2958 INITIALIZE_DEVICE_IIFORMAT (mswindows, xbm);
2959 IIFORMAT_HAS_DEVMETHOD (mswindows, xbm, instantiate);
2961 INITIALIZE_DEVICE_IIFORMAT (mswindows, xface);
2962 IIFORMAT_HAS_DEVMETHOD (mswindows, xface, instantiate);
2965 IIFORMAT_VALID_CONSOLE (mswindows, jpeg);
2968 IIFORMAT_VALID_CONSOLE (mswindows, tiff);
2971 IIFORMAT_VALID_CONSOLE (mswindows, png);
2974 IIFORMAT_VALID_CONSOLE (mswindows, gif);
2978 INITIALIZE_DEVICE_IIFORMAT (mswindows, button);
2979 IIFORMAT_HAS_DEVMETHOD (mswindows, button, property);
2980 IIFORMAT_HAS_DEVMETHOD (mswindows, button, instantiate);
2981 IIFORMAT_HAS_DEVMETHOD (mswindows, button, update);
2983 INITIALIZE_DEVICE_IIFORMAT (mswindows, edit_field);
2984 IIFORMAT_HAS_DEVMETHOD (mswindows, edit_field, instantiate);
2986 INITIALIZE_DEVICE_IIFORMAT (mswindows, subwindow);
2987 IIFORMAT_HAS_DEVMETHOD (mswindows, subwindow, instantiate);
2989 INITIALIZE_DEVICE_IIFORMAT (mswindows, widget);
2990 IIFORMAT_HAS_DEVMETHOD (mswindows, widget, property);
2993 INITIALIZE_DEVICE_IIFORMAT (mswindows, label);
2994 IIFORMAT_HAS_DEVMETHOD (mswindows, label, instantiate);
2997 INITIALIZE_DEVICE_IIFORMAT (mswindows, combo_box);
2998 IIFORMAT_HAS_DEVMETHOD (mswindows, combo_box, property);
2999 IIFORMAT_HAS_DEVMETHOD (mswindows, combo_box, instantiate);
3002 INITIALIZE_DEVICE_IIFORMAT (mswindows, scrollbar);
3003 IIFORMAT_HAS_DEVMETHOD (mswindows, scrollbar, instantiate);
3005 /* progress gauge */
3006 INITIALIZE_DEVICE_IIFORMAT (mswindows, progress_gauge);
3007 IIFORMAT_HAS_DEVMETHOD (mswindows, progress_gauge, update);
3008 IIFORMAT_HAS_DEVMETHOD (mswindows, progress_gauge, instantiate);
3010 /* tree view widget */
3011 INITIALIZE_DEVICE_IIFORMAT (mswindows, tree_view);
3012 /* IIFORMAT_HAS_DEVMETHOD (mswindows, progress, set_property);*/
3013 IIFORMAT_HAS_DEVMETHOD (mswindows, tree_view, instantiate);
3015 /* tab control widget */
3016 INITIALIZE_DEVICE_IIFORMAT (mswindows, tab_control);
3017 IIFORMAT_HAS_DEVMETHOD (mswindows, tab_control, instantiate);
3018 IIFORMAT_HAS_DEVMETHOD (mswindows, tab_control, update);
3020 /* windows bitmap format */
3021 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (bmp, "bmp");
3022 IIFORMAT_HAS_METHOD (bmp, validate);
3023 IIFORMAT_HAS_METHOD (bmp, normalize);
3024 IIFORMAT_HAS_METHOD (bmp, possible_dest_types);
3025 IIFORMAT_HAS_METHOD (bmp, instantiate);
3027 IIFORMAT_VALID_KEYWORD (bmp, Q_data, check_valid_string);
3028 IIFORMAT_VALID_KEYWORD (bmp, Q_file, check_valid_string);
3029 IIFORMAT_VALID_CONSOLE (mswindows, bmp);
3031 /* mswindows resources */
3032 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (mswindows_resource,
3033 "mswindows-resource");
3035 IIFORMAT_HAS_METHOD (mswindows_resource, validate);
3036 IIFORMAT_HAS_METHOD (mswindows_resource, normalize);
3037 IIFORMAT_HAS_METHOD (mswindows_resource, possible_dest_types);
3038 IIFORMAT_HAS_METHOD (mswindows_resource, instantiate);
3040 IIFORMAT_VALID_KEYWORD (mswindows_resource, Q_resource_type,
3041 check_valid_resource_symbol);
3042 IIFORMAT_VALID_KEYWORD (mswindows_resource, Q_resource_id, check_valid_resource_id);
3043 IIFORMAT_VALID_KEYWORD (mswindows_resource, Q_file, check_valid_string);
3044 IIFORMAT_VALID_CONSOLE (mswindows, mswindows_resource);
3048 vars_of_glyphs_mswindows (void)
3050 DEFVAR_LISP ("mswindows-bitmap-file-path", &Vmswindows_bitmap_file_path /*
3051 A list of the directories in which mswindows bitmap files may be found.
3052 This is used by the `make-image-instance' function.
3054 Vmswindows_bitmap_file_path = Qnil;
3058 complex_vars_of_glyphs_mswindows (void)