Merge pull request #997 from lrineau/CGAL_ImageIO-fix_with_huge_files-GF

(Merged from remote-tracking branch 'cgal/releases/CGAL-4.8-branch')
This commit is contained in:
Laurent Rineau 2016-04-14 15:43:40 +02:00
commit 12be44eac3
1 changed files with 9 additions and 6 deletions

View File

@ -141,7 +141,10 @@ size_t ImageIO_write(const _image *im, const void *buf, size_t len) {
//return 0; //return 0;
} }
size_t ImageIO_limit_read(size_t to_be_read)
{
return (std::min)(to_be_read, size_t(1u<<30));
}
/* mimics fread() function. /* mimics fread() function.
According to _openReadImage(), openMode will has one According to _openReadImage(), openMode will has one
@ -162,12 +165,12 @@ size_t ImageIO_read(const _image *im, void *buf, size_t len)
return 0; return 0;
case OM_STD : case OM_STD :
#ifdef CGAL_USE_ZLIB #ifdef CGAL_USE_ZLIB
while ( (to_be_read > 0) && ((l = gzread(im->fd, (void *) b, to_be_read)) > 0) ) { while ( (to_be_read > 0) && ((l = gzread(im->fd, (void *) b, ImageIO_limit_read(to_be_read))) > 0) ) {
to_be_read -= l; to_be_read -= l;
b += l; b += l;
} }
#else #else
while ( (to_be_read > 0) && ((l = fread( b, 1, to_be_read, im->fd )) > 0) ) { while ( (to_be_read > 0) && ((l = fread( b, 1, ImageIO_limit_read(to_be_read), im->fd )) > 0) ) {
to_be_read -= l; to_be_read -= l;
b += l; b += l;
} }
@ -175,7 +178,7 @@ size_t ImageIO_read(const _image *im, void *buf, size_t len)
return ( len - to_be_read ); return ( len - to_be_read );
#ifdef CGAL_USE_ZLIB #ifdef CGAL_USE_ZLIB
case OM_GZ : case OM_GZ :
while ( (to_be_read > 0) && ((l = gzread(im->fd, (void *) b, to_be_read)) > 0) ) { while ( (to_be_read > 0) && ((l = gzread(im->fd, (void *) b, ImageIO_limit_read(to_be_read))) > 0) ) {
to_be_read -= l; to_be_read -= l;
b += l; b += l;
} }
@ -187,7 +190,7 @@ size_t ImageIO_read(const _image *im, void *buf, size_t len)
return ( len - to_be_read ); return ( len - to_be_read );
#else #else
case OM_FILE : case OM_FILE :
while ( (to_be_read > 0) && ((l = fread( b, 1, to_be_read, im->fd )) > 0) ) { while ( (to_be_read > 0) && ((l = fread( b, 1, ImageIO_limit_read(to_be_read), im->fd )) > 0) ) {
to_be_read -= l; to_be_read -= l;
b += l; b += l;
} }
@ -542,7 +545,7 @@ _image *_createImage(int x, int y, int z, int v,
im->rx = im->ry = im->rz = 0.0; im->rx = im->ry = im->rz = 0.0;
/* no data yet */ /* no data yet */
im->data = ImageIO_alloc(x*y*z*v*w); im->data = ImageIO_alloc(std::size_t(x)*std::size_t(y)*std::size_t(z)*std::size_t(v)*std::size_t(w));
/* no file associated to image */ /* no file associated to image */
im->fd = NULL; im->fd = NULL;