0021578: Attached shape is not visualized in the shaded mode
[occt.git] / src / OpenGl / OpenGl_togl_print.cxx
CommitLineData
7fd59977 1/* File OpenGL_togl_print.c
2Created March 2000
3Author THA
4e-mail t-hartl@muenchen.matra-dtv.fr */
5
6#define RIC120302 /* GG Enable to use the application display
7// callback at end of traversal
8*/
9
10#include <OpenGl_tgl_all.hxx>
11#include <InterfaceGraphic_Graphic3d.hxx>
12#include <InterfaceGraphic_Visual3d.hxx>
13#include <OpenGl_tsm_ws.hxx>
14#include <OpenGl_tgl.hxx>
15#include <OpenGl_txgl.hxx>
16#include <OpenGl_tgl_tox.hxx>
17#include <OpenGl_tgl_funcs.hxx>
18#include <OpenGl_tgl_subrvis.hxx>
19#include <OpenGl_animation.hxx>
20
21#include <string.h>
22
23/* SAV - begin */
24/* MSDN says: point is 1/72 inch. But in our case text height in the 3D view
25differs from printed one. An experiment showed that delimeter equal to 2*72 gives
26practically equal text heights. */
27int defaultDelimeter = 72;
28int delimeter = 144;
29int defaultPntSize = 12;
30
31GLuint printerFontBase = 0;
32
33/* printer DC needed to avoid passing OS specific type as a procedure parameter */
34#ifdef WNT
35HDC printer;
36HGDIOBJ oldObj;
37#endif
38
39GLuint createFont( char* typeFace, int height, int weight, int italic )
40{
41#ifdef WNT
42 /* no unicode support yet*/
43 HFONT font;
44 GLuint base;
45 DWORD charSet = ANSI_CHARSET;
46
47 if ( ( base = glGenLists( 96 ) ) == 0 )
48 return 0;
49
50 if ( _stricmp( typeFace, "symbol" ) == 0 )
51 charSet = SYMBOL_CHARSET;
52
53 font = CreateFont( height, 0, 0, 0, weight, italic, FALSE, FALSE,
54 charSet, OUT_TT_PRECIS,
55 CLIP_DEFAULT_PRECIS, DRAFT_QUALITY,
56 DEFAULT_PITCH, typeFace );
57 oldObj = SelectObject( printer, font );
58 wglUseFontBitmaps( printer, 32, 96, base );
59 return base;
60#endif
61 return 0;
62}
63
64void deleteFont( GLuint base )
65{
66#ifdef WNT
67 HFONT currentFont;
68
69 if ( base == 0 )
70 /* no font created */
71 return;
72 /* deleting font list id */
73 glDeleteLists( base, 96 );
74 currentFont = (HFONT)SelectObject( printer, oldObj );
75 /* deleting current font structure */
76 DeleteObject( currentFont );
77#endif
78}
79
80void updatePrinterFont( char* type, int height )
81{
82#ifdef WNT
83 int delim = delimeter;
84 if ( height <= 0 ) {
85 height = defaultPntSize;
86 delim = defaultDelimeter;
87 }
88 /* deleting old font */
89 deleteFont( printerFontBase );
90 /* creating new one */
91 printerFontBase = createFont( type, -MulDiv( height, GetDeviceCaps( printer, LOGPIXELSY ), delim ),
92 (int)FW_NORMAL, 0 );
93#endif
94}
95/* SAV - end */
96
97
98void EXPORT
99call_togl_print
100(
101 CALL_DEF_VIEW *aview,
102 CALL_DEF_LAYER *anunderlayer,
103 CALL_DEF_LAYER *anoverlayer,
104 const Aspect_Drawable hPrintDC,
105 const int background,
106 const char* filename
107 )
108{
109
110#ifdef WNT
111
112 CMN_KEY_DATA data;
113 Tint swap = 1; /* swap buffers ? yes */
114
115
116 BOOL bRet = FALSE;
117 HDC hPrnDC;
118 DOCINFO di;
119
120 hPrnDC = (HDC) hPrintDC;
121 printer = hPrnDC;
122
123 /* Begin main routine **************************************************************/
124 TsmGetWSAttri (aview->WsId, WSWindow, &data);
125 if (TxglWinset (call_thedisplay, (WINDOW) data.ldata) == TSuccess)
126 {
127 static PIXELFORMATDESCRIPTOR pfd = {
128 sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
129 1, // version number
130 PFD_SUPPORT_OPENGL|
131 PFD_DRAW_TO_BITMAP,
132 PFD_TYPE_RGBA,
133 0, 0, 0, 0, 0, 0, // color bits ignored
134 0, // no alpha buffer
135 0, // shift bit ignored
136 0, // no accumulation buffer
137 0, 0, 0, 0, // accum bits ignored
138 32, // 32-bit z-buffer
139 0, // no stencil buffer
140 0, // no auxiliary buffer
141 PFD_MAIN_PLANE, // main layer
142 0, // reserved
143 0, 0, 0 // layer masks ignored
144 };
145 HWND w;
146 HDC hDC;
147 HDC hMemDC;
148 HGLRC hGLRC;
149 RECT rect;
150
151 BITMAPINFO* pBMI;
152 BITMAPINFOHEADER* bmHeader;
153
154 BYTE biInfo[sizeof(BITMAPINFOHEADER) + 256 * sizeof (RGBQUAD)];
155 HGDIOBJ hBmOld;
156 HBITMAP hBm;
157 VOID* base;
158
159 int nIndex;
160 int bmiSize;
161
162 float viewRatio;
163 int devWidth;
164 int devHeight;
165 int viewWidth;
166 int viewHeight;
167 int width;
168 int height;
169 float tempWidth;
170 float tempHeight;
171 int offsetx = 0;
172 int offsety = 0;
173
174#ifdef mydebug
175 devWidth = 640;
176 tempWidth = (float) devWidth;
177 devHeight = 480;
178 tempHeight = (float) devHeight;
179#else
180 devWidth = GetDeviceCaps(hPrnDC, HORZRES);
181 tempWidth = (float) devWidth;
182 devHeight = GetDeviceCaps(hPrnDC, VERTRES);
183 tempHeight = (float) devHeight;
184#endif
185 GetClientRect((WINDOW) data.ldata, &rect);
186 viewWidth = rect.right-rect.left;
187 viewHeight = rect.bottom-rect.top;
188
189 viewRatio = (float) viewWidth/(float) viewHeight;
190
191 // Calculate correct width/height ratio
192 if (tempHeight < tempWidth/viewRatio)
193 tempWidth = tempHeight*viewRatio;
194 if (tempWidth < tempHeight*viewRatio)
195 tempHeight = tempWidth/viewRatio;
196
197 width = (int) tempWidth;
198 height = (int) tempHeight;
199
200 // Create virtual window
201 w = CreateWindow(
202 "Button",
203 "",
204 WS_OVERLAPPEDWINDOW |
205 WS_CLIPCHILDREN |
206 WS_CLIPSIBLINGS,
207 0, 0,
208 width, height,
209 NULL,
210 NULL,
211 NULL,
212 NULL);
213#ifdef mydebug
214 ShowWindow(w, SW_SHOW);
215#endif
216
217 hDC = GetDC(w);
218 if (!hDC)
219 {
220 MessageBox(0,"hDC == NULL", "Fehler", MB_OK);
221 return;
222 }
223
224 // Initialize Bitmap Information
225
226 pBMI = (BITMAPINFO *) biInfo;
227 ZeroMemory(pBMI, sizeof(*pBMI));
228 bmiSize = sizeof(*pBMI);
229
230 pBMI = (BITMAPINFO *) calloc(1, bmiSize);
231 bmHeader = &pBMI->bmiHeader;
232
233 bmHeader->biSize = sizeof(*bmHeader);
234 bmHeader->biWidth = width;
235 bmHeader->biHeight = height;
236 bmHeader->biPlanes = 1; /* must be 1 */
237 bmHeader->biBitCount = 24;
238 bmHeader->biXPelsPerMeter = 0;
239 bmHeader->biYPelsPerMeter = 0;
240 bmHeader->biClrUsed = 0; /* all are used */
241 bmHeader->biClrImportant = 0; /* all are important */
242 bmHeader->biCompression = BI_RGB;
243 bmHeader->biSizeImage = 0;
244
245 // Create Device Independent Bitmap
246 hMemDC = CreateCompatibleDC(hPrnDC);
247 hBm = CreateDIBSection(hMemDC, pBMI, DIB_RGB_COLORS, &base, NULL, 0);
248 hBmOld = SelectObject(hMemDC, hBm);
249
250 // Release Memory
251 free(pBMI);
252 // free(bmHeader);
253
254 // further initialization
255#ifdef mydebug
256 pfd.cColorBits = GetDeviceCaps(hDC, BITSPIXEL);
257 nIndex = ChoosePixelFormat(hDC, &pfd);
258 if (nIndex == 0)
259 {
260 MessageBox(0,"ChoosePixelFormat failed", "Error", MB_OK | MB_ICONSTOP);
261 goto Error;
262 }
263
264
265 if (!SetPixelFormat(hDC, nIndex, &pfd))
266 {
267 MessageBox(0,"SetPixelFormat failed", "Error", MB_OK | MB_ICONSTOP);
268 goto Error;
269 }
270
271 // Create Rendering Context
272 hGLRC = wglCreateContext(hDC);
273
274 if (hGLRC == NULL)
275 {
276 MessageBox(0,"No Rendering Context", "Error", MB_OK | MB_ICONSTOP);
277 goto Error;
278 }
279 wglMakeCurrent(hDC,hGLRC);
280#else
281 pfd.cColorBits = GetDeviceCaps(hMemDC, BITSPIXEL);
282 nIndex = ChoosePixelFormat(hMemDC, &pfd);
283 if (nIndex == 0)
284 {
285 MessageBox(0,"ChoosePixelFormat failed", "Error", MB_OK | MB_ICONSTOP);
286 goto Error;
287 }
288
289
290 if (!SetPixelFormat(hMemDC, nIndex, &pfd))
291 {
292 MessageBox(0,"SetPixelFormat failed", "Error", MB_OK | MB_ICONSTOP);
293 goto Error;
294 }
295
296 // Create Rendering Context
297 hGLRC = wglCreateContext(hMemDC);
298
299 if (hGLRC == NULL)
300 {
301 MessageBox(0,"No Rendering Context", "Error", MB_OK | MB_ICONSTOP);
302 goto Error;
303 }
304 wglMakeCurrent(hMemDC,hGLRC);
305#endif
306
307 /* creating default font */
308 printerFontBase =
309 createFont( "", -MulDiv( defaultPntSize, GetDeviceCaps( hPrnDC, LOGPIXELSY ), defaultDelimeter ),
310 (int)FW_NORMAL, 0 );
311
312 // redraw to new Rendering Context
313 call_func_redraw_all_structs_begin (aview->WsId);
314
2de462d4
A
315 call_togl_setplane( aview ); /* update clipping planes */
316
7fd59977 317 if (background == 0)
318 {
319 glClearColor(1.0, 1.0, 1.0, 1.0);
320 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
321 }
322
323 if (anunderlayer->ptrLayer)
324 call_togl_redraw_layer2d (aview, anunderlayer);
325 call_func_redraw_all_structs_proc (aview->WsId);
326
327 if (anoverlayer->ptrLayer)
328 call_togl_redraw_layer2d (aview, anoverlayer);
329#ifdef RIC120302
330 call_subr_displayCB(aview,OCC_REDRAW_BITMAP);
331#endif
332
333 call_func_redraw_all_structs_end (aview->WsId, swap);
334
335 call_togl_redraw_immediat_mode (aview);
336#ifndef mydebug
337 /* Start printing of DIB ********************************************************/
338 di.cbSize = sizeof(DOCINFO);
339 di.lpszDocName = "Text";
340 di.lpszOutput = filename;
341
342 if (StartDoc(hPrnDC, &di) == SP_ERROR) goto Error;
343 if (StartPage(hPrnDC) <= 0) goto Error;
344
345 // calculate offset for centered printing
346 if (width < devWidth)
347 offsetx = (devWidth - width)/2;
348 if (height < devHeight)
349 offsety = (devHeight - height)/2;
350
351 BitBlt(hPrnDC, offsetx, offsety, width, height, hMemDC, 0, 0, SRCCOPY);
352
353 EndPage(hPrnDC);
354 EndDoc(hPrnDC);
355 /* releasing created font */
356 deleteFont( printerFontBase );
357 printerFontBase = 0;
358
359 /* End of printing section ******************************************************/
360#else
361 Sleep(5000);
362#endif
363
364Error:
365 /* Clean memory *****************************************************************/
366 if(hBm != NULL)
367 {
368 SelectObject(hMemDC, hBmOld);
369 DeleteObject(hBm);
370 DeleteObject(hBmOld);
371 }
372 wglMakeCurrent(NULL, NULL);
373 if (hGLRC != NULL)
374 {
375 wglDeleteContext(hGLRC);
376 }
377 if (hMemDC != NULL)
378 {
379 DeleteDC(hMemDC);
380 }
381
382 if (hDC != NULL)
383 {
384 ReleaseDC(w, hDC);
385 }
386 if (w != NULL)
387 {
388 DestroyWindow(w);
389 }
390
391 /* End of clean memory *****************************************************************/
392 }
393
394 /* End main routine ********************************************************************/
395 return;
396#endif /*WNT*/
397}