Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/LibTIFF4/tif_read.c view on Meta::CPAN
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
"%lu: Sample out of range, max %lu",
(unsigned long) sample, (unsigned long) td->td_samplesperpixel);
return (0);
}
strip = (uint32)sample*td->td_stripsperimage + row/td->td_rowsperstrip;
} else
strip = row / td->td_rowsperstrip;
/*
* Do we want to treat this strip as one whole chunk or
* read it a few lines at a time?
*/
#if defined(CHUNKY_STRIP_READ_SUPPORT)
if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount)
return 0;
whole_strip = tif->tif_dir.td_stripbytecount[strip] < 10
|| isMapped(tif);
#else
whole_strip = 1;
#endif
if( !whole_strip )
{
read_ahead = tif->tif_scanlinesize * 16 + 5000;
}
/*
* If we haven't loaded this strip, do so now, possibly
* only reading the first part.
*/
if (strip != tif->tif_curstrip) { /* different strip, refill */
if( whole_strip )
{
if (!TIFFFillStrip(tif, strip))
return (0);
}
else
{
if( !TIFFFillStripPartial(tif,strip,read_ahead,1) )
return 0;
}
}
/*
** If we already have some data loaded, do we need to read some more?
*/
else if( !whole_strip )
{
if( ((tif->tif_rawdata + tif->tif_rawdataloaded) - tif->tif_rawcp) < read_ahead
&& (uint64) tif->tif_rawdataoff+tif->tif_rawdataloaded < td->td_stripbytecount[strip] )
{
if( !TIFFFillStripPartial(tif,strip,read_ahead,0) )
return 0;
}
}
if (row < tif->tif_row) {
/*
* Moving backwards within the same strip: backup
* to the start and then decode forward (below).
*
* NB: If you're planning on lots of random access within a
* strip, it's better to just read and decode the entire
* strip, and then access the decoded data in a random fashion.
*/
if( tif->tif_rawdataoff != 0 )
{
if( !TIFFFillStripPartial(tif,strip,read_ahead,1) )
return 0;
}
else
{
if (!TIFFStartStrip(tif, strip))
return (0);
}
}
if (row != tif->tif_row) {
/*
* Seek forward to the desired row.
*/
/* TODO: Will this really work with partial buffers? */
if (!(*tif->tif_seek)(tif, row - tif->tif_row))
return (0);
tif->tif_row = row;
}
return (1);
}
int
TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample)
{
int e;
if (!TIFFCheckRead(tif, 0))
return (-1);
if( (e = TIFFSeek(tif, row, sample)) != 0) {
/*
* Decompress desired row into user buffer.
*/
e = (*tif->tif_decoderow)
(tif, (uint8*) buf, tif->tif_scanlinesize, sample);
/* we are now poised at the beginning of the next row */
tif->tif_row = row + 1;
if (e)
(*tif->tif_postdecode)(tif, (uint8*) buf,
tif->tif_scanlinesize);
}
return (e > 0 ? 1 : -1);
}
/*
* Read a strip of data and decompress the specified
( run in 1.446 second using v1.01-cache-2.11-cpan-e1769b4cff6 )