@@ -43,6 +43,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
4343
4444static object * ImgfileError ; /* Exception we raise for various trouble */
4545
46+ static int top_to_bottom ; /* True if we want top-to-bottom images */
4647
4748/* The image library does not always call the error hander :-(,
4849 therefore we have a global variable indicating that it was called.
@@ -86,6 +87,20 @@ imgfile_open(fname)
8687 return image ;
8788}
8889
90+ static object *
91+ imgfile_ttob (self , args )
92+ object * self ;
93+ object * args ;
94+ {
95+ int newval ;
96+ object * rv ;
97+
98+ if (!getargs (args , "i" , & newval ))
99+ return NULL ;
100+ rv = newintobject (top_to_bottom );
101+ top_to_bottom = newval ;
102+ return rv ;
103+ }
89104
90105static object *
91106imgfile_read (self , args )
@@ -100,7 +115,8 @@ imgfile_read(self, args)
100115 static short rs [8192 ], gs [8192 ], bs [8192 ];
101116 int x , y ;
102117 IMAGE * image ;
103-
118+ int yfirst , ylast , ystep ;
119+
104120 if ( !getargs (args , "s" , & fname ) )
105121 return NULL ;
106122
@@ -139,7 +155,17 @@ imgfile_read(self, args)
139155 }
140156 cdatap = getstringvalue (rv );
141157 idatap = (long * )cdatap ;
142- for ( y = 0 ; y < ysize && !error_called ; y ++ ) {
158+
159+ if (top_to_bottom ) {
160+ yfirst = ysize - 1 ;
161+ ylast = -1 ;
162+ ystep = -1 ;
163+ } else {
164+ yfirst = 0 ;
165+ ylast = ysize ;
166+ ystep = 1 ;
167+ }
168+ for ( y = yfirst ; y != ylast && !error_called ; y += ystep ) {
143169 if ( zsize == 1 ) {
144170 getrow (image , rs , y , 0 );
145171 for (x = 0 ; x < xsize ; x ++ )
@@ -164,14 +190,17 @@ imgfile_read(self, args)
164190
165191static IMAGE * glob_image ;
166192static long * glob_datap ;
167- static int glob_width , glob_z ;
193+ static int glob_width , glob_z , glob_ysize ;
168194
169195static
170196xs_get (buf , y )
171197 short * buf ;
172198 int y ;
173199{
174- getrow (glob_image , buf , y , glob_z );
200+ if (top_to_bottom )
201+ getrow (glob_image , buf , (glob_ysize - 1 - y ), glob_z );
202+ else
203+ getrow (glob_image , buf , y , glob_z );
175204}
176205
177206static
@@ -221,6 +250,7 @@ xscale(image, xsize, ysize, zsize, datap, xnew, ynew, fmode, blur)
221250 glob_image = image ;
222251 glob_datap = datap ;
223252 glob_width = xnew ;
253+ glob_ysize = ysize ;
224254 if ( zsize == 1 ) {
225255 glob_z = 0 ;
226256 filterzoom (xs_get , xs_put_c , xsize , ysize , xnew , ynew , fmode , blur );
@@ -255,6 +285,7 @@ imgfile_readscaled(self, args)
255285 double blur ;
256286 int extended ;
257287 int fmode ;
288+ int yfirst , ylast , ystep ;
258289
259290 /*
260291 ** Parse args. Funny, since arg 4 and 5 are optional
@@ -331,7 +362,16 @@ imgfile_readscaled(self, args)
331362 if ( extended ) {
332363 xscale (image , xsize , ysize , zsize , idatap , xwtd , ywtd , fmode , blur );
333364 } else {
334- for ( y = 0 ; y < ywtd && !error_called ; y ++ ) {
365+ if (top_to_bottom ) {
366+ yfirst = ywtd - 1 ;
367+ ylast = -1 ;
368+ ystep = -1 ;
369+ } else {
370+ yfirst = 0 ;
371+ ylast = ywtd ;
372+ ystep = 1 ;
373+ }
374+ for ( y = yfirst ; y != ylast && !error_called ; y += ystep ) {
335375 yorig = (int )(y * yfac );
336376 if ( zsize == 1 ) {
337377 getrow (image , rs , yorig , 0 );
@@ -392,6 +432,8 @@ imgfile_write(self, args)
392432 short r , g , b ;
393433 long rgb ;
394434 int x , y ;
435+ int yfirst , ylast , ystep ;
436+
395437
396438 if ( !getargs (args , "(ss#iii)" ,
397439 & fname , & cdatap , & len , & xsize , & ysize , & zsize ) )
@@ -425,7 +467,16 @@ imgfile_write(self, args)
425467
426468 idatap = (long * )cdatap ;
427469
428- for ( y = 0 ; y < ysize && !error_called ; y ++ ) {
470+ if (top_to_bottom ) {
471+ yfirst = ysize - 1 ;
472+ ylast = -1 ;
473+ ystep = -1 ;
474+ } else {
475+ yfirst = 0 ;
476+ ylast = ysize ;
477+ ystep = 1 ;
478+ }
479+ for ( y = yfirst ; y != ylast && !error_called ; y += ystep ) {
429480 if ( zsize == 1 ) {
430481 for ( x = 0 ; x < xsize ; x ++ )
431482 rs [x ] = * cdatap ++ ;
@@ -459,6 +510,7 @@ static struct methodlist imgfile_methods[] = {
459510 { "read" , imgfile_read },
460511 { "readscaled" , imgfile_readscaled , 1 },
461512 { "write" , imgfile_write },
513+ { "ttob" , imgfile_ttob },
462514 { NULL , NULL } /* Sentinel */
463515};
464516
0 commit comments