0025133: TKOpenGl - Crash on closing a view containing presentations with capping
[occt.git] / src / OpenGl / OpenGl_LineAttributes.cxx
CommitLineData
b311480e 1// Created on: 2011-10-25
2// Created by: Sergey ZERCHANINOV
973c2be1 3// Copyright (c) 2011-2014 OPEN CASCADE SAS
b311480e 4//
973c2be1 5// This file is part of Open CASCADE Technology software library.
b311480e 6//
d5f74e42 7// This library is free software; you can redistribute it and/or modify it under
8// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 9// by the Free Software Foundation, with special exception defined in the file
10// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11// distribution for complete text of the license and disclaimer of any warranty.
b311480e 12//
973c2be1 13// Alternatively, this file may be used under the terms of Open CASCADE
14// commercial license or contractual agreement.
2166f0fa 15
5f8b738e 16#include <OpenGl_GlCore11.hxx>
17
73192b37 18#include <OpenGl_LineAttributes.hxx>
19#include <OpenGl_Context.hxx>
2166f0fa 20
498ce577 21#ifdef HAVE_CONFIG_H
e276548b 22 #include <config.h>
498ce577 23#endif
24
2166f0fa 25#ifdef HAVE_GL2PS
5f8b738e 26 #include <gl2ps.h>
2166f0fa
SK
27#endif
28
73192b37 29#define DOT_LS 0xCCCC
30#define DASH_DOT_LS 0xFF18
31#define DASH_LS 0xFFC0
32#define DASH_DDOT_LS 0xFF24
2166f0fa
SK
33
34static const unsigned int myInteriors[TEL_HS_USER_DEF_START][32] =
35{
36 //TEL_HS_SOLID
37 {
38 0xFFFFFFFF,
39 0xFFFFFFFF,
40 0xFFFFFFFF,
41 0xFFFFFFFF,
42 0xFFFFFFFF,
43 0xFFFFFFFF,
44 0xFFFFFFFF,
45 0xFFFFFFFF,
46 0xFFFFFFFF,
47 0xFFFFFFFF,
48 0xFFFFFFFF,
49 0xFFFFFFFF,
50 0xFFFFFFFF,
51 0xFFFFFFFF,
52 0xFFFFFFFF,
53 0xFFFFFFFF,
54 0xFFFFFFFF,
55 0xFFFFFFFF,
56 0xFFFFFFFF,
57 0xFFFFFFFF,
58 0xFFFFFFFF,
59 0xFFFFFFFF,
60 0xFFFFFFFF,
61 0xFFFFFFFF,
62 0xFFFFFFFF,
63 0xFFFFFFFF,
64 0xFFFFFFFF,
65 0xFFFFFFFF,
66 0xFFFFFFFF,
67 0xFFFFFFFF,
68 0xFFFFFFFF,
69 0xFFFFFFFF
70 },
71 //TEL_HS_CROSS
72 {
73 0xFFFFFFFF,
74 0xBBBBBBBB,
75 0xEEEEEEEE,
76 0xBBBBBBBB,
77 0xEEEEEEEE,
78 0xBBBBBBBB,
79 0xEEEEEEEE,
80 0xBBBBBBBB,
81 0xEEEEEEEE,
82 0xBBBBBBBB,
83 0xEEEEEEEE,
84 0xBBBBBBBB,
85 0xEEEEEEEE,
86 0xBBBBBBBB,
87 0xEEEEEEEE,
88 0xBBBBBBBB,
89 0xEEEEEEEE,
90 0xBBBBBBBB,
91 0xEEEEEEEE,
92 0xBBBBBBBB,
93 0xEEEEEEEE,
94 0xBBBBBBBB,
95 0xEEEEEEEE,
96 0xBBBBBBBB,
97 0xEEEEEEEE,
98 0xBBBBBBBB,
99 0xEEEEEEEE,
100 0xBBBBBBBB,
101 0xEEEEEEEE,
102 0xBBBBBBBB,
103 0xEEEEEEEE,
104 0xBBBBBBBB
105 },
106 //TEL_HS_CROSS_SPARSE
107 {
108 0x81818181,
109 0x24242424,
110 0x18181818,
111 0x42424242,
112 0x81818181,
113 0x24242424,
114 0x18181818,
115 0x42424242,
116 0x81818181,
117 0x24242424,
118 0x18181818,
119 0x42424242,
120 0x81818181,
121 0x24242424,
122 0x18181818,
123 0x42424242,
124 0x81818181,
125 0x24242424,
126 0x18181818,
127 0x42424242,
128 0x81818181,
129 0x24242424,
130 0x18181818,
131 0x42424242,
132 0x81818181,
133 0x24242424,
134 0x18181818,
135 0x42424242,
136 0x81818181,
137 0x24242424,
138 0x18181818,
139 0x42424242
140 },
141 //TEL_HS_GRID
142 {
143 0xFFFFFFFF,
144 0x88888888,
145 0xFFFFFFFF,
146 0x88888888,
147 0xFFFFFFFF,
148 0x88888888,
149 0xFFFFFFFF,
150 0x88888888,
151 0xFFFFFFFF,
152 0x88888888,
153 0xFFFFFFFF,
154 0x88888888,
155 0xFFFFFFFF,
156 0x88888888,
157 0xFFFFFFFF,
158 0x88888888,
159 0xFFFFFFFF,
160 0x88888888,
161 0xFFFFFFFF,
162 0x88888888,
163 0xFFFFFFFF,
164 0x88888888,
165 0xFFFFFFFF,
166 0x88888888,
167 0xFFFFFFFF,
168 0x88888888,
169 0xFFFFFFFF,
170 0x88888888,
171 0xFFFFFFFF,
172 0x88888888,
173 0xFFFFFFFF,
174 0x88888888
175 },
176 //TEL_HS_GRID_SPARSE
177 {
178 0xFFFFFFFF,
179 0x80808080,
180 0x80808080,
181 0x80808080,
182 0xFFFFFFFF,
183 0x80808080,
184 0x80808080,
185 0x80808080,
186 0xFFFFFFFF,
187 0x80808080,
188 0x80808080,
189 0x80808080,
190 0xFFFFFFFF,
191 0x80808080,
192 0x80808080,
193 0x80808080,
194 0xFFFFFFFF,
195 0x80808080,
196 0x80808080,
197 0x80808080,
198 0xFFFFFFFF,
199 0x80808080,
200 0x80808080,
201 0x80808080,
202 0xFFFFFFFF,
203 0x80808080,
204 0x80808080,
205 0x80808080,
206 0xFFFFFFFF,
207 0x80808080,
208 0x80808080,
209 0x80808080
210 },
211 //TEL_HS_DIAG_45
212 {
213 0x88888888,
214 0x22222222,
215 0x88888888,
216 0x22222222,
217 0x88888888,
218 0x22222222,
219 0x88888888,
220 0x22222222,
221 0x88888888,
222 0x22222222,
223 0x88888888,
224 0x22222222,
225 0x88888888,
226 0x22222222,
227 0x88888888,
228 0x22222222,
229 0x88888888,
230 0x22222222,
231 0x88888888,
232 0x22222222,
233 0x88888888,
234 0x22222222,
235 0x88888888,
236 0x22222222,
237 0x88888888,
238 0x22222222,
239 0x88888888,
240 0x22222222,
241 0x88888888,
242 0x22222222,
243 0x88888888,
244 0x22222222
245 },
246 //TEL_HS_DIAG_135
247 {
248 0x11111111,
249 0x44444444,
250 0x11111111,
251 0x44444444,
252 0x11111111,
253 0x44444444,
254 0x11111111,
255 0x44444444,
256 0x11111111,
257 0x44444444,
258 0x11111111,
259 0x44444444,
260 0x11111111,
261 0x44444444,
262 0x11111111,
263 0x44444444,
264 0x11111111,
265 0x44444444,
266 0x11111111,
267 0x44444444,
268 0x11111111,
269 0x44444444,
270 0x11111111,
271 0x44444444,
272 0x11111111,
273 0x44444444,
274 0x11111111,
275 0x44444444,
276 0x11111111,
277 0x44444444,
278 0x11111111,
279 0x44444444
280 },
281 //TEL_HS_HORIZONTAL
282 {
283 0xFFFFFFFF,
284 0x00000000,
285 0xFFFFFFFF,
286 0x00000000,
287 0xFFFFFFFF,
288 0x00000000,
289 0xFFFFFFFF,
290 0x00000000,
291 0xFFFFFFFF,
292 0x00000000,
293 0xFFFFFFFF,
294 0x00000000,
295 0xFFFFFFFF,
296 0x00000000,
297 0xFFFFFFFF,
298 0x00000000,
299 0xFFFFFFFF,
300 0x00000000,
301 0xFFFFFFFF,
302 0x00000000,
303 0xFFFFFFFF,
304 0x00000000,
305 0xFFFFFFFF,
306 0x00000000,
307 0xFFFFFFFF,
308 0x00000000,
309 0xFFFFFFFF,
310 0x00000000,
311 0xFFFFFFFF,
312 0x00000000,
313 0xFFFFFFFF,
314 0x00000000
315 },
316 //TEL_HS_VERTICAL
317 {
318 0x11111111,
319 0x11111111,
320 0x11111111,
321 0x11111111,
322 0x11111111,
323 0x11111111,
324 0x11111111,
325 0x11111111,
326 0x11111111,
327 0x11111111,
328 0x11111111,
329 0x11111111,
330 0x11111111,
331 0x11111111,
332 0x11111111,
333 0x11111111,
334 0x11111111,
335 0x11111111,
336 0x11111111,
337 0x11111111,
338 0x11111111,
339 0x11111111,
340 0x11111111,
341 0x11111111,
342 0x11111111,
343 0x11111111,
344 0x11111111,
345 0x11111111,
346 0x11111111,
347 0x11111111,
348 0x11111111,
349 0x11111111
350 },
351 //TEL_HS_DIAG_45_SPARSE
352 {
353 0x80808080,
354 0x20202020,
355 0x08080808,
356 0x02020202,
357 0x80808080,
358 0x20202020,
359 0x08080808,
360 0x02020202,
361 0x80808080,
362 0x20202020,
363 0x08080808,
364 0x02020202,
365 0x80808080,
366 0x20202020,
367 0x08080808,
368 0x02020202,
369 0x80808080,
370 0x20202020,
371 0x08080808,
372 0x02020202,
373 0x80808080,
374 0x20202020,
375 0x08080808,
376 0x02020202,
377 0x80808080,
378 0x20202020,
379 0x08080808,
380 0x02020202,
381 0x80808080,
382 0x20202020,
383 0x08080808,
384 0x02020202
385 },
386 //TEL_HS_DIAG_135_SPARSE
387 {
388 0x01010101,
389 0x04040404,
390 0x10101010,
391 0x40404040,
392 0x01010101,
393 0x04040404,
394 0x10101010,
395 0x40404040,
396 0x01010101,
397 0x04040404,
398 0x10101010,
399 0x40404040,
400 0x01010101,
401 0x04040404,
402 0x10101010,
403 0x40404040,
404 0x01010101,
405 0x04040404,
406 0x10101010,
407 0x40404040,
408 0x01010101,
409 0x04040404,
410 0x10101010,
411 0x40404040,
412 0x01010101,
413 0x04040404,
414 0x10101010,
415 0x40404040,
416 0x01010101,
417 0x04040404,
418 0x10101010,
419 0x40404040
420 },
421 //TEL_HS_HORIZONTAL_SPARSE
422 {
423 0xFFFFFFFF,
424 0x00000000,
425 0x00000000,
426 0x00000000,
427 0xFFFFFFFF,
428 0x00000000,
429 0x00000000,
430 0x00000000,
431 0xFFFFFFFF,
432 0x00000000,
433 0x00000000,
434 0x00000000,
435 0xFFFFFFFF,
436 0x00000000,
437 0x00000000,
438 0x00000000,
439 0xFFFFFFFF,
440 0x00000000,
441 0x00000000,
442 0x00000000,
443 0xFFFFFFFF,
444 0x00000000,
445 0x00000000,
446 0x00000000,
447 0xFFFFFFFF,
448 0x00000000,
449 0x00000000,
450 0x00000000,
451 0xFFFFFFFF,
452 0x00000000,
453 0x00000000,
454 0x00000000
455 },
456 //TEL_HS_VERTICAL_SPARSE
457 {
458 0x10101010,
459 0x10101010,
460 0x10101010,
461 0x10101010,
462 0x10101010,
463 0x10101010,
464 0x10101010,
465 0x10101010,
466 0x10101010,
467 0x10101010,
468 0x10101010,
469 0x10101010,
470 0x10101010,
471 0x10101010,
472 0x10101010,
473 0x10101010,
474 0x10101010,
475 0x10101010,
476 0x10101010,
477 0x10101010,
478 0x10101010,
479 0x10101010,
480 0x10101010,
481 0x10101010,
482 0x10101010,
483 0x10101010,
484 0x10101010,
485 0x10101010,
486 0x10101010,
487 0x10101010,
488 0x10101010,
489 0x10101010
490 }
491};
492
73192b37 493IMPLEMENT_STANDARD_HANDLE (OpenGl_LineAttributes, OpenGl_Resource)
494IMPLEMENT_STANDARD_RTTIEXT(OpenGl_LineAttributes, OpenGl_Resource)
2166f0fa 495
73192b37 496// =======================================================================
497// function : OpenGl_LineAttributes
498// purpose :
499// =======================================================================
500OpenGl_LineAttributes::OpenGl_LineAttributes()
501: myLinestyleBase(0),
502 myPatternBase(0)
2166f0fa 503{
73192b37 504 //
505}
506
507// =======================================================================
508// function : ~OpenGl_LineAttributes
509// purpose :
510// =======================================================================
511OpenGl_LineAttributes::~OpenGl_LineAttributes()
512{
513 Release (NULL);
514}
515
516// =======================================================================
517// function : Release
518// purpose :
519// =======================================================================
10b9c7df 520void OpenGl_LineAttributes::Release (OpenGl_Context* theGlCtx)
73192b37 521{
522 // Delete line styles
523 if (myLinestyleBase != 0)
524 {
525 if (theGlCtx->IsValid())
526 {
527 glDeleteLists ((GLuint )myLinestyleBase, 5);
528 }
529 myLinestyleBase = 0;
530 }
531 // Delete surface patterns
532 if (myPatternBase != 0)
533 {
534 if (theGlCtx->IsValid())
535 {
536 glDeleteLists ((GLuint )myPatternBase, TEL_HS_USER_DEF_START);
537 }
538 myPatternBase = 0;
539 }
540}
2166f0fa 541
73192b37 542// =======================================================================
543// function : Init
544// purpose :
545// =======================================================================
546void OpenGl_LineAttributes::Init (const Handle(OpenGl_Context)& theGlCtx)
547{
548 // Return if already initialized
549 if (myLinestyleBase != 0)
550 {
551 return;
552 }
2166f0fa 553
73192b37 554 myLinestyleBase = theGlCtx->core11->glGenLists (5);
2166f0fa 555
73192b37 556 // Line
557 glNewList ((GLuint )myLinestyleBase + (GLuint )Aspect_TOL_DASH, GL_COMPILE);
558 glLineStipple (1, DASH_LS);
2166f0fa
SK
559 glEndList();
560
73192b37 561 glNewList ((GLuint )myLinestyleBase + (GLuint )Aspect_TOL_DOT, GL_COMPILE);
562 glLineStipple (1, DOT_LS);
2166f0fa
SK
563 glEndList();
564
73192b37 565 glNewList ((GLuint )myLinestyleBase + (GLuint )Aspect_TOL_DOTDASH, GL_COMPILE);
566 glLineStipple (1, DASH_DOT_LS);
2166f0fa
SK
567 glEndList();
568
73192b37 569 glNewList ((GLuint )myLinestyleBase + (GLuint )Aspect_TOL_USERDEFINED, GL_COMPILE);
570 glLineStipple (1, DASH_DDOT_LS);
2166f0fa
SK
571 glEndList();
572
73192b37 573 // GL_POLYGON_STIPPLE need 32x32 stipple patterns
574 const int nbi = sizeof(myInteriors) / (32 * sizeof(unsigned int));
2166f0fa 575 myPatternBase = glGenLists(TEL_HS_USER_DEF_START);
73192b37 576 for (int i = 1; i < TEL_HS_USER_DEF_START; i++)
2166f0fa 577 {
73192b37 578 glNewList ((GLuint )myPatternBase + i, GL_COMPILE);
579 glPolygonStipple ((const GLubyte* )myInteriors[i < nbi ? i : 0]);
2166f0fa
SK
580 glEndList();
581 }
2166f0fa
SK
582}
583
73192b37 584// =======================================================================
585// function : SetTypeOfLine
586// purpose :
587// =======================================================================
588void OpenGl_LineAttributes::SetTypeOfLine (const Aspect_TypeOfLine theType) const
2166f0fa 589{
73192b37 590 if (theType != Aspect_TOL_SOLID)
2166f0fa 591 {
73192b37 592 glCallList ((GLuint )myLinestyleBase + (GLuint )theType);
593 glEnable (GL_LINE_STIPPLE);
594 #ifdef HAVE_GL2PS
595 gl2psEnable (GL2PS_LINE_STIPPLE);
596 #endif
2166f0fa
SK
597 }
598 else
599 {
73192b37 600 glDisable (GL_LINE_STIPPLE);
601 #ifdef HAVE_GL2PS
602 gl2psDisable (GL2PS_LINE_STIPPLE);
603 #endif
2166f0fa
SK
604 }
605}
606
73192b37 607// =======================================================================
608// function : SetTypeOfHatch
609// purpose :
610// =======================================================================
611void OpenGl_LineAttributes::SetTypeOfHatch (const int theType) const
2166f0fa 612{
73192b37 613 if (theType != 0)
2166f0fa 614 {
73192b37 615 glCallList ((GLuint )myPatternBase + (GLuint )theType);
616 glEnable (GL_POLYGON_STIPPLE);
2166f0fa
SK
617 }
618 else
73192b37 619 glDisable (GL_POLYGON_STIPPLE);
2166f0fa 620}