@@ -96,6 +96,8 @@ static lumrow PROTO((unsigned char *, unsigned char *, int));
9696
9797static object * ImgfileError ;
9898
99+ static int reverse_order ;
100+
99101#ifdef ADD_TAGS
100102/*
101103 * addlongimgtag -
@@ -339,6 +341,8 @@ longimagedata(self, args)
339341 if (badorder ) {
340342 for (z = 0 ; z < zsize ; z ++ ) {
341343 lptr = base ;
344+ if (reverse_order )
345+ lptr += (ysize - 1 ) * xsize * sizeof (unsigned long );
342346 for (y = 0 ; y < ysize ; y ++ ) {
343347 if (cur != starttab [y + z * ysize ]) {
344348 fseek (inf ,starttab [y + z * ysize ],SEEK_SET );
@@ -356,11 +360,16 @@ longimagedata(self, args)
356360 fread (rledat ,lengthtab [y + z * ysize ],1 ,inf );
357361 cur += lengthtab [y + z * ysize ];
358362 expandrow (lptr ,rledat ,3 - z );
359- lptr += xsize * sizeof (unsigned long );
363+ if (reverse_order )
364+ lptr -= xsize * sizeof (unsigned long );
365+ else
366+ lptr += xsize * sizeof (unsigned long );
360367 }
361368 }
362369 } else {
363370 lptr = base ;
371+ if (reverse_order )
372+ lptr += (ysize - 1 ) * xsize * sizeof (unsigned long );
364373 for (y = 0 ; y < ysize ; y ++ ) {
365374 for (z = 0 ; z < zsize ; z ++ ) {
366375 if (cur != starttab [y + z * ysize ]) {
@@ -371,7 +380,10 @@ longimagedata(self, args)
371380 cur += lengthtab [y + z * ysize ];
372381 expandrow (lptr ,rledat ,3 - z );
373382 }
374- lptr += xsize * sizeof (unsigned long );
383+ if (reverse_order )
384+ lptr -= xsize * sizeof (unsigned long );
385+ else
386+ lptr += xsize * sizeof (unsigned long );
375387 }
376388 }
377389 if (zsize == 3 )
@@ -398,10 +410,15 @@ longimagedata(self, args)
398410 fseek (inf ,512 ,SEEK_SET );
399411 for (z = 0 ; z < zsize ; z ++ ) {
400412 lptr = base ;
413+ if (reverse_order )
414+ lptr += (ysize - 1 ) * xsize * sizeof (unsigned long );
401415 for (y = 0 ; y < ysize ; y ++ ) {
402416 fread (verdat ,xsize ,1 ,inf );
403417 interleaverow (lptr ,verdat ,3 - z ,xsize );
404- lptr += xsize * sizeof (unsigned long );
418+ if (reverse_order )
419+ lptr -= xsize * sizeof (unsigned long );
420+ else
421+ lptr += xsize * sizeof (unsigned long );
405422 }
406423 }
407424 if (zsize == 3 )
@@ -579,6 +596,8 @@ longstoimage(self, args)
579596 goodwrite *= writeheader (outf ,& image );
580597 fseek (outf ,512 + 2 * tablen ,SEEK_SET );
581598 pos = 512 + 2 * tablen ;
599+ if (reverse_order )
600+ lptr += (ysize - 1 ) * xsize * sizeof (unsigned long );
582601 for (y = 0 ; y < ysize ; y ++ ) {
583602 for (z = 0 ; z < zsize ; z ++ ) {
584603 if (zsize == 1 ) {
@@ -601,7 +620,10 @@ longstoimage(self, args)
601620 lengthtab [y + z * ysize ] = len ;
602621 pos += len ;
603622 }
604- lptr += xsize * sizeof (unsigned long );
623+ if (reverse_order )
624+ lptr -= xsize * sizeof (unsigned long );
625+ else
626+ lptr += xsize * sizeof (unsigned long );
605627 }
606628
607629 fseek (outf ,512 ,SEEK_SET );
@@ -694,10 +716,25 @@ int z, cnt;
694716 return optr - (unsigned char * )rlebuf ;
695717}
696718
719+ static object *
720+ ttob (self , args )
721+ object * self ;
722+ object * args ;
723+ {
724+ int order , oldorder ;
725+
726+ if (!getargs (args , "d" , & order ))
727+ return NULL ;
728+ oldorder = reverse_order ;
729+ reverse_order = order ;
730+ return newintobject (oldorder );
731+ }
732+
697733static struct methodlist rgbimg_methods [] = {
698734 {"sizeofimage" , sizeofimage },
699735 {"longimagedata" , longimagedata },
700736 {"longstoimage" , longstoimage },
737+ {"ttob" , ttob },
701738 {NULL , NULL } /* sentinel */
702739};
703740
0 commit comments