Release 941122
[wine/multimedia.git] / objects / oembitmap.c
blob0c5a96c6871118476e48fe3531a9e4530d06f8c6
1 /*
2 * GDI OEM bitmap objects
4 * Copyright 1994 Alexandre Julliard
5 */
7 static char Copyright[] = "Copyright Alexandre Julliard, 1994";
9 #include <X11/Xlib.h>
10 #include <X11/Xutil.h>
11 #ifdef USE_XPM
12 #include <X11/xpm.h>
13 #endif
14 #include "gdi.h"
15 #include "bitmap.h"
16 #include "stddebug.h"
17 /* #define DEBUG_BITMAP */
18 #include "debug.h"
20 #define OBM_FIRST OBM_LFARROWI /* First OEM bitmap */
21 #define OBM_LAST OBM_OLD_CLOSE /* Last OEM bitmap */
23 #ifdef USE_XPM
26 #define NB_COLOR_SYMBOLS 5
28 /* This is the list of the symbolic colors. All the colors used */
29 /* in the xpm files must be included in this list. If you need */
30 /* to add new colors, add them just before "black", and add the */
31 /* color identifier in OBM_Sys_Colors_Symbols below. */
32 /* Warning: black and white must always be the last 2 colors. */
34 static XpmColorSymbol OBM_Color_Symbols[NB_COLOR_SYMBOLS+2] =
36 { "button_face", NULL, 0 }, /* COLOR_BTNFACE */
37 { "button_shadow", NULL, 0 }, /* COLOR_BTNSHADOW */
38 { "button_highlight", NULL, 0 }, /* COLOR_BTNHIGHLIGHT */
39 { "button_text", NULL, 0 }, /* COLOR_BTNTEXT */
40 { "window_frame", NULL, 0 }, /* COLOR_WINDOWFRAME */
41 { "black", NULL, 0 },
42 { "white", NULL, 0 }
45 static const int OBM_Sys_Colors_Symbols[NB_COLOR_SYMBOLS] =
47 COLOR_BTNFACE,
48 COLOR_BTNSHADOW,
49 COLOR_BTNHIGHLIGHT,
50 COLOR_BTNTEXT,
51 COLOR_WINDOWFRAME
54 /* Don't change this list! */
55 static XpmColorSymbol OBM_BW_Symbols[2] =
57 { "white", NULL, 0 },
58 { "black", NULL, 1 }
62 /* Include OEM pixmaps */
63 #include "bitmaps/obm_lfarrowi"
64 #include "bitmaps/obm_rgarrowi"
65 #include "bitmaps/obm_dnarrowi"
66 #include "bitmaps/obm_uparrowi"
67 #include "bitmaps/obm_combo"
68 #include "bitmaps/obm_mnarrow"
69 #include "bitmaps/obm_lfarrowd"
70 #include "bitmaps/obm_rgarrowd"
71 #include "bitmaps/obm_dnarrowd"
72 #include "bitmaps/obm_uparrowd"
73 #include "bitmaps/obm_restored"
74 #include "bitmaps/obm_zoomd"
75 #include "bitmaps/obm_reduced"
76 #include "bitmaps/obm_restore"
77 #include "bitmaps/obm_zoom"
78 #include "bitmaps/obm_reduce"
79 #include "bitmaps/obm_lfarrow"
80 #include "bitmaps/obm_rgarrow"
81 #include "bitmaps/obm_dnarrow"
82 #include "bitmaps/obm_uparrow"
83 #include "bitmaps/obm_close"
84 #include "bitmaps/obm_old_restore"
85 #include "bitmaps/obm_old_zoom"
86 #include "bitmaps/obm_old_reduce"
87 #include "bitmaps/obm_btncorners"
88 #include "bitmaps/obm_checkboxes"
89 #include "bitmaps/obm_check"
90 #include "bitmaps/obm_btsize"
91 #include "bitmaps/obm_old_lfarrow"
92 #include "bitmaps/obm_old_rgarrow"
93 #include "bitmaps/obm_old_dnarrow"
94 #include "bitmaps/obm_old_uparrow"
95 #include "bitmaps/obm_size"
96 #include "bitmaps/obm_old_close"
98 static const struct
100 char** data; /* Pointer to bitmap data */
101 BOOL color; /* Is it a color bitmap? */
102 } OBM_Pixmaps_Data[OBM_LAST-OBM_FIRST+1] = {
103 { obm_lfarrowi, TRUE }, /* OBM_LFARROWI */
104 { obm_rgarrowi, TRUE }, /* OBM_RGARROWI */
105 { obm_dnarrowi, TRUE }, /* OBM_DNARROWI */
106 { obm_uparrowi, TRUE }, /* OBM_UPARROWI */
107 { obm_combo, FALSE }, /* OBM_COMBO */
108 { obm_mnarrow, FALSE }, /* OBM_MNARROW */
109 { obm_lfarrowd, TRUE }, /* OBM_LFARROWD */
110 { obm_rgarrowd, TRUE }, /* OBM_RGARROWD */
111 { obm_dnarrowd, TRUE }, /* OBM_DNARROWD */
112 { obm_uparrowd, TRUE }, /* OBM_UPARROWD */
113 { obm_restored, TRUE }, /* OBM_RESTORED */
114 { obm_zoomd, TRUE }, /* OBM_ZOOMD */
115 { obm_reduced, TRUE }, /* OBM_REDUCED */
116 { obm_restore, TRUE }, /* OBM_RESTORE */
117 { obm_zoom, TRUE }, /* OBM_ZOOM */
118 { obm_reduce, TRUE }, /* OBM_REDUCE */
119 { obm_lfarrow, TRUE }, /* OBM_LFARROW */
120 { obm_rgarrow, TRUE }, /* OBM_RGARROW */
121 { obm_dnarrow, TRUE }, /* OBM_DNARROW */
122 { obm_uparrow, TRUE }, /* OBM_UPARROW */
123 { obm_close, TRUE }, /* OBM_CLOSE */
124 { obm_old_restore, FALSE }, /* OBM_OLD_RESTORE */
125 { obm_old_zoom, FALSE }, /* OBM_OLD_ZOOM */
126 { obm_old_reduce, FALSE }, /* OBM_OLD_REDUCE */
127 { obm_btncorners, FALSE }, /* OBM_BTNCORNERS */
128 { obm_checkboxes, FALSE }, /* OBM_CHECKBOXES */
129 { obm_check, FALSE }, /* OBM_CHECK */
130 { obm_btsize, FALSE }, /* OBM_BTSIZE */
131 { obm_old_lfarrow, FALSE }, /* OBM_OLD_LFARROW */
132 { obm_old_rgarrow, FALSE }, /* OBM_OLD_RGARROW */
133 { obm_old_dnarrow, FALSE }, /* OBM_OLD_DNARROW */
134 { obm_old_uparrow, FALSE }, /* OBM_OLD_UPARROW */
135 { obm_size, FALSE }, /* OBM_SIZE */
136 { obm_old_close, FALSE }, /* OBM_OLD_CLOSE */
139 #else /* USE_XPM */
141 /* Include OEM bitmaps */
142 #include "bitmaps/check_boxes"
143 #include "bitmaps/check_mark"
144 #include "bitmaps/menu_arrow"
146 static const struct
148 WORD width, height;
149 char *data;
150 } OBM_Bitmaps_Data[OBM_LAST-OBM_FIRST+1] =
152 { 0, 0, NULL }, /* OBM_LFARROWI */
153 { 0, 0, NULL }, /* OBM_RGARROWI */
154 { 0, 0, NULL }, /* OBM_DNARROWI */
155 { 0, 0, NULL }, /* OBM_UPARROWI */
156 { 0, 0, NULL }, /* OBM_COMBO */
157 { menu_arrow_width, menu_arrow_height, menu_arrow_bits }, /* OBM_MNARROW */
158 { 0, 0, NULL }, /* OBM_LFARROWD */
159 { 0, 0, NULL }, /* OBM_RGARROWD */
160 { 0, 0, NULL }, /* OBM_DNARROWD */
161 { 0, 0, NULL }, /* OBM_UPARROWD */
162 { 0, 0, NULL }, /* OBM_RESTORED */
163 { 0, 0, NULL }, /* OBM_ZOOMD */
164 { 0, 0, NULL }, /* OBM_REDUCED */
165 { 0, 0, NULL }, /* OBM_RESTORE */
166 { 0, 0, NULL }, /* OBM_ZOOM */
167 { 0, 0, NULL }, /* OBM_REDUCE */
168 { 0, 0, NULL }, /* OBM_LFARROW */
169 { 0, 0, NULL }, /* OBM_RGARROW */
170 { 0, 0, NULL }, /* OBM_DNARROW */
171 { 0, 0, NULL }, /* OBM_UPARROW */
172 { 0, 0, NULL }, /* OBM_CLOSE */
173 { 0, 0, NULL }, /* OBM_OLD_RESTORE */
174 { 0, 0, NULL }, /* OBM_OLD_ZOOM */
175 { 0, 0, NULL }, /* OBM_OLD_REDUCE */
176 { 0, 0, NULL }, /* OBM_BTNCORNERS */
177 { check_boxes_width, check_boxes_height,
178 check_boxes_bits }, /* OBM_CHECKBOXES */
179 { check_mark_width, check_mark_height, check_mark_bits }, /* OBM_CHECK */
180 { 0, 0, NULL }, /* OBM_BTSIZE */
181 { 0, 0, NULL }, /* OBM_OLD_LFARROW */
182 { 0, 0, NULL }, /* OBM_OLD_RGARROW */
183 { 0, 0, NULL }, /* OBM_OLD_DNARROW */
184 { 0, 0, NULL }, /* OBM_OLD_UPARROW */
185 { 0, 0, NULL }, /* OBM_SIZE */
186 { 0, 0, NULL }, /* OBM_OLD_CLOSE */
189 #endif /* USE_XPM */
191 extern WORD COLOR_ToPhysical( DC *dc, COLORREF color ); /* color.c */
193 extern Colormap COLOR_WinColormap;
196 /***********************************************************************
197 * OBM_InitColorSymbols
199 #ifdef USE_XPM
200 static void OBM_InitColorSymbols()
202 int i;
203 static int already_done = 0;
205 if (already_done) return;
207 /* Init the system colors */
208 for (i = 0; i < NB_COLOR_SYMBOLS; i++)
210 OBM_Color_Symbols[i].pixel = COLOR_ToPhysical( NULL,
211 GetSysColor(OBM_Sys_Colors_Symbols[i]));
213 /* Init black and white */
214 OBM_Color_Symbols[i++].pixel = COLOR_ToPhysical( NULL, RGB(0,0,0) );
215 OBM_Color_Symbols[i++].pixel = COLOR_ToPhysical( NULL, RGB(255,255,255) );
216 already_done = 1;
218 #endif /* USE_XPM */
220 /***********************************************************************
221 * OBM_LoadOEMBitmap
223 HBITMAP OBM_LoadOEMBitmap( WORD id )
225 BITMAPOBJ * bmpObjPtr;
226 HBITMAP hbitmap;
227 WORD width, height, bpp;
228 Pixmap pixmap;
230 if ((id < OBM_FIRST) || (id > OBM_LAST)) return 0;
231 id -= OBM_FIRST;
233 #ifdef USE_XPM
234 if (!OBM_Pixmaps_Data[id].data) return 0;
236 XpmAttributes attrs;
237 int err;
239 OBM_InitColorSymbols();
240 attrs.valuemask = XpmColormap | XpmDepth | XpmColorSymbols;
241 attrs.colormap = COLOR_WinColormap;
242 if (OBM_Pixmaps_Data[id].color) attrs.depth = bpp = screenDepth;
243 else attrs.depth = bpp = 1;
244 attrs.colorsymbols = (bpp > 1) ? OBM_Color_Symbols : OBM_BW_Symbols;
245 attrs.numsymbols = (bpp > 1) ? NB_COLOR_SYMBOLS + 2 : 2;
247 if ((err = XpmCreatePixmapFromData( display, rootWindow,
248 OBM_Pixmaps_Data[id].data,
249 &pixmap, NULL,
250 &attrs )) != XpmSuccess)
252 fprintf( stderr, "Error %d creating pixmap %d\n",
253 err, OBM_FIRST+id );
254 pixmap = 0;
256 else
258 width = attrs.width;
259 height = attrs.height;
262 #else
263 if (!OBM_Bitmaps_Data[id].data) return 0;
264 bpp = 1;
265 width = OBM_Bitmaps_Data[id].width;
266 height = OBM_Bitmaps_Data[id].height;
267 pixmap = XCreateBitmapFromData( display, rootWindow,
268 OBM_Bitmaps_Data[id].data, width, height );
269 #endif /* USE_XPM */
271 if (!pixmap) return 0;
273 /* Create the BITMAPOBJ */
274 if (!(hbitmap = GDI_AllocObject( sizeof(BITMAPOBJ), BITMAP_MAGIC )))
276 XFreePixmap( display, pixmap );
277 return 0;
279 bmpObjPtr = (BITMAPOBJ *) GDI_HEAP_ADDR( hbitmap );
280 bmpObjPtr->size.cx = 0;
281 bmpObjPtr->size.cy = 0;
282 bmpObjPtr->pixmap = pixmap;
283 bmpObjPtr->bitmap.bmType = 0;
284 bmpObjPtr->bitmap.bmWidth = width;
285 bmpObjPtr->bitmap.bmHeight = height;
286 bmpObjPtr->bitmap.bmWidthBytes = (width + 15) / 16 * 2;
287 bmpObjPtr->bitmap.bmPlanes = 1;
288 bmpObjPtr->bitmap.bmBitsPixel = bpp;
289 bmpObjPtr->bitmap.bmBits = NULL;
290 return hbitmap;