AWARE [SYSTEMS] Imaging expertise for the Delphi developer
AWare Systems, Imaging expertise for the Delphi developer, Home TIFF and LibTiff Mailing List Archive

LibTiff Mailing List

TIFF and LibTiff Mailing List Archive
December 1998

Previous Thread
Next Thread

Previous by Thread
Next by Thread

Previous by Date
Next by Date

Contact

The TIFF Mailing List Homepage
This list is run by Frank Warmerdam
Archive maintained by AWare Systems



Valid HTML 4.01!



1998.12.10 20:57 "tiffcp bug & libtiff maint.", by Frank Warmerdam

Sam / and others,

I have found, and fixed a bug in tiffcp.  In particular, if you attempt
to convert the test image oxford.tif to tiled format (it has separate
image planes) I get a crash. 

% tiffcp -t oxford.tif oxford_tiled.tif

Investigation took me to the function readSeparateStripsIntoBuffer().
It is manifestly in error since nothing in the function actually
references the scanline buffer into which the data is being read.

DECLAREreadFunc(readSeparateStripsIntoBuffer)
{
	tsize_t scanlinesize = TIFFScanlineSize(in);
	tdata_t scanline = _TIFFmalloc(scanlinesize);

	(void) imagewidth;
	if (scanline) {
		uint8* bufp = (uint8*) buf;
		uint32 row;
		tsample_t s;

		for (row = 0; row < imagelength; row++) {
			/* merge channels */
			for (s = 0; s < spp; s++) {
				uint8* bp = bufp + s;
				tsize_t n = scanlinesize;

				if (TIFFReadScanline(in, scanline, row, s) < 0 && !ignore)
					goto done;
				while (n-- > 0)
					*bp = *bufp++, bp += spp;
			}
			bufp += scanlinesize;
		}
done:
		_TIFFfree(scanline);
	}
}

I made a few changes to produce this version.

DECLAREreadFunc(readSeparateStripsIntoBuffer)
{
	tsize_t scanlinesize = TIFFScanlineSize(in);
	tdata_t scanline = _TIFFmalloc(scanlinesize);

	(void) imagewidth;
	if (scanline) {
		uint8* bufp = (uint8*) buf;
		uint32 row;
		tsample_t s;

		for (row = 0; row < imagelength; row++) {
			/* merge channels */
			for (s = 0; s < spp; s++) {
				uint8* bp = bufp + s;
				tsize_t n = scanlinesize;
                                uint8* sbuf = scanline;     /** new **/

				if (TIFFReadScanline(in, scanline, row, s) < 0 && !ignore)
					goto done;
				while (n-- > 0)
					*bp = *sbuf++, bp += spp;  /** changed **/
			}
			bufp += scanlinesize * spp;         /** changed **/
		}

done:
		_TIFFfree(scanline);
	}
}

After this change the resulting file works fine with some applications,
though it confusing my local version of xv.  I also tried converting this
file back to strip organization, and got a screwed up file.  Looking at
the image, it seemed to be emitting the extra data in the last tile,
or perhaps over compensating for it's presence. 

Using:

% tiffcp -s oxford_tiled.tif oxford_stripped.tif

Would you like me to look into this problem as well?

These problems came up as I was trying to synthesis various test files
to use with me new TIFFReadRGBAStrip(), and TIFFReadRGBATile() functions
which otherwise seem to be working well.  I will send them through in the
next day or two. 

--- on another topic ---

Finally, for the maintenance of the software, perhaps libtiff could move
to a situation where it is kept under CVS and two or three trusted people
could have access.  I for one would like to see a new libtiff version 
produced with my new RGBA access functions fairly quickly as it would make 
it easier to ensure that my changes have been folded in properly, and that 
my clients won't have trouble upgrading to new versions of the library.  The 
changes aren't very critical, and Sam might not have time to do a release of
such stuff for a while.

If there were to fly, we would need somewhere we could host a tiff site
(which I would also hope could be a new home for GeoTIFF stuff ... my 
main area of interest).  This could be SGI, but only if they aren't too
picky about security, and only if Sam was willing to do a bunch of grunt
work.  

Alternatively, perhaps it could be hosted on the machine of some other
established, and related project such as the IJG, Gimp, PNM or such.  A
key factor to my mind is that the host should be reliable, and care enough
about tiff to not let it get unduely hosed.

I would be happy to do some grunt work on this sort of thing as long as
appropriate access can be given.  

Best regards,

-----------------------------------+---------------------------------------
Who can give them back their lives | Frank Warmerdam, Programmer for Hire
and all those wasted years? - Rush | http://members.home.com/warmerda
                                   | warmerda@home.com