0022627: Change OCCT memory management defaults
[occt.git] / src / Xw / Xw_zoom_image.cxx
CommitLineData
7fd59977 1#include <Xw_Extension.h>
2
3#define MAXISIZE 1600*1200
4
5/* ifdef then trace on */
6#ifdef TRACE
7# define TRACE_ZOOM_IMAGE
8#endif
9
10/*
11 XW_STATUS Xw_zoom_image (aimage,zoom):
12 XW_EXT_IMAGEDATA *aimage Image to ZOOM
13 float zoom Zoom Coef to apply (>0.)
14
15 Apply a ZOOM factor to an image
16
17 returns ERROR if bad zoom factor
18 returns SUCCESS if successfull
19
20*/
21
22#ifdef XW_PROTOTYPE
23XW_STATUS Xw_zoom_image (void* aimage,float zoom)
24#else
25XW_STATUS Xw_zoom_image (aimage,zoom)
26void *aimage;
27float zoom ;
28#endif /*XW_PROTOTYPE*/
29{
30XW_EXT_IMAGEDATA *pimage = (XW_EXT_IMAGEDATA*)aimage ;
31XImage *pximage,*qximage ;
32int i,j,isize,wp,hp,xp,yp,xq,yq,xn,yn,dxp,dyp,npixel,num_pixel[MAXCOLOR] ;
33unsigned long pixel,bpixel,tab_pixel[MAXCOLOR];
34float ratio;
35
36
37 if( !Xw_isdefine_image(pimage) ) {
38 /*ERROR*Bad EXT_IMAGE Address*/
39 Xw_set_error(25,"Xw_zoom_image",pimage) ;
40 return (XW_ERROR) ;
41 }
42
43 if( zoom <= 0. ) {
44 /*ERROR*Bad Image Zoom factor*/
45 Xw_set_error(113,"Xw_zoom_image",&zoom) ;
46 return (XW_ERROR) ;
47 }
48
49 pximage = pimage->pximage ;
50 qximage = (XImage*) Xw_malloc(sizeof(XImage)) ;
51
52 if( !qximage ) {
53 /*ERROR*XImage Allocation failed*/
54 Xw_set_error(60,"Xw_zoom_image",NULL) ;
55 return (XW_ERROR) ;
56 }
57
58 Xw_bytecopy((char*)pximage,(char*)qximage,sizeof(XImage)) ;
59
60 wp = pximage->width; hp = pximage->height;
61 ratio = (float)wp/hp;
62 qximage->width = (int )( wp * zoom );
63 qximage->height = (int )( hp * zoom );
64 dxp = dyp = 0;
65
66 double datasize = qximage->width*qximage->height;
67 if (datasize > MAXISIZE) {
68 // ERROR*ZOOM factor is too big
69 printf(" ***Xw_zoom_image(%f).Too BIG zoom, full image can't be zoomed.\n",zoom);
70 Xw_set_error(130, "Xw_zoom_image", &zoom);
71 return (XW_ERROR);
72 }
73
74 if (fabs(zoom - pimage->zoom) < 0.01) {
75 return XW_SUCCESS;
76 }
77
78 qximage->bytes_per_line = qximage->width * (pximage->bitmap_pad/8) ;
79 isize = qximage->bytes_per_line * qximage->height ;
80 qximage->data = (char*) Xw_malloc(isize) ;
81
82 if( !qximage->data ) {
83 /*ERROR*XImage Allocation failed*/
84 Xw_set_error(60,"Xw_zoom_image",NULL) ;
85 return (XW_ERROR) ;
86 }
87
88 bpixel = XGetPixel(pximage,0,0) ;
89
90 if( zoom > 1. ) {
91 for( yp=yq=0 ; yp<hp ; yq=yn,yp++ ) {
92 yn = (int )( (yp+1)*zoom+0.5 );
93 if( yn >= qximage->height ) yn = qximage->height-1 ;
94 for( xp=xq=0 ; xp<wp ; xq=xn,xp++ ) {
95 xn = (int )( (xp+1)*zoom+0.5 );
96 if( xn >= qximage->width ) xn = qximage->width-1 ;
97 pixel = XGetPixel(pximage,xp+dxp,yp+dyp) ;
98 if( ((xn-xq) > 1) || ((yn-yq) > 1) ) {
99 register int x,y;
100 for( y=yq ; y<yn ; y++ ) {
101 for( x=xq ; x<xn ; x++ ) {
102 XPutPixel(qximage,x,y,pixel) ;
103 }
104 }
105 } else {
106 XPutPixel(qximage,xq,yq,pixel) ;
107 }
108 }
109 }
110 } else {
111 for( yp=yq=0 ; yq<qximage->height ; yp=yn,yq++ ) {
112 yn = (int )( (yq+1)/zoom+0.5 );
113 if( yn >= pximage->height ) yn = pximage->height-1 ;
114 for( xp=xq=0 ; xq<qximage->width ; xp=xn,xq++ ) {
115 xn = (int )( (xq+1)/zoom+0.5 );
116 if( xn >= pximage->width ) xn = pximage->width-1 ;
117 if( xn-1 > xp && yn-1 > yp ) {
118 register int x,y,ipixel = 0;
119 npixel = 0;
120 for( y=yp ; y<yn ; y++ ) {
121 for( x=xp ; x<xn ; x++ ) {
122 pixel = XGetPixel(pximage,x,y) ;
123 if( pixel != bpixel ) {
124 for( i=0 ; i<npixel ; i++) {
125 if( pixel == tab_pixel[ipixel] ) {
126 num_pixel[ipixel]++;
127 break;
128 }
129 ipixel++;
130 if( ipixel >= npixel ) ipixel = 0;
131 }
132 if( i >= npixel ) {
133 ipixel = npixel;
134 num_pixel[npixel] = 1;
135 tab_pixel[npixel] = pixel;
136 if( npixel < MAXCOLOR-1 ) npixel++;
137 }
138 }
139 }
140 }
141
142 if( npixel > 0 ) {
143 j = 0;
144 for( i=1 ; i<npixel ; i++ ) {
145 if( num_pixel[i] > num_pixel[j] ) j = i;
146 }
147 bpixel = pixel = tab_pixel[j];
148 } else {
149 pixel = bpixel;
150 }
151 } else {
152 pixel = XGetPixel(pximage,xp,yp) ;
153 }
154 XPutPixel(qximage,xq,yq,pixel) ;
155 }
156 }
157 }
158
159 if( _ZIMAGE && (_ZIMAGE != _IIMAGE) ) {
160 XDestroyImage(_ZIMAGE);
161 }
162
163 _ZIMAGE = qximage;
164 pimage->zoom = zoom;
165
166#ifdef TRACE_ZOOM_IMAGE
167if( Xw_get_trace() ) {
168 printf (" Xw_zoom_image(%lx,%f)\n",(long ) pimage,zoom);
169}
170#endif
171
172 return (XW_SUCCESS);
173}