1 /***********************************************************************
12 HISTORIQUE DES MODIFICATIONS :
13 --------------------------------
14 xx-xx-xx : xxx ; Creation.
15 11-03-96 : FMN ; Correction warning compilation
16 01-04-96 : CAL ; Integration MINSK portage WNT
18 ************************************************************************/
20 /*----------------------------------------------------------------------*/
25 #include <OpenGl_tgl_all.hxx>
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>
36 /*----------------------------------------------------------------------*/
38 * Definition des types
64 IMPLEMENT_MEMORY_OPERATORS
66 typedef TGL_FILTERS* tgl_filters;
68 struct TGL_NAMESET_NODE_STRUCT
71 IMPLEMENT_MEMORY_OPERATORS
73 typedef TGL_NAMESET_NODE_STRUCT TGL_NAMESET_NODE;
74 typedef TGL_NAMESET_NODE_STRUCT* tgl_nameset_node;
77 /*----------------------------------------------------------------------*/
82 typedef NCollection_Stack<TGL_NAMESET_NODE*> NodeStack;
83 typedef NCollection_List<TGL_FILTERS*> FilterList;
85 static NodeStack _NodeStack;
86 static FilterList _FilterList;
89 /*----------------------------------------------------------------------*/
94 #define LIST_GROW_SIZE 25
95 #define FIL_STBL_SIZE 23
97 /*----------------------------------------------------------------------*/
100 num_comp( const void* a, const void* b )
102 return *( Tint* )a - *( Tint* )b;
105 /*----------------------------------------------------------------------*/
108 set_filter( Tint n, Tint *ls, Tint *num, Tint *siz, Tint **list )
113 size %= LIST_GROW_SIZE,
115 size *= LIST_GROW_SIZE;
118 //cmn_memreserve( *list, size, 0 );
119 *list = new Tint[size];
127 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)
128 *list = (Tint*)realloc( *list, size*sizeof(Tint) );
130 *list = cmn_resizemem<Tint>( *list, size );
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 );
145 /*----------------------------------------------------------------------*/
148 getfiltrec( Tint wsid )
153 if( TsmGetWSAttri( wsid, WSFilters, &data ) == TFailure )
156 filt = (tgl_filters)data.pdata;
159 filt = new TGL_FILTERS();
161 TsmSetWSAttri( wsid, WSFilters, &data );
167 /*----------------------------------------------------------------------*/
170 TglSetHighlFilter( Tint wsid, Tint in_num, Tint *in_lis,
171 Tint ex_num, Tint *ex_lis )
176 filter = getfiltrec( wsid );
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 );
188 /*----------------------------------------------------------------------*/
191 TglSetPickFilter( Tint wsid, Tint in_num, Tint *in_lis,
192 Tint ex_num, Tint *ex_lis )
197 filter = getfiltrec( wsid );
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 );
209 /*----------------------------------------------------------------------*/
212 TglSetInvisFilter( Tint wsid, Tint in_num, Tint *in_lis,
213 Tint ex_num, Tint *ex_lis )
218 filter = getfiltrec( wsid );
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 );
230 /*----------------------------------------------------------------------*/
233 TglNamesetPush( void )
235 tgl_nameset_node node;
237 node = new TGL_NAMESET_NODE();
238 if ( _NodeStack.IsEmpty() || !_NodeStack.Top() || !_NodeStack.Top()->ptr )
240 if( !name_tail || !name_tail->ptr )*/
242 node->ptr = 0, node->num = node->siz = 0;
244 else /* copy previous stack entry to new one */
246 Tint size = _NodeStack.Top()->siz;
248 node->ptr = new Tint[size];
253 node->num = _NodeStack.Top()->num;
254 memcpy( node->ptr, _NodeStack.Top()->ptr, node->num*sizeof(Tint) );
257 _NodeStack.Push( node );
262 /*----------------------------------------------------------------------*/
266 TglNamesetPop( void )
268 tgl_nameset_node node =
269 _NodeStack.ChangeTop();
274 /* Remove entries from sorted list*/
282 /*----------------------------------------------------------------------*/
285 TglNamesetAdd( Tint num, Tint *set )
287 if (_NodeStack.IsEmpty())
291 tgl_nameset_node name_tail = _NodeStack.ChangeTop();
294 size %= LIST_GROW_SIZE,
296 size *= LIST_GROW_SIZE;
298 if( !name_tail->ptr )
300 name_tail->ptr = new Tint[size];
301 if( !name_tail->ptr )
304 name_tail->siz = size;
306 else if( name_tail->siz < name_tail->num + num )
308 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)
309 name_tail->ptr = (Tint*)realloc( name_tail->ptr, size*sizeof(Tint) );
311 name_tail->ptr = cmn_resizemem<Tint>( name_tail->ptr, size );
313 if( !name_tail->ptr )
316 name_tail->siz = size;
318 memcpy( &name_tail->ptr[name_tail->num], set, num*sizeof(Tint) );
319 name_tail->num += num;
322 qsort( name_tail->ptr, name_tail->num, sizeof(Tint), num_comp );
323 name_tail->num = TelRemdupnames( name_tail->ptr, name_tail->num );
328 /*----------------------------------------------------------------------*/
331 TglNamesetRemove( Tint num, Tint *set )
333 Tint size, *ptr, *temp;
334 register Tint i, j, k, *prev;
336 if (_NodeStack.IsEmpty())
339 tgl_nameset_node name_tail = _NodeStack.ChangeTop();
341 if( !name_tail || !name_tail->ptr || !num )
344 ptr = new Tint[name_tail->siz];
348 size = num, size %= LIST_GROW_SIZE, size++, size *= LIST_GROW_SIZE;
349 temp = new Tint[size];
352 memcpy( temp, set, num*sizeof(Tint) );
355 qsort( temp, num, sizeof(Tint), num_comp );
356 num = TelRemdupnames( temp, num );
358 prev = name_tail->ptr;
362 if( prev[i] < temp[j] )
363 ptr[k++] = prev[i++];
364 else if( prev[i] > temp[j] )
366 else /* prev[i] == temp[j] */
368 if( i == name_tail->num )
372 while( i < name_tail->num )
373 ptr[k++] = prev[i++];
377 //cmn_freemem( temp );
379 //cmn_freemem( name_tail->ptr );
380 delete[] name_tail->ptr;
382 name_tail->ptr = ptr;
388 /*----------------------------------------------------------------------*/
391 find( Tint num1, Tint *array1, Tint num2, Tint *array2 )
397 if( array1[i] < array2[j] )
399 else if( array1[i] > array2[j] )
404 if( i == num1 || j == num2 )
410 /*----------------------------------------------------------------------*/
413 TglFilterNameset( Tint wsid, TFilterSet set )
416 if (_NodeStack.IsEmpty())
419 tgl_nameset_node name_tail = _NodeStack.ChangeTop();
421 filter = getfiltrec( wsid );
429 if( find( filter->invis_excl_num, filter->invis_excl_lis,
430 name_tail->num, name_tail->ptr ) )
433 if( find( filter->invis_incl_num, filter->invis_incl_lis,
434 name_tail->num, name_tail->ptr ) )
442 if( find( filter->highl_excl_num, filter->highl_excl_lis,
443 name_tail->num, name_tail->ptr ) )
446 if( find( filter->highl_incl_num, filter->highl_incl_lis,
447 name_tail->num, name_tail->ptr ) )
455 if( find( filter->pick_excl_num, filter->pick_excl_lis,
456 name_tail->num, name_tail->ptr ) )
459 if( find( filter->pick_incl_num, filter->pick_incl_lis,
460 name_tail->num, name_tail->ptr ) )
470 /*----------------------------------------------------------------------*/
473 TglDeleteFiltersForWS( Tint wsid )
478 TsmGetWSAttri( wsid, WSFilters, &key );
479 f = (tgl_filters)key.pdata;
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;
503 //cmn_stg_tbl_free( f );
508 /*----------------------------------------------------------------------*/