@Override public BufferResult read( RasterRect rect, ByteBuffer resultBuffer ) throws IOException { BufferResult res = null; RasterRect fRect = snapToGrid( rect ); if ( fRect != null ) { int[] minCRmaxCR = getIntersectingTiles( fRect ); if ( minCRmaxCR == null ) { return null; } int size = fRect.width * fRect.height * sampleSize; if ( resultBuffer == null ) { resultBuffer = ByteBufferPool.allocate( size, false ); } synchronized ( LOCK ) { FileChannel channel = getFileChannel(); RasterRect tmpRect = new RasterRect( 0, 0, fRect.width, fRect.height ); for ( int col = minCRmaxCR[0]; col <= minCRmaxCR[2]; ++col ) { for ( int row = minCRmaxCR[1]; row <= minCRmaxCR[3]; ++row ) { readValuesFromTile( col, row, fRect, channel, resultBuffer ); } } res = new BufferResult( tmpRect, resultBuffer ); closeReadStream(); } } return res; }