]> git.mxchange.org Git - flightgear.git/blob - Lib/PUI/puBox.cxx
Merge FG_Lib as subdirectory
[flightgear.git] / Lib / PUI / puBox.cxx
1
2 #include "puLocal.h"
3
4 #define PU_BEVEL              5
5 #define PU_SMALL_BEVEL        2
6 #define PU_DFLT_OFFSET        8
7 #define PU_BOX_WIDTH          2
8 #define PU_DROPSHADOW_OFFSET  5
9
10 void puBox::extend ( puBox *bx )
11 {
12   if ( bx -> isEmpty () ) return ;
13
14   if ( min[0]>bx->min[0] ) min[0] = bx->min[0] ;
15   if ( min[1]>bx->min[1] ) min[1] = bx->min[1] ;
16   if ( max[0]<bx->max[0] ) max[0] = bx->max[0] ;
17   if ( max[1]<bx->max[1] ) max[1] = bx->max[1] ;
18 }
19  
20
21  
22 void puBox::draw ( int dx, int dy, int style, puColour colour[], int am_default  )
23 {
24   int hi, mid, lo ;
25
26   /* Colour assignments */
27
28   switch ( style )
29   {
30     case  PUSTYLE_NONE       :
31       return ;
32
33     case  PUSTYLE_PLAIN      :
34     case  PUSTYLE_DROPSHADOW :
35       mid = PUCOL_FOREGROUND ;
36       lo  = PUCOL_BACKGROUND ;
37       break ;
38
39     case  PUSTYLE_SMALL_SHADED :
40     case  PUSTYLE_SHADED     :
41     case  PUSTYLE_SMALL_BEVELLED :
42     case  PUSTYLE_BEVELLED   :
43     case  PUSTYLE_BOXED      :
44     case  PUSTYLE_SPECIAL_UNDERLINED :
45       mid = PUCOL_FOREGROUND ;
46       hi  = PUCOL_HIGHLIGHT  ;
47       lo  = PUCOL_BACKGROUND ;
48       break ;
49
50     case  PUSTYLE_RADIO      :
51     case -PUSTYLE_RADIO      :
52       hi  = PUCOL_HIGHLIGHT  ;
53       lo  = PUCOL_BACKGROUND ;
54       break ;
55
56     case -PUSTYLE_PLAIN      :
57     case -PUSTYLE_DROPSHADOW :
58       mid = PUCOL_HIGHLIGHT  ;
59       lo  = PUCOL_BACKGROUND ;
60       break ;
61
62     case -PUSTYLE_SMALL_BEVELLED :
63     case -PUSTYLE_BEVELLED   :
64     case -PUSTYLE_SMALL_SHADED :
65     case -PUSTYLE_SHADED     :
66     case -PUSTYLE_BOXED      :
67     case -PUSTYLE_SPECIAL_UNDERLINED :
68       mid = PUCOL_FOREGROUND ;
69       hi  = PUCOL_BACKGROUND ;
70       lo  = PUCOL_HIGHLIGHT  ;
71       break ;
72
73     default :
74       fprintf ( stderr, "PUI: Unrecognised 'style' %d\n", style ) ;
75       return ;
76   }
77
78   switch ( abs(style) )
79   {
80     case  PUSTYLE_PLAIN      :
81       glColor4fv ( colour [ mid ] ) ;
82       glRecti ( dx + min[0], dy + min[1],
83                 dx + max[0], dy + max[1] ) ;
84       break ;
85
86     case  PUSTYLE_SMALL_BEVELLED   :
87     case  PUSTYLE_SMALL_SHADED     :
88       glColor4fv ( colour [ hi  ] ) ;
89       glBegin ( GL_QUAD_STRIP ) ;
90         glVertex2i ( dx + min[0] + PU_SMALL_BEVEL, dy + min[1] + PU_SMALL_BEVEL ) ;
91         glVertex2i ( dx + min[0], dy + min[1] ) ;
92         glVertex2i ( dx + min[0] + PU_SMALL_BEVEL, dy + max[1] - PU_SMALL_BEVEL ) ;
93         glVertex2i ( dx + min[0], dy + max[1] ) ;
94         glVertex2i ( dx + max[0] - PU_SMALL_BEVEL, dy + max[1] - PU_SMALL_BEVEL ) ;
95         glVertex2i ( dx + max[0], dy + max[1] ) ;
96       glEnd () ;
97         glColor4fv ( colour [ lo  ] ) ;
98       glBegin ( GL_QUAD_STRIP ) ;
99         glVertex2i ( dx + min[0], dy + min[1] ) ;
100         glVertex2i ( dx + min[0] + PU_SMALL_BEVEL, dy + min[1] + PU_SMALL_BEVEL ) ;
101         glVertex2i ( dx + max[0], dy + min[1] ) ;
102         glVertex2i ( dx + max[0] - PU_SMALL_BEVEL, dy + min[1] + PU_SMALL_BEVEL ) ;
103         glVertex2i ( dx + max[0], dy + max[1] ) ;
104         glVertex2i ( dx + max[0] - PU_SMALL_BEVEL, dy + max[1] - PU_SMALL_BEVEL ) ;
105       glEnd () ;
106
107       if ( abs(style) == PUSTYLE_SMALL_BEVELLED )
108       {
109         glColor4fv ( colour [ mid ] ) ;
110         glRecti ( dx + min[0] + PU_SMALL_BEVEL, dy + min[1] + PU_SMALL_BEVEL,
111                   dx + max[0] - PU_SMALL_BEVEL, dy + max[1] - PU_SMALL_BEVEL ) ;
112       }
113       else
114       {
115         glShadeModel(GL_SMOOTH);
116         glBegin(GL_POLYGON);
117           glColor4fv( colour [ mid ] );
118           glVertex2i( dx + min[0] + PU_SMALL_BEVEL , dy + min[1] + PU_SMALL_BEVEL );
119           if(style==PUSTYLE_SMALL_SHADED)
120             glColor4f( colour [mid][0] + (colour[lo][0] - colour[mid][0])/2.0f,
121                        colour [mid][1] + (colour[lo][1] - colour[mid][1])/2.0f,
122                        colour [mid][2] + (colour[lo][2] - colour[mid][2])/2.0f,
123                        colour [lo][3] );
124           else
125             glColor4f( colour [mid][0] + (colour[hi][0] - colour[mid][0])/2.0f,
126                        colour [mid][1] + (colour[hi][1] - colour[mid][1])/2.0f,
127                        colour [mid][2] + (colour[hi][2] - colour[mid][2])/2.0f,
128                        colour [hi][3] );
129           glVertex2i( dx + min[0] + PU_SMALL_BEVEL , dy + max[1] - PU_SMALL_BEVEL );
130           glColor4fv( colour [ mid ] );
131           glVertex2i( dx + max[0] - PU_SMALL_BEVEL , dy + max[1] - PU_SMALL_BEVEL );
132           if(style==-PUSTYLE_SMALL_SHADED)
133             glColor4f( colour [mid][0] + (colour[lo][0] - colour[mid][0])/2.0f,
134                        colour [mid][1] + (colour[lo][1] - colour[mid][1])/2.0f,
135                        colour [mid][2] + (colour[lo][2] - colour[mid][2])/2.0f,
136                        colour [lo][3] );
137           else
138             glColor4f( colour [mid][0] + (colour[hi][0] - colour[mid][0])/2.0f,
139                        colour [mid][1] + (colour[hi][1] - colour[mid][1])/2.0f,
140                        colour [mid][2] + (colour[hi][2] - colour[mid][2])/2.0f,
141                        colour [hi][3] );
142           glVertex2i( dx + max[0] - PU_SMALL_BEVEL , dy + min[1] + PU_SMALL_BEVEL );
143         glEnd();
144         glShadeModel(GL_FLAT);
145
146         if(style == -PUSTYLE_SMALL_SHADED)
147         {
148           glColor4fv ( colour [ lo  ] ) ;
149           glBegin ( GL_QUAD_STRIP ) ;
150             glVertex2i ( dx + min[0] + PU_SMALL_BEVEL   , dy + min[1] + PU_SMALL_BEVEL   ) ;
151             glVertex2i ( dx + min[0] + PU_SMALL_BEVEL/2 , dy + min[1] + PU_SMALL_BEVEL/2 ) ;
152             glVertex2i ( dx + min[0] + PU_SMALL_BEVEL   , dy + max[1] - PU_SMALL_BEVEL   ) ;
153             glVertex2i ( dx + min[0] + PU_SMALL_BEVEL/2 , dy + max[1] - PU_SMALL_BEVEL/2 ) ;
154             glVertex2i ( dx + max[0] - PU_SMALL_BEVEL   , dy + max[1] - PU_SMALL_BEVEL   ) ;
155             glVertex2i ( dx + max[0] - PU_SMALL_BEVEL/2 , dy + max[1] - PU_SMALL_BEVEL/2 ) ;
156           glEnd () ;
157           glColor4fv ( colour [ hi  ] ) ;
158           glBegin ( GL_QUAD_STRIP ) ;
159             glVertex2i ( dx + min[0] + PU_SMALL_BEVEL/2 , dy + min[1] + PU_SMALL_BEVEL/2 ) ;
160             glVertex2i ( dx + min[0] + PU_SMALL_BEVEL   , dy + min[1] + PU_SMALL_BEVEL   ) ;
161             glVertex2i ( dx + max[0] - PU_SMALL_BEVEL/2 , dy + min[1] + PU_SMALL_BEVEL/2 ) ;
162             glVertex2i ( dx + max[0] - PU_SMALL_BEVEL   , dy + min[1] + PU_SMALL_BEVEL   ) ;
163             glVertex2i ( dx + max[0] - PU_SMALL_BEVEL/2 , dy + max[1] - PU_SMALL_BEVEL/2 ) ;
164             glVertex2i ( dx + max[0] - PU_SMALL_BEVEL   , dy + max[1] - PU_SMALL_BEVEL   ) ;
165           glEnd () ;
166         }       
167       }
168       break ;
169
170     case  PUSTYLE_BEVELLED   :
171     case  PUSTYLE_SHADED     :
172       glColor4fv ( colour [ hi  ] ) ;
173       glBegin ( GL_QUAD_STRIP ) ;
174         glVertex2i ( dx + min[0] + PU_BEVEL, dy + min[1] + PU_BEVEL ) ;
175         glVertex2i ( dx + min[0], dy + min[1] ) ;
176         glVertex2i ( dx + min[0] + PU_BEVEL, dy + max[1] - PU_BEVEL ) ;
177         glVertex2i ( dx + min[0], dy + max[1] ) ;
178         glVertex2i ( dx + max[0] - PU_BEVEL, dy + max[1] - PU_BEVEL ) ;
179         glVertex2i ( dx + max[0], dy + max[1] ) ;
180       glEnd () ;
181         glColor4fv ( colour [ lo  ] ) ;
182       glBegin ( GL_QUAD_STRIP ) ;
183         glVertex2i ( dx + min[0], dy + min[1] ) ;
184         glVertex2i ( dx + min[0] + PU_BEVEL, dy + min[1] + PU_BEVEL ) ;
185         glVertex2i ( dx + max[0], dy + min[1] ) ;
186         glVertex2i ( dx + max[0] - PU_BEVEL, dy + min[1] + PU_BEVEL ) ;
187         glVertex2i ( dx + max[0], dy + max[1] ) ;
188         glVertex2i ( dx + max[0] - PU_BEVEL, dy + max[1] - PU_BEVEL ) ;
189       glEnd () ;
190
191       if ( abs(style) == PUSTYLE_BEVELLED )
192       {
193         glColor4fv ( colour [ mid ] ) ;
194         glRecti ( dx + min[0] + PU_BEVEL, dy + min[1] + PU_BEVEL,
195                   dx + max[0] - PU_BEVEL, dy + max[1] - PU_BEVEL ) ;
196       }
197       else
198       {
199         glShadeModel(GL_SMOOTH);
200         glBegin(GL_POLYGON);
201           glColor4fv( colour [ mid ] );
202           glVertex2i( dx + min[0] + PU_BEVEL , dy + min[1] + PU_BEVEL );
203           if(style==PUSTYLE_SHADED)
204             glColor4f( colour [mid][0] + (colour[lo][0] - colour[mid][0])/2.0f,
205                        colour [mid][1] + (colour[lo][1] - colour[mid][1])/2.0f,
206                        colour [mid][2] + (colour[lo][2] - colour[mid][2])/2.0f,
207                        colour [lo][3] );
208           else
209             glColor4f( colour [mid][0] + (colour[hi][0] - colour[mid][0])/2.0f,
210                        colour [mid][1] + (colour[hi][1] - colour[mid][1])/2.0f,
211                        colour [mid][2] + (colour[hi][2] - colour[mid][2])/2.0f,
212                        colour [hi][3] );
213           glVertex2i( dx + min[0] + PU_BEVEL , dy + max[1] - PU_BEVEL );
214           glColor4fv( colour [ mid ] );
215           glVertex2i( dx + max[0] - PU_BEVEL , dy + max[1] - PU_BEVEL );
216           if(style==-PUSTYLE_SHADED)
217             glColor4f( colour [mid][0] + (colour[lo][0] - colour[mid][0])/2.0f,
218                        colour [mid][1] + (colour[lo][1] - colour[mid][1])/2.0f,
219                        colour [mid][2] + (colour[lo][2] - colour[mid][2])/2.0f,
220                        colour [lo][3] );
221           else
222             glColor4f( colour [mid][0] + (colour[hi][0] - colour[mid][0])/2.0f,
223                        colour [mid][1] + (colour[hi][1] - colour[mid][1])/2.0f,
224                        colour [mid][2] + (colour[hi][2] - colour[mid][2])/2.0f,
225                        colour [hi][3] );
226           glVertex2i( dx + max[0] - PU_BEVEL , dy + min[1] + PU_BEVEL );
227         glEnd();
228         glShadeModel(GL_FLAT);
229
230         if(style == -PUSTYLE_SHADED)
231         {
232           glColor4fv ( colour [ lo  ] ) ;
233           glBegin ( GL_QUAD_STRIP ) ;
234             glVertex2i ( dx + min[0] + PU_BEVEL   , dy + min[1] + PU_BEVEL   ) ;
235             glVertex2i ( dx + min[0] + PU_BEVEL/2 , dy + min[1] + PU_BEVEL/2 ) ;
236             glVertex2i ( dx + min[0] + PU_BEVEL   , dy + max[1] - PU_BEVEL   ) ;
237             glVertex2i ( dx + min[0] + PU_BEVEL/2 , dy + max[1] - PU_BEVEL/2 ) ;
238             glVertex2i ( dx + max[0] - PU_BEVEL   , dy + max[1] - PU_BEVEL   ) ;
239             glVertex2i ( dx + max[0] - PU_BEVEL/2 , dy + max[1] - PU_BEVEL/2 ) ;
240           glEnd () ;
241           glColor4fv ( colour [ hi  ] ) ;
242           glBegin ( GL_QUAD_STRIP ) ;
243             glVertex2i ( dx + min[0] + PU_BEVEL/2 , dy + min[1] + PU_BEVEL/2 ) ;
244             glVertex2i ( dx + min[0] + PU_BEVEL   , dy + min[1] + PU_BEVEL   ) ;
245             glVertex2i ( dx + max[0] - PU_BEVEL/2 , dy + min[1] + PU_BEVEL/2 ) ;
246             glVertex2i ( dx + max[0] - PU_BEVEL   , dy + min[1] + PU_BEVEL   ) ;
247             glVertex2i ( dx + max[0] - PU_BEVEL/2 , dy + max[1] - PU_BEVEL/2 ) ;
248             glVertex2i ( dx + max[0] - PU_BEVEL   , dy + max[1] - PU_BEVEL   ) ;
249           glEnd () ;
250         }       
251       } 
252       break ;
253
254     case  PUSTYLE_BOXED      :
255       glColor4fv ( colour [ hi  ] ) ;
256       glRecti ( dx + min[0], dy + min[1],
257                 dx + max[0], dy + max[1] ) ;
258       glColor4fv ( colour [ mid ] ) ;
259       glRecti ( dx + min[0]+PU_BOX_WIDTH, dy + min[1]+PU_BOX_WIDTH,
260                 dx + max[0]-PU_BOX_WIDTH, dy + max[1]-PU_BOX_WIDTH ) ;
261       break ;
262
263     case  PUSTYLE_RADIO      :
264       glColor4fv ( colour [ lo  ] ) ;
265       glBegin ( GL_LINE_LOOP ) ;
266         glVertex2i ( dx + min[0] + PU_RADIO_BUTTON_SIZE/2, dy + min[1]                          ) ;
267         glVertex2i ( dx + min[0] + PU_RADIO_BUTTON_SIZE  , dy + min[1] + PU_RADIO_BUTTON_SIZE/2 ) ;
268         glVertex2i ( dx + min[0] + PU_RADIO_BUTTON_SIZE/2, dy + min[1] + PU_RADIO_BUTTON_SIZE   ) ;
269         glVertex2i ( dx + min[0]                         , dy + min[1] + PU_RADIO_BUTTON_SIZE/2 ) ;
270       glEnd () ;
271
272       if ( style < 0 )
273       {
274         glColor4fv ( colour [ hi  ] ) ;
275         glBegin ( GL_QUADS ) ;
276           glVertex2i ( dx + min[0] + PU_RADIO_BUTTON_SIZE/2, dy + min[1] + 2                      ) ;
277           glVertex2i ( dx + min[0] + PU_RADIO_BUTTON_SIZE-2, dy + min[1] + PU_RADIO_BUTTON_SIZE/2 ) ;
278           glVertex2i ( dx + min[0] + PU_RADIO_BUTTON_SIZE/2, dy + min[1] + PU_RADIO_BUTTON_SIZE-2 ) ;
279           glVertex2i ( dx + min[0] + 2                     , dy + min[1] + PU_RADIO_BUTTON_SIZE/2 ) ;
280         glEnd () ;
281       }
282       break ;
283
284     case  PUSTYLE_SPECIAL_UNDERLINED :
285       glColor4fv ( colour [ hi  ] ) ;
286       glRecti ( dx + min[0], dy + min[1],
287                 dx + max[0], dy + min[1]+2 ) ;
288       glColor4fv ( colour [ mid ] ) ;
289       glRecti ( dx + min[0], dy + min[1]+1,
290                 dx + max[0], dy + max[1] ) ;
291       break ;
292
293     case  PUSTYLE_DROPSHADOW :
294       glColor4fv ( colour [ lo  ] ) ;
295       glRecti ( dx + min[0] + PU_DROPSHADOW_OFFSET, dy + min[1] - PU_DROPSHADOW_OFFSET,
296                 dx + max[0] + PU_DROPSHADOW_OFFSET, dy + max[1] - PU_DROPSHADOW_OFFSET ) ;
297       glColor4fv ( colour [ mid ] ) ;
298       glRecti ( dx + min[0], dy + min[1],
299                 dx + max[0], dy + max[1] ) ;
300       break ;
301   }
302
303   if ( am_default )
304   {
305     glColor4fv ( colour [ PUCOL_BACKGROUND ] ) ;
306     glLineStipple ( 1, 0xF0F0 ) ;
307     glEnable ( GL_LINE_STIPPLE ) ;
308     glBegin ( GL_LINE_LOOP ) ;
309       glVertex2i ( dx + min[0] + PU_DFLT_OFFSET, dy + min[1] + PU_DFLT_OFFSET ) ;
310       glVertex2i ( dx + min[0] + PU_DFLT_OFFSET, dy + max[1] - PU_DFLT_OFFSET ) ;
311       glVertex2i ( dx + max[0] - PU_DFLT_OFFSET, dy + max[1] - PU_DFLT_OFFSET ) ;
312       glVertex2i ( dx + max[0] - PU_DFLT_OFFSET, dy + min[1] + PU_DFLT_OFFSET ) ;
313     glEnd () ;
314     glDisable ( GL_LINE_STIPPLE ) ;
315   }
316 }
317
318
319