2 #include <Xw_Extension.h>
4 /* ifdef then trace on */
6 #define TRACE_GET_RGBPIXEL
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
17 Extract RGB pixels from an existing IMAGE created by Xw_get_image
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
27 XW_STATUS Xw_get_rgbpixel (void* aimage,
28 int x,int y,float* r,float* g,float* b,int* npixel)
30 XW_STATUS Xw_get_rgbpixel (aimage,x,y,r,g,b,npixel)
35 #endif /*XW_PROTOTYPE*/
37 XW_EXT_IMAGEDATA *pimage = (XW_EXT_IMAGEDATA*) aimage ;
38 XW_EXT_COLORMAP *pcolormap = pimage->pcolormap ;
41 unsigned char *cdata ;
42 unsigned short *sdata ;
43 unsigned long *ldata ;
45 int i=0,fpixel,simage ;
46 unsigned long pixel=0 ;
50 if( !Xw_isdefine_image(pimage) ) {
51 /*ERROR*Bad EXT_IMAGEDATA Address*/
52 Xw_set_error(25,"Xw_get_rgbpixel",pimage) ;
56 pximage = (_ZIMAGE) ? _ZIMAGE : _IIMAGE ;
57 fpixel = x*pximage->width + y ;
58 simage = pximage->height*pximage->width ;
60 if( x < 0 || y < 0 || (fpixel >= simage) ) {
61 /*ERROR*Bad PIXEL position*/
62 Xw_set_error(47,"Xw_get_rgbpixel",&simage) ;
66 switch (pximage->bitmap_pad) {
68 data.data = pximage->data + (fpixel) ; simage -= fpixel ;
69 pixel = (unsigned long) *data.cdata ;
70 for( i=1 ; i<simage ; i++ ) {
72 if( *data.cdata != (unsigned char) pixel ) break ;
76 data.data = pximage->data + (fpixel<<1) ; simage -= fpixel ;
77 pixel = (unsigned long) *data.sdata ;
78 for( i=1 ; i<simage ; i++ ) {
80 if( *data.sdata != (unsigned short) pixel ) break ;
84 data.data = pximage->data + (fpixel<<2) ; simage -= fpixel ;
85 pixel = (unsigned long) *data.ldata ;
86 for( i=1 ; i<simage ; i++ ) {
88 if( *data.ldata != (unsigned long) pixel ) break ;
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 ;
101 red = pixel & rmask ;
102 while ( !(rmask & 0x01) ) { rmask >>= 1; red >>= 1; }
104 green = pixel & gmask ;
105 while ( !(gmask & 0x01) ) { gmask >>= 1; green >>= 1; }
107 blue = pixel & bmask ;
108 while ( !(bmask & 0x01) ) { bmask >>= 1; blue >>= 1; }
110 *r = (float)red/mask ;
111 *g = (float)green/mask ;
112 *b = (float)blue/mask ;
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 ;
124 /*ERROR*Unimplemented Visual Class*/
125 Xw_set_error(5,"Xw_get_rgbpixel",&_CCLASS) ;
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) ;