U32 LASreadPoint::search_chunk_table(const U32 index, const U32 lower, const U32 upper) { if (lower + 1 == upper) return lower; U32 mid = (lower+upper)/2; if (index >= chunk_totals[mid]) return search_chunk_table(index, mid, upper); else return search_chunk_table(index, lower, mid); }
BOOL LASreadPoint::seek(const U32 current, const U32 target) { if (!instream->isSeekable()) return FALSE; U32 delta = 0; if (dec) { if (chunk_starts) { U32 target_chunk; if (chunk_totals) { target_chunk = search_chunk_table(target, 0, number_chunks); chunk_size = chunk_totals[target_chunk+1]-chunk_totals[target_chunk]; delta = target - chunk_totals[target_chunk]; } else { target_chunk = target/chunk_size; delta = target%chunk_size; } if (current_chunk != target_chunk || current > target) { dec->done(); current_chunk = target_chunk; instream->seek(chunk_starts[current_chunk]); init(instream); chunk_count = 0; } else { delta = target - current; } } else if (current > target) { dec->done(); instream->seek(point_start); init(instream); delta = target; } else if (current < target) { delta = target - current; } while (delta) { read(seek_point); delta--; } } else { if (current != target) { instream->seek(point_start+point_size*target); } } return TRUE; }