OCC22150 Problem with GetWindowLong function on 64-bit platform
[occt.git] / src / OpenGl / OpenGl_filters.cxx
CommitLineData
7fd59977 1/***********************************************************************
2
3FONCTION :
4----------
5File OpenGl_filters :
6
7
8REMARQUES:
9----------
10
11
12HISTORIQUE DES MODIFICATIONS :
13--------------------------------
14xx-xx-xx : xxx ; Creation.
1511-03-96 : FMN ; Correction warning compilation
1601-04-96 : CAL ; Integration MINSK portage WNT
17
18************************************************************************/
19
20/*----------------------------------------------------------------------*/
21/*
22* Includes
23*/
24
25#include <OpenGl_tgl_all.hxx>
26
27#include <stdlib.h>
28#include <stddef.h>
29
30#include <OpenGl_telem.hxx>
31#include <OpenGl_telem_util.hxx>
32#include <OpenGl_telem_filters.hxx>
33#include <OpenGl_tsm_ws.hxx>
34#include <OpenGl_Memory.hxx>
35
36/*----------------------------------------------------------------------*/
37/*
38* Definition des types
39*/
40
41struct TGL_FILTERS
42{
43 Tint invis_incl_num,
44 invis_excl_num,
45 pick_incl_num,
46 pick_excl_num,
47 highl_incl_num,
48 highl_excl_num;
49
50 Tint invis_incl_siz,
51 invis_excl_siz,
52 pick_incl_siz,
53 pick_excl_siz,
54 highl_incl_siz,
55 highl_excl_siz;
56
57 Tint *invis_incl_lis,
58 *invis_excl_lis,
59 *pick_incl_lis,
60 *pick_excl_lis,
61 *highl_incl_lis,
62 *highl_excl_lis;
63
64 IMPLEMENT_MEMORY_OPERATORS
65};
66typedef TGL_FILTERS* tgl_filters;
67
68struct TGL_NAMESET_NODE_STRUCT
69{
70 Tint num, siz, *ptr;
71 IMPLEMENT_MEMORY_OPERATORS
72};
73typedef TGL_NAMESET_NODE_STRUCT TGL_NAMESET_NODE;
74typedef TGL_NAMESET_NODE_STRUCT* tgl_nameset_node;
75
76
77/*----------------------------------------------------------------------*/
78/*
79* Variables locales
80*/
81
82typedef NCollection_Stack<TGL_NAMESET_NODE*> NodeStack;
83typedef NCollection_List<TGL_FILTERS*> FilterList;
84
85static NodeStack _NodeStack;
86static FilterList _FilterList;
87
88
89/*----------------------------------------------------------------------*/
90/*
91* Constantes
92*/
93
94#define LIST_GROW_SIZE 25
95#define FIL_STBL_SIZE 23
96
97/*----------------------------------------------------------------------*/
98
99static int
100num_comp( const void* a, const void* b )
101{
102 return *( Tint* )a - *( Tint* )b;
103}
104
105/*----------------------------------------------------------------------*/
106
107static TStatus
108set_filter( Tint n, Tint *ls, Tint *num, Tint *siz, Tint **list )
109{
110 Tint size;
111
112 size = n,
113 size %= LIST_GROW_SIZE,
114 size += 1,
115 size *= LIST_GROW_SIZE;
116 if( !*siz )
117 {
118 //cmn_memreserve( *list, size, 0 );
119 *list = new Tint[size];
120 if( !*list )
121 return TFailure;
122
123 *siz = size;
124 }
125 else if( *siz < n )
126 {
127#if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)
128 *list = (Tint*)realloc( *list, size*sizeof(Tint) );
129#else
130 *list = cmn_resizemem<Tint>( *list, size );
131#endif
132 if( !*list )
133 return TFailure;
134
135 *siz = size;
136 }
137 //cmn_memcpy<Tint>( *list, ls, n );
138 memcpy( *list, ls, n*sizeof(Tint) );
139 qsort( *list, n, sizeof(Tint), num_comp );
140 *num = TelRemdupnames( *list, n );
141
142 return TSuccess;
143}
144
145/*----------------------------------------------------------------------*/
146
147static tgl_filters
148getfiltrec( Tint wsid )
149{
150 tgl_filters filt;
151 CMN_KEY_DATA data;
152
153 if( TsmGetWSAttri( wsid, WSFilters, &data ) == TFailure )
154 return 0;
155
156 filt = (tgl_filters)data.pdata;
157 if( !filt )
158 {
159 filt = new TGL_FILTERS();
160 data.pdata = filt;
161 TsmSetWSAttri( wsid, WSFilters, &data );
162 }
163
164 return filt;
165}
166
167/*----------------------------------------------------------------------*/
168
169TStatus
170TglSetHighlFilter( Tint wsid, Tint in_num, Tint *in_lis,
171 Tint ex_num, Tint *ex_lis )
172{
173 TStatus ret;
174 tgl_filters filter;
175
176 filter = getfiltrec( wsid );
177 if( !filter )
178 return TFailure;
179
180 ret = set_filter( in_num, in_lis, &filter->highl_incl_num,
181 &filter->highl_incl_siz, &filter->highl_incl_lis );
182 if( ret == TSuccess )
183 ret = set_filter( ex_num, ex_lis, &filter->highl_excl_num,
184 &filter->highl_excl_siz, &filter->highl_excl_lis );
185 return ret;
186}
187
188/*----------------------------------------------------------------------*/
189
190TStatus
191TglSetPickFilter( Tint wsid, Tint in_num, Tint *in_lis,
192 Tint ex_num, Tint *ex_lis )
193{
194 TStatus ret;
195 tgl_filters filter;
196
197 filter = getfiltrec( wsid );
198 if( !filter )
199 return TFailure;
200
201 ret = set_filter( in_num, in_lis, &filter->pick_incl_num,
202 &filter->pick_incl_siz, &filter->pick_incl_lis );
203 if( ret == TSuccess )
204 ret = set_filter( ex_num, ex_lis, &filter->pick_excl_num,
205 &filter->pick_excl_siz, &filter->pick_excl_lis );
206 return ret;
207}
208
209/*----------------------------------------------------------------------*/
210
211TStatus
212TglSetInvisFilter( Tint wsid, Tint in_num, Tint *in_lis,
213 Tint ex_num, Tint *ex_lis )
214{
215 TStatus ret;
216 tgl_filters filter;
217
218 filter = getfiltrec( wsid );
219 if( !filter )
220 return TFailure;
221
222 ret = set_filter( in_num, in_lis, &filter->invis_incl_num,
223 &filter->invis_incl_siz, &filter->invis_incl_lis );
224 if( ret == TSuccess )
225 ret = set_filter( ex_num, ex_lis, &filter->invis_excl_num,
226 &filter->invis_excl_siz, &filter->invis_excl_lis );
227 return ret;
228}
229
230/*----------------------------------------------------------------------*/
231
232TStatus
233TglNamesetPush( void )
234{
235 tgl_nameset_node node;
236
237 node = new TGL_NAMESET_NODE();
238 if ( _NodeStack.IsEmpty() || !_NodeStack.Top() || !_NodeStack.Top()->ptr )
239 /* abd
240 if( !name_tail || !name_tail->ptr )*/
241 {
242 node->ptr = 0, node->num = node->siz = 0;
243 }
244 else /* copy previous stack entry to new one */
245 {
246 Tint size = _NodeStack.Top()->siz;
247
248 node->ptr = new Tint[size];
249 if( !node->ptr )
250 return TFailure;
251
252 node->siz = size;
253 node->num = _NodeStack.Top()->num;
254 memcpy( node->ptr, _NodeStack.Top()->ptr, node->num*sizeof(Tint) );
255 }
256
257 _NodeStack.Push( node );
258
259 return TSuccess;
260}
261
262/*----------------------------------------------------------------------*/
263
264
265TStatus
266TglNamesetPop( void )
267{
268 tgl_nameset_node node =
269 _NodeStack.ChangeTop();
270
271 _NodeStack.Pop();
272 if( node->ptr )
273 {
274 /* Remove entries from sorted list*/
275 delete[] node->ptr;
276 }
277 delete node;
278
279 return TSuccess;
280}
281
282/*----------------------------------------------------------------------*/
283
284TStatus
285TglNamesetAdd( Tint num, Tint *set )
286{
287 if (_NodeStack.IsEmpty())
288 return TFailure;
289
290 Tint size;
291 tgl_nameset_node name_tail = _NodeStack.ChangeTop();
292
293 size = num,
294 size %= LIST_GROW_SIZE,
295 size++,
296 size *= LIST_GROW_SIZE;
297
298 if( !name_tail->ptr )
299 {
300 name_tail->ptr = new Tint[size];
301 if( !name_tail->ptr )
302 return TFailure;
303
304 name_tail->siz = size;
305 }
306 else if( name_tail->siz < name_tail->num + num )
307 {
308#if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)
309 name_tail->ptr = (Tint*)realloc( name_tail->ptr, size*sizeof(Tint) );
310#else
311 name_tail->ptr = cmn_resizemem<Tint>( name_tail->ptr, size );
312#endif
313 if( !name_tail->ptr )
314 return TFailure;
315
316 name_tail->siz = size;
317 }
318 memcpy( &name_tail->ptr[name_tail->num], set, num*sizeof(Tint) );
319 name_tail->num += num;
320
321 /* sort new set */
322 qsort( name_tail->ptr, name_tail->num, sizeof(Tint), num_comp );
323 name_tail->num = TelRemdupnames( name_tail->ptr, name_tail->num );
324
325 return TSuccess;
326}
327
328/*----------------------------------------------------------------------*/
329
330TStatus
331TglNamesetRemove( Tint num, Tint *set )
332{
333 Tint size, *ptr, *temp;
334 register Tint i, j, k, *prev;
335
336 if (_NodeStack.IsEmpty())
337 return TFailure;
338
339 tgl_nameset_node name_tail = _NodeStack.ChangeTop();
340
341 if( !name_tail || !name_tail->ptr || !num )
342 return TFailure;
343
344 ptr = new Tint[name_tail->siz];
345 if( !ptr )
346 return TFailure;
347
348 size = num, size %= LIST_GROW_SIZE, size++, size *= LIST_GROW_SIZE;
349 temp = new Tint[size];
350 if( !temp )
351 return TFailure;
352 memcpy( temp, set, num*sizeof(Tint) );
353
354 /* sort new set */
355 qsort( temp, num, sizeof(Tint), num_comp );
356 num = TelRemdupnames( temp, num );
357
358 prev = name_tail->ptr;
359 i = j = k = 0;
360 while(1)
361 {
362 if( prev[i] < temp[j] )
363 ptr[k++] = prev[i++];
364 else if( prev[i] > temp[j] )
365 j++;
366 else /* prev[i] == temp[j] */
367 i++, j++;
368 if( i == name_tail->num )
369 break;
370 if( j == num )
371 {
372 while( i < name_tail->num )
373 ptr[k++] = prev[i++];
374 break;
375 }
376 }
377 //cmn_freemem( temp );
378 delete[] temp;
379 //cmn_freemem( name_tail->ptr );
380 delete[] name_tail->ptr;
381
382 name_tail->ptr = ptr;
383 name_tail->num = k;
384
385 return TSuccess;
386}
387
388/*----------------------------------------------------------------------*/
389
390static Tint
391find( Tint num1, Tint *array1, Tint num2, Tint *array2 )
392{
393 Tint i=0, j=0;
394
395 while(num1 && num2)
396 {
397 if( array1[i] < array2[j] )
398 i++;
399 else if( array1[i] > array2[j] )
400 j++;
401 else
402 return 1;
403
404 if( i == num1 || j == num2 )
405 return 0;
406 }
407 return 0;
408}
409
410/*----------------------------------------------------------------------*/
411
412TStatus
413TglFilterNameset( Tint wsid, TFilterSet set )
414{
415 tgl_filters filter;
416 if (_NodeStack.IsEmpty())
417 return TFailure;
418
419 tgl_nameset_node name_tail = _NodeStack.ChangeTop();
420
421 filter = getfiltrec( wsid );
422 if( !filter )
423 return TFailure;
424
425 switch( set )
426 {
427 case InvisFilter:
428 {
429 if( find( filter->invis_excl_num, filter->invis_excl_lis,
430 name_tail->num, name_tail->ptr ) )
431 return TFailure;
432
433 if( find( filter->invis_incl_num, filter->invis_incl_lis,
434 name_tail->num, name_tail->ptr ) )
435 return TSuccess;
436
437 break;
438 }
439
440 case HighlFilter:
441 {
442 if( find( filter->highl_excl_num, filter->highl_excl_lis,
443 name_tail->num, name_tail->ptr ) )
444 return TFailure;
445
446 if( find( filter->highl_incl_num, filter->highl_incl_lis,
447 name_tail->num, name_tail->ptr ) )
448 return TSuccess;
449
450 break;
451 }
452
453 case PickFilter:
454 {
455 if( find( filter->pick_excl_num, filter->pick_excl_lis,
456 name_tail->num, name_tail->ptr ) )
457 return TFailure;
458
459 if( find( filter->pick_incl_num, filter->pick_incl_lis,
460 name_tail->num, name_tail->ptr ) )
461 return TSuccess;
462
463 break;
464 }
465 }
466
467 return TFailure;
468}
469
470/*----------------------------------------------------------------------*/
471
472TStatus
473TglDeleteFiltersForWS( Tint wsid )
474{
475 CMN_KEY_DATA key;
476 tgl_filters f;
477
478 TsmGetWSAttri( wsid, WSFilters, &key );
479 f = (tgl_filters)key.pdata;
480
481 if( !f )
482 return TSuccess;
483
484 if( f->invis_incl_siz )
485 //cmn_freemem( f->invis_incl_lis );
486 delete[] f->invis_incl_lis;
487 if( f->pick_incl_siz )
488 //cmn_freemem( f->pick_incl_lis );
489 delete[] f->pick_incl_lis;
490 if( f->highl_incl_siz )
491 //cmn_freemem( f->highl_incl_lis );
492 delete[] f->highl_incl_lis;
493 if( f->invis_excl_siz )
494 //cmn_freemem( f->invis_excl_lis );
495 delete[] f->invis_excl_lis;
496 if( f->pick_excl_siz )
497 //cmn_freemem( f->pick_excl_lis );
498 delete[] f->pick_excl_lis;
499 if( f->highl_excl_siz )
500 //cmn_freemem( f->highl_excl_lis );
501 delete[] f->highl_excl_lis;
502
503 //cmn_stg_tbl_free( f );
504 delete f;
505 return TSuccess;
506}
507
508/*----------------------------------------------------------------------*/