0022627: Change OCCT memory management defaults
[occt.git] / src / Xw / Xw_open_pixmap.cxx
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include <Xw_Extension.h>
6
7 #ifdef HAVE_X11_EXTENSIONS_MULTIBUF_H
8 # include <X11/extensions/multibuf.h>
9 #endif
10
11         /* ifdef then trace on */
12 #ifdef TRACE
13 #define TRACE_OPEN_PIXMAP
14 #define TRACE_OPEN_BACKGROUND_PIXMAP
15 #define TRACE_CLOSE_PIXMAP
16 #define TRACE_CLOSE_BACKGROUND_PIXMAP
17 #endif
18
19 /*
20    XW_STATUS Xw_open_pixmap (awindow)
21    XW_EXT_WINDOW *awindow
22
23         Open a DoubleBuffer PIXMAP depending of the Window size
24
25         returns ERROR if NO More PIXMAP is available on this Window
26         returns SUCCESS if successful
27
28    XW_STATUS Xw_open_background_pixmap (awindow)
29    XW_EXT_WINDOW *awindow
30
31         Open a Background PIXMAP depending of the Window size
32
33         returns ERROR if NO More PIXMAP is available on this Window
34         returns SUCCESS if successful
35
36    XW_STATUS Xw_close_pixmap (awindow)
37    XW_EXT_WINDOW *awindow
38
39         Close the DoubleBuffer PIXMAP attached to this Window
40
41         returns ERROR if NO More PIXMAP exist
42         returns SUCCESS if successful
43
44    XW_STATUS Xw_close_background_pixmap (awindow)
45    XW_EXT_WINDOW *awindow
46
47         Close the Background PIXMAP attached to this Window
48
49         returns ERROR if NO More PIXMAP exist
50         returns SUCCESS if successful
51 */
52
53 static char SetDoubleBuffer = '\0' ;
54
55 #ifdef XW_PROTOTYPE
56 XW_STATUS Xw_open_pixmap (void *awindow)
57 #else
58 XW_STATUS Xw_open_pixmap (awindow)
59 void *awindow;
60 #endif /*XW_PROTOTYPE*/
61 {
62 XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow;
63 XW_EXT_DISPLAY *pdisplay = pwindow->connexion;
64 int error,gravity ;
65 char svalue[4] ;
66 XW_STATUS status = XW_ERROR;
67
68     if( !Xw_isdefine_window(pwindow) ) {
69         /*ERROR*Bad EXT_WINDOW Address*/
70         Xw_set_error(24,"Xw_open_pixmap",pwindow) ;
71         return (XW_ERROR) ;
72     }
73
74     if( SetDoubleBuffer == '\0' ) {
75         SetDoubleBuffer = 'U' ;
76         if( Xw_get_env("Xw_SET_DOUBLE_BUFFER",svalue,sizeof(svalue)) ) {
77             if( strlen(svalue) ) {
78                 SetDoubleBuffer = svalue[0] ;
79             }
80             printf(" Xw_SET_DOUBLE_BUFFER is '%c'\n",SetDoubleBuffer) ;
81         }
82     }
83
84     if( (SetDoubleBuffer == 'B') && 
85                 (pdisplay->server == XW_SERVER_IS_SUN) && (_DEPTH != 24) ) {
86         SetDoubleBuffer = 'P';  /* BUG sur SUN */
87         /*WARNING*MultiBufferingExtension is not accessible here*/
88         Xw_set_error(126,"Xw_open_pixmap",pwindow) ;
89     }
90
91 #ifndef HAVE_X11_EXTENSIONS_MULTIBUF_H
92     if( SetDoubleBuffer == 'B' ) {
93         SetDoubleBuffer = 'P';  /* MULTIBUF unavailable under SGI IRIX 6.5 */
94         /*WARNING*MultiBufferingExtension is not accessible here*/
95         Xw_set_error(126,"Xw_open_pixmap",pwindow) ;
96     }
97 #else
98     if( SetDoubleBuffer == 'B' ) {
99       if( _NWBUFFER == 0 ) {
100         int mOptCode,fEvent,fError,maxmono,maxstereo ;
101         XmbufBufferInfo *pmono,*pstereo ;
102         if( XQueryExtension(_DISPLAY,"Multi-Buffering",
103                                 &mOptCode,&fEvent,&fError) && 
104                 XmbufGetScreenInfo(_DISPLAY,_WINDOW,
105                                 &maxmono,&pmono,&maxstereo,&pstereo) ) {
106           _NWBUFFER = XmbufCreateBuffers(_DISPLAY,_WINDOW,2,
107                                         MultibufferUpdateActionUntouched,
108                                         MultibufferUpdateHintFrequent,
109                                         &_FWBUFFER) ;
110         } 
111         if( _NWBUFFER == 2 ) {
112           XFillRectangle(_DISPLAY,_BWBUFFER,pwindow->qgwind.gcclear,
113                                                 0,0,_WIDTH,_HEIGHT) ;
114         } else {
115           if( _NWBUFFER > 0 ) XmbufDestroyBuffers(_DISPLAY,_WINDOW) ;
116           _NWBUFFER = 0 ;
117           _BWBUFFER = 0 ;
118           _FWBUFFER = 0 ;
119         }
120         SetDoubleBuffer = 'P';
121         /*WARNING*MultiBufferingExtension is not accessible here*/
122         Xw_set_error(126,"Xw_open_pixmap",pwindow) ;
123       }
124     }
125 #endif
126  
127     if( (SetDoubleBuffer == 'U') || 
128                 (SetDoubleBuffer == 'Y') || 
129                         (SetDoubleBuffer == 'P') ) { 
130       if( !_PIXMAP ) {
131         Xw_print_error();
132         if( !Xw_get_trace() ) Xw_set_synchronize(_DISPLAY,True) ;
133         _PIXMAP = XCreatePixmap(_DISPLAY,_WINDOW,_WIDTH,_HEIGHT,_DEPTH) ;
134         if( !Xw_get_trace() ) Xw_set_synchronize(_DISPLAY,False) ;
135
136         Xw_get_error(&error,&gravity);
137         if( _PIXMAP && (error < 1000) ) {
138           XFillRectangle(_DISPLAY,_PIXMAP,pwindow->qgwind.gcclear,
139                                                 0,0,_WIDTH,_HEIGHT) ;
140         } else {
141           /*ERROR*DISABLE Double Buffer*/
142           _PIXMAP = 0 ;
143           Xw_set_error(71,"Xw_open_pixmap",0) ;
144         }
145       }
146     } 
147
148     if( _PIXMAP || _NWBUFFER ) status = XW_SUCCESS;
149
150 #ifdef TRACE_OPEN_PIXMAP
151 if( Xw_get_trace() ) {
152     printf(" %d = Xw_open_pixmap(%lx)\n",status,(long ) pwindow) ;
153 }
154 #endif
155         
156     return (status);
157 }
158
159 #ifdef XW_PROTOTYPE
160 XW_STATUS Xw_close_pixmap (void *awindow)
161 #else
162 XW_STATUS Xw_close_pixmap (awindow)
163 void *awindow;
164 #endif /*XW_PROTOTYPE*/
165 {
166 XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow;
167
168     if( !Xw_isdefine_window(pwindow) ) {
169         /*ERROR*Bad EXT_WINDOW Address*/
170         Xw_set_error(24,"Xw_open_pixmap",pwindow) ;
171         return (XW_ERROR) ;
172     }
173
174 #ifdef HAVE_X11_EXTENSIONS_MULTIBUF_H 
175     if( _NWBUFFER > 0 ) XmbufDestroyBuffers(_DISPLAY,_WINDOW) ;
176 #endif
177     if( _PIXMAP ) XFreePixmap(_DISPLAY,_PIXMAP) ;
178     XFlush(_DISPLAY) ;
179     _PIXMAP = 0 ;
180     _NWBUFFER = 0 ;
181     _BWBUFFER = 0 ;
182     _FWBUFFER = 0 ;
183     _DRAWABLE = _WINDOW ;
184  
185 #ifdef TRACE_CLOSE_PIXMAP
186 if( Xw_get_trace() ) {
187     printf(" Xw_close_pixmap(%lx)\n",(long ) pwindow) ;
188 }
189 #endif
190
191     return XW_SUCCESS ;
192 }
193
194 #ifdef XW_PROTOTYPE
195 XW_STATUS Xw_open_background_pixmap (void *awindow)
196 #else
197 XW_STATUS Xw_open_background_pixmap (awindow)
198 void *awindow;
199 #endif /*XW_PROTOTYPE*/
200 {
201 XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow;
202 int error,gravity ;
203
204     if( !Xw_isdefine_window(pwindow) ) {
205         /*ERROR*Bad EXT_WINDOW Address*/
206         Xw_set_error(24,"Xw_open_background_pixmap",pwindow) ;
207         return (XW_ERROR) ;
208     }
209
210     if( _BPIXMAP ) Xw_close_background_pixmap(awindow) ; 
211
212     Xw_print_error();
213     if( !Xw_get_trace() ) Xw_set_synchronize(_DISPLAY,True) ;
214     _BPIXMAP = XCreatePixmap(_DISPLAY,_WINDOW,_WIDTH,_HEIGHT,_DEPTH) ;
215     if( !Xw_get_trace() ) Xw_set_synchronize(_DISPLAY,False) ;
216
217     Xw_get_error(&error,&gravity);
218     if( !_BPIXMAP || (error >= 1000) ) {
219         /*ERROR*DISABLE Double Buffer*/
220         _BPIXMAP = 0 ;
221         Xw_set_error(71,"Xw_open_background_pixmap",0) ;
222         return (XW_ERROR) ;
223     }
224
225     XFillRectangle(_DISPLAY,_BPIXMAP,pwindow->qgwind.gcclear,0,0,_WIDTH,_HEIGHT);
226
227 #ifdef TRACE_OPEN_BACKGROUND_PIXMAP
228 if( Xw_get_trace() ) {
229     printf(" Xw_open_background_pixmap(%lx)\n",(long ) pwindow) ;
230 }
231 #endif
232         
233     return (XW_SUCCESS);
234 }
235
236 #ifdef XW_PROTOTYPE
237 XW_STATUS Xw_close_background_pixmap (void *awindow)
238 #else
239 XW_STATUS Xw_close_background_pixmap (awindow)
240 void *awindow;
241 #endif /*XW_PROTOTYPE*/
242 {
243 XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow;
244
245     if( !Xw_isdefine_window(pwindow) ) {
246         /*ERROR*Bad EXT_WINDOW Address*/
247         Xw_set_error(24,"Xw_close_background_pixmap",pwindow) ;
248         return (XW_ERROR) ;
249     }
250
251     if( _BPIXMAP ) {
252         XFreePixmap(_DISPLAY,_BPIXMAP) ;
253         XFlush(_DISPLAY) ;
254         _BPIXMAP = 0 ;
255     } else {
256         return (XW_ERROR) ;
257     }
258  
259 #ifdef TRACE_CLOSE_BACKGROUND_PIXMAP
260 if( Xw_get_trace() ) {
261     printf(" Xw_close_background_pixmap(%lx)\n",(long ) pwindow) ;
262 }
263 #endif
264 return (XW_SUCCESS) ;
265 }