0022627: Change OCCT memory management defaults
[occt.git] / src / Xw / Xw_put_pixel.cxx
1
2 #include <Xw_Extension.h>
3
4         /* ifdef then trace on */
5 #ifdef TRACE
6 /*
7 #define TRACE_PUT_PIXEL
8 */
9 #endif
10
11 /*
12    XW_STATUS Xw_put_pixel (aimage,x,y,index,npixel):
13    XW_EXT_IMAGEDATA             *aimage
14    int x,y                      Pixel position
15    int index                    Pixel color index 
16    int npixel                   Pixel number to fill with the same color index
17
18         Fill an existing IMAGE created by Xw_open_image from Pixel index 
19
20         returns XW_ERROR if Extended Image is not defined
21                          or Color is not defined
22                          or Pixel position is wrong (Outside of image)
23         returns XW_SUCCESS if successful
24
25 */
26
27 #ifdef XW_PROTOTYPE
28 XW_STATUS Xw_put_pixel (void *aimage,int x,int y,int index,int npixel)
29 #else
30 XW_STATUS Xw_put_pixel (aimage,x,y,index,npixel)
31 void *aimage ;
32 int x,y,index,npixel ;
33 #endif /*XW_PROTOTYPE*/
34 {
35 XW_EXT_IMAGEDATA *pimage = (XW_EXT_IMAGEDATA*) aimage ;
36 register union {
37     char  *data ;
38     unsigned char *cdata ;
39     unsigned short *sdata ;
40     unsigned long  *ldata ;
41 } data ;
42 unsigned long lpixel ;
43 register int np ;
44 int fpixel,epixel,simage ;
45 XImage *pximage;
46
47         if( !Xw_isdefine_image(pimage) ) {
48             /*ERROR*Bad EXT_IMAGEDATA Address*/
49             Xw_set_error(25,"Xw_put_pixel",pimage) ;
50             return (XW_ERROR) ;
51         }
52
53         if( !Xw_isdefine_color(_ICOLORMAP,index) ) {
54             /*ERROR*Bad Defined Color at index*/
55             Xw_set_error(41,"Xw_put_pixel",&index) ;
56             return (XW_ERROR) ;
57         }
58
59         pximage = (_ZIMAGE) ? _ZIMAGE : _IIMAGE;
60         simage =  pximage->height*pximage->width ;
61         fpixel = x*pximage->width + y ;
62         epixel = fpixel + npixel - 1 ;
63
64         if( x < 0 || y < 0 || (epixel >= simage) ) {
65             /*WARNING*Bad PIXEL position*/
66             Xw_set_error(47,"Xw_put_pixel",&simage) ;
67             return (XW_ERROR) ;
68         }
69
70         lpixel = _ICOLORMAP->pixels[index] ;
71         switch (pximage->bitmap_pad) {
72             case 8 :
73                 { register unsigned char cpixel = (unsigned char) lpixel ;
74                 data.data = pximage->data + (fpixel) ;
75                 for( np=npixel ; np ; --np ) *data.cdata++ = cpixel ;
76                 }
77                 break ;
78             case 16 :
79                 { register unsigned short spixel = (unsigned short) lpixel ;
80                 data.data = pximage->data + (fpixel<<1) ;
81                 for( np=npixel ; np ; --np ) *data.sdata++ = spixel ;
82                 }
83                 break ;
84             case 32 :
85                 data.data = pximage->data + (fpixel<<2) ;
86                 for( np=npixel ; np ; --np ) *data.ldata++ = lpixel ;
87         }
88
89 #ifdef  TRACE_PUT_PIXEL
90         printf (" Xw_put_pixel(%x,%d,%d,%d,%d)\n",
91                                         pimage,x,y,index,npixel) ;
92 #endif
93
94         return (XW_SUCCESS);
95 }