Integration of OCCT 6.5.0 from SVN
[occt.git] / src / Xw / Xw_get_rgbpixel.cxx
1
2 #include <Xw_Extension.h>
3
4         /* ifdef then trace on */
5 #ifdef TRACE
6 #define TRACE_GET_RGBPIXEL
7 #endif
8
9 /*
10    STATUS Xw_get_rgbpixel (aimage,x,y,r,g,b,npixel):
11    XW_EXT_IMAGEDATA             *aimage
12    int x,y                      Pixel position
13    float *r,*g,*b               return R,G,B Pixel values      
14    int *npixel                  return Pixel number filled with 
15                                        the same color index
16
17         Extract RGB pixels from an existing IMAGE created by Xw_get_image
18
19         returns ERROR if Extended Image is not defined
20                       or VISUAL Image type is not TRUECOLOR
21                       or Pixel position is wrong (Outside of image)
22         returns SUCCESS if successful
23
24 */
25
26 #ifdef XW_PROTOTYPE
27 XW_STATUS Xw_get_rgbpixel (void* aimage,
28                 int x,int y,float* r,float* g,float* b,int* npixel)
29 #else
30 XW_STATUS Xw_get_rgbpixel (aimage,x,y,r,g,b,npixel)
31 void *aimage ;
32 int x,y ;
33 float *r,*g,*b ;
34 int *npixel ;
35 #endif /*XW_PROTOTYPE*/
36 {
37 XW_EXT_IMAGEDATA *pimage = (XW_EXT_IMAGEDATA*) aimage ;
38 XW_EXT_COLORMAP *pcolormap = pimage->pcolormap ;
39 union {
40     char  *data ;
41     unsigned char *cdata ;
42     unsigned short *sdata ;
43     unsigned long  *ldata ;
44 } data ;
45 int i=0,fpixel,simage ;
46 unsigned long pixel=0 ;
47 XColor color ;
48 XImage *pximage;
49
50         if( !Xw_isdefine_image(pimage) ) {
51             /*ERROR*Bad EXT_IMAGEDATA Address*/
52             Xw_set_error(25,"Xw_get_rgbpixel",pimage) ;
53             return (XW_ERROR) ;
54         }
55
56         pximage = (_ZIMAGE) ? _ZIMAGE : _IIMAGE ;
57         fpixel = x*pximage->width + y ;
58         simage = pximage->height*pximage->width ;
59
60         if( x < 0 || y < 0 || (fpixel >= simage) ) {
61             /*ERROR*Bad PIXEL position*/
62             Xw_set_error(47,"Xw_get_rgbpixel",&simage) ;
63             return (XW_ERROR) ;
64         }
65
66         switch (pximage->bitmap_pad) {
67             case 8 :
68                 data.data = pximage->data + (fpixel) ; simage -= fpixel ;
69                 pixel = (unsigned long) *data.cdata ;
70                 for( i=1 ; i<simage ; i++ ) {
71                     data.cdata++ ; 
72                     if( *data.cdata != (unsigned char) pixel ) break ;
73                 }
74                 break ;
75             case 16 :
76                 data.data = pximage->data + (fpixel<<1) ; simage -= fpixel ;
77                 pixel = (unsigned long) *data.sdata ;
78                 for( i=1 ; i<simage ; i++ ) {
79                     data.sdata++ ; 
80                     if( *data.sdata != (unsigned short) pixel ) break ;
81                 }
82                 break ;
83             case 32 :
84                 data.data = pximage->data + (fpixel<<2) ; simage -= fpixel ;
85                 pixel = (unsigned long) *data.ldata ;
86                 for( i=1 ; i<simage ; i++ ) {
87                     data.ldata++ ; 
88                     if( *data.ldata != (unsigned long) pixel ) break ;
89                 }
90         }
91
92         *npixel = i ;
93         switch ( _CCLASS ) {
94             case TrueColor :
95                 { unsigned long mask = _CVISUAL->map_entries-1 ;
96                 unsigned long red,green,blue ;
97                 unsigned long rmask = _CVISUAL->red_mask ;
98                 unsigned long gmask = _CVISUAL->green_mask ;
99                 unsigned long bmask = _CVISUAL->blue_mask ;
100  
101                 red = pixel & rmask ;
102                 while ( !(rmask & 0x01) ) { rmask >>= 1; red >>= 1; }
103
104                 green = pixel & gmask ;
105                 while ( !(gmask & 0x01) ) { gmask >>= 1; green >>= 1; }
106
107                 blue = pixel & bmask ;
108                 while ( !(bmask & 0x01) ) { bmask >>= 1; blue >>= 1; }
109
110                 *r = (float)red/mask ;
111                 *g = (float)green/mask ;
112                 *b = (float)blue/mask ;
113                 } 
114                 break ;
115
116             case PseudoColor :
117                 color.pixel = pixel ;
118                 XQueryColor(_CDISPLAY,_CINFO.colormap,&color) ;
119                 *r = (float) color.red/0xFFFF ;
120                 *g = (float) color.green/0xFFFF ;
121                 *b = (float) color.blue/0xFFFF ;
122                 break ;
123             default :
124             /*ERROR*Unimplemented Visual Class*/
125                 Xw_set_error(5,"Xw_get_rgbpixel",&_CCLASS) ;
126                 return (XW_ERROR) ;
127         }
128
129 #ifdef  TRACE_GET_RGBPIXEL
130         printf (" Xw_get_rgbpixel(%lx,%d,%d,%f,%f,%f,%d)\n",
131                                         (long ) pimage,x,y,*r,*g,*b,*npixel) ;
132 #endif
133
134         return (XW_SUCCESS);
135 }