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