summaryrefslogtreecommitdiff
path: root/src/Xw/Xw_get_rgbpixel.cxx
blob: f33458a9fc90b46b35953b6fde81362de52a49a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135

#include <Xw_Extension.h>

	/* ifdef then trace on */
#ifdef TRACE
#define TRACE_GET_RGBPIXEL
#endif

/*
   STATUS Xw_get_rgbpixel (aimage,x,y,r,g,b,npixel):
   XW_EXT_IMAGEDATA 		*aimage
   int x,y			Pixel position
   float *r,*g,*b		return R,G,B Pixel values      
   int *npixel			return Pixel number filled with 
				       the same color index

	Extract RGB pixels from an existing IMAGE created by Xw_get_image

	returns ERROR if Extended Image is not defined
		      or VISUAL Image type is not TRUECOLOR
		      or Pixel position is wrong (Outside of image)
	returns SUCCESS if successful

*/

#ifdef XW_PROTOTYPE
XW_STATUS Xw_get_rgbpixel (void* aimage,
		int x,int y,float* r,float* g,float* b,int* npixel)
#else
XW_STATUS Xw_get_rgbpixel (aimage,x,y,r,g,b,npixel)
void *aimage ;
int x,y ;
float *r,*g,*b ;
int *npixel ;
#endif /*XW_PROTOTYPE*/
{
XW_EXT_IMAGEDATA *pimage = (XW_EXT_IMAGEDATA*) aimage ;
XW_EXT_COLORMAP *pcolormap = pimage->pcolormap ;
union {
    char  *data ;
    unsigned char *cdata ;
    unsigned short *sdata ;
    unsigned long  *ldata ;
} data ;
int i=0,fpixel,simage ;
unsigned long pixel=0 ;
XColor color ;
XImage *pximage;

        if( !Xw_isdefine_image(pimage) ) {
	    /*ERROR*Bad EXT_IMAGEDATA Address*/
	    Xw_set_error(25,"Xw_get_rgbpixel",pimage) ;
            return (XW_ERROR) ;
        }

 	pximage = (_ZIMAGE) ? _ZIMAGE : _IIMAGE ;
	fpixel = x*pximage->width + y ;
	simage = pximage->height*pximage->width ;

	if( x < 0 || y < 0 || (fpixel >= simage) ) {
	    /*ERROR*Bad PIXEL position*/
	    Xw_set_error(47,"Xw_get_rgbpixel",&simage) ;
	    return (XW_ERROR) ;
	}

	switch (pximage->bitmap_pad) {
	    case 8 :
		data.data = pximage->data + (fpixel) ; simage -= fpixel ;
		pixel = (unsigned long) *data.cdata ;
		for( i=1 ; i<simage ; i++ ) {
		    data.cdata++ ; 
		    if( *data.cdata != (unsigned char) pixel ) break ;
		}
		break ;
	    case 16 :
		data.data = pximage->data + (fpixel<<1) ; simage -= fpixel ;
		pixel = (unsigned long) *data.sdata ;
		for( i=1 ; i<simage ; i++ ) {
		    data.sdata++ ; 
		    if( *data.sdata != (unsigned short) pixel ) break ;
		}
		break ;
	    case 32 :
		data.data = pximage->data + (fpixel<<2) ; simage -= fpixel ;
		pixel = (unsigned long) *data.ldata ;
		for( i=1 ; i<simage ; i++ ) {
		    data.ldata++ ; 
		    if( *data.ldata != (unsigned long) pixel ) break ;
		}
	}

	*npixel = i ;
	switch ( _CCLASS ) {
	    case TrueColor :
                { unsigned long mask = _CVISUAL->map_entries-1 ;
                unsigned long red,green,blue ;
                unsigned long rmask = _CVISUAL->red_mask ;
                unsigned long gmask = _CVISUAL->green_mask ;
                unsigned long bmask = _CVISUAL->blue_mask ;
 
                red = pixel & rmask ;
                while ( !(rmask & 0x01) ) { rmask >>= 1; red >>= 1; }

                green = pixel & gmask ;
                while ( !(gmask & 0x01) ) { gmask >>= 1; green >>= 1; }

                blue = pixel & bmask ;
                while ( !(bmask & 0x01) ) { bmask >>= 1; blue >>= 1; }

                *r = (float)red/mask ;
                *g = (float)green/mask ;
                *b = (float)blue/mask ;
    	        } 
		break ;

	    case PseudoColor :
		color.pixel = pixel ;
		XQueryColor(_CDISPLAY,_CINFO.colormap,&color) ;
		*r = (float) color.red/0xFFFF ;
		*g = (float) color.green/0xFFFF ;
		*b = (float) color.blue/0xFFFF ;
		break ;
	    default :
	    /*ERROR*Unimplemented Visual Class*/
	    	Xw_set_error(5,"Xw_get_rgbpixel",&_CCLASS) ;
	        return (XW_ERROR) ;
	}

#ifdef  TRACE_GET_RGBPIXEL
	printf (" Xw_get_rgbpixel(%lx,%d,%d,%f,%f,%f,%d)\n",
					(long ) pimage,x,y,*r,*g,*b,*npixel) ;
#endif

	return (XW_SUCCESS);
}