Release 941122
[wine] / objects / oembitmap.c
1 /*
2  * GDI OEM bitmap objects
3  *
4  * Copyright 1994 Alexandre Julliard
5  */
6
7 static char Copyright[] = "Copyright  Alexandre Julliard, 1994";
8
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"
19
20 #define OBM_FIRST  OBM_LFARROWI    /* First OEM bitmap */
21 #define OBM_LAST   OBM_OLD_CLOSE   /* Last OEM bitmap */
22
23 #ifdef USE_XPM
24
25
26 #define NB_COLOR_SYMBOLS  5
27
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.   */
33
34 static XpmColorSymbol OBM_Color_Symbols[NB_COLOR_SYMBOLS+2] =
35 {
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 }
43 };
44
45 static const int OBM_Sys_Colors_Symbols[NB_COLOR_SYMBOLS] =
46 {
47     COLOR_BTNFACE,
48     COLOR_BTNSHADOW,
49     COLOR_BTNHIGHLIGHT,
50     COLOR_BTNTEXT,
51     COLOR_WINDOWFRAME
52 };
53
54   /* Don't change this list! */
55 static XpmColorSymbol OBM_BW_Symbols[2] =
56 {
57     { "white", NULL, 0 },
58     { "black", NULL, 1 }
59 };
60
61
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"
97
98 static const struct
99 {
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 */
137 };
138
139 #else  /* USE_XPM */
140
141   /* Include OEM bitmaps */
142 #include "bitmaps/check_boxes"
143 #include "bitmaps/check_mark"
144 #include "bitmaps/menu_arrow"
145
146 static const struct
147 {
148     WORD width, height;
149     char *data;
150 } OBM_Bitmaps_Data[OBM_LAST-OBM_FIRST+1] =
151 {
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 */
187 };
188
189 #endif /* USE_XPM */
190
191 extern WORD COLOR_ToPhysical( DC *dc, COLORREF color );  /* color.c */
192
193 extern Colormap COLOR_WinColormap;
194
195
196 /***********************************************************************
197  *           OBM_InitColorSymbols
198  */
199 #ifdef USE_XPM
200 static void OBM_InitColorSymbols()
201 {
202     int i;
203     static int already_done = 0;
204
205     if (already_done) return;
206
207       /* Init the system colors */
208     for (i = 0; i < NB_COLOR_SYMBOLS; i++)
209     {
210         OBM_Color_Symbols[i].pixel = COLOR_ToPhysical( NULL,
211                                        GetSysColor(OBM_Sys_Colors_Symbols[i]));
212     }
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;
217 }
218 #endif  /* USE_XPM */
219
220 /***********************************************************************
221  *           OBM_LoadOEMBitmap
222  */
223 HBITMAP OBM_LoadOEMBitmap( WORD id )
224 {
225     BITMAPOBJ * bmpObjPtr;
226     HBITMAP hbitmap;
227     WORD width, height, bpp;
228     Pixmap pixmap;
229
230     if ((id < OBM_FIRST) || (id > OBM_LAST)) return 0;
231     id -= OBM_FIRST;
232
233 #ifdef USE_XPM
234     if (!OBM_Pixmaps_Data[id].data) return 0;
235     {
236         XpmAttributes attrs;
237         int err;
238
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;
246         
247         if ((err = XpmCreatePixmapFromData( display, rootWindow,
248                                             OBM_Pixmaps_Data[id].data,
249                                             &pixmap, NULL,
250                                             &attrs )) != XpmSuccess)
251         {
252             fprintf( stderr, "Error %d creating pixmap %d\n",
253                      err, OBM_FIRST+id );
254             pixmap = 0;
255         }
256         else
257         {
258             width = attrs.width;
259             height = attrs.height;
260         }
261     }
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 */
270
271     if (!pixmap) return 0;
272
273       /* Create the BITMAPOBJ */
274     if (!(hbitmap = GDI_AllocObject( sizeof(BITMAPOBJ), BITMAP_MAGIC )))
275     {
276         XFreePixmap( display, pixmap );
277         return 0;
278     }
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;
291 }
292
293