Integration of OCCT 6.5.0 from SVN
[occt.git] / src / Xw / Xw_set_marker_attrib.cxx
1
2 #include <Xw_Extension.h>
3
4         /* ifdef then trace on */
5 #ifdef TRACE
6 #define TRACE_SET_MARKER_ATTRIB
7 #endif
8
9 /*
10    XW_ATTRIB Xw_set_marker_attrib (awindow,color,type,width,mode):
11    XW_EXT_WINDOW *awindow
12    int color ;          Color index to used 0 >= x < MAXCOLOR
13    int type ;           Type can be TRUE if marker must be filled with the
14                                         set_poly_attrib attributes 
15    int width ;          Width index to used 0 >= x < MAXWIDTH
16    DRAWMODE mode ;      Draw Mode must be one of DRAWMODE enum 
17
18         Set Marker Color,Type and Marker current graphic attrib .
19
20         Returns Selected Marker Attribute Index if successful
21         Returns 0 if Bad Color,Type or Marker Index
22
23 */
24
25 #ifdef XW_PROTOTYPE
26 XW_ATTRIB Xw_set_marker_attrib (void *awindow,int color,int type,int width,XW_DRAWMODE mode)
27 #else
28 XW_ATTRIB Xw_set_marker_attrib (awindow,color,type,width,mode)
29 void *awindow;
30 int color,type ;
31 int width ;
32 XW_DRAWMODE mode ;
33 #endif /*XW_PROTOTYPE*/
34 {
35 XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow;
36 XGCValues gc_values ;
37 XW_ATTRIB code ;
38 int i,j,k,function,mask = 0;
39 unsigned long planemask,hcolor ;
40
41         if( !Xw_isdefine_window(pwindow) ) {
42             /*ERROR*Bad EXT_WINDOW Address*/
43             Xw_set_error(24,"Xw_set_marker_attrib",pwindow) ;
44             return (0) ;
45         }
46
47         if( _BINDEX > 0 ) return (1) ;
48
49         if ( !Xw_isdefine_color(_COLORMAP,color) ) {
50             /*ERROR*Bad Defined Color*/
51             Xw_set_error(41,"Xw_set_marker_attrib",&color) ;
52             return (0) ;
53         }
54
55         if ( !Xw_isdefine_width(_WIDTHMAP,width) ) {
56             /*WARNING*Bad Defined Width*/
57             Xw_set_error(52,"Xw_set_marker_attrib",&width) ;
58             width = 0 ;
59         }
60
61         if( !_WIDTHMAP || (_WIDTHMAP->widths[width] <= 1) ) width = 0 ;
62  
63         code = QGCODE(color,type,width,mode) ;
64         if( code == pwindow->qgmark[pwindow->markindex].code ) {
65                                 /* The last index computed is already set*/
66             pwindow->qgmark[pwindow->markindex].count++ ;
67             return (pwindow->markindex+1) ;
68         }
69
70         for( i=j=0,k=MAXQG ; i<MAXQG ; i++ ) {
71              if( code == pwindow->qgmark[i].code ) k = i ;
72              if( pwindow->qgmark[i].count < pwindow->qgmark[j].count ) j = i;
73         }
74
75         if( k < MAXQG ) {
76                                         /* A GC index already exist,use it */
77             pwindow->markindex = k ;
78             pwindow->qgmark[k].count++ ;
79             return (k+1) ;      
80         }
81
82         pwindow->markindex = j ;
83         pwindow->qgmark[j].count = 1 ;
84
85         Xw_get_color_attrib(pwindow,mode,color,&hcolor,&function,&planemask);
86         if( mode != QGMODE(pwindow->qgmark[j].code) ) {
87             mask |= GCFunction | GCPlaneMask | GCForeground ;
88             gc_values.function = function ;
89             gc_values.plane_mask = planemask ;
90             gc_values.foreground = hcolor ;
91         } else if( color != QGCOLOR(pwindow->qgmark[j].code) ) {
92             mask |= GCForeground;
93             gc_values.foreground = hcolor ;
94         }
95
96         if( width != QGWIDTH(pwindow->qgmark[j].code) ) {
97             mask |= GCLineWidth ;
98             if( width > 0 ) {
99                 gc_values.line_width = _WIDTHMAP->widths[width] ;
100             } else {   
101                 gc_values.line_width = 0 ;
102             }
103         }
104  
105         k = j+1 ;
106
107         if( mask ) {
108             XChangeGC(_DISPLAY,pwindow->qgmark[j].gc,mask,&gc_values) ;
109             pwindow->qgmark[j].code = code ; 
110
111 #ifdef  TRACE_SET_MARKER_ATTRIB
112 if( Xw_get_trace() > 1 ) {
113     printf(" %d = Xw_set_marker_attrib(%lx,%d,%d,%d,%d)\n",
114                                 k,(long ) pwindow,color,type,width,mode) ;
115 }
116 #endif
117         }
118
119         return (k) ;    
120 }