cvStartReadSeq初始化讀取部分的狀態。將指針指向seq中的起始數據快地址。
順序讀取可通過調用宏 CV_READ_SEQ_ELEM( read_elem, reader ),
逆序讀取可通過調用宏CV_REV_READ_SEQ_ELEM( read_elem, reader )。
這兩個宏都將序列元素讀進read_elem中, 並將指針移到下一個元素。
CV_IMPL void
cvStartReadSeq( const CvSeq *seq, CvSeqReader * reader, int reverse )
{
CvSeqBlock *first_block;
CvSeqBlock *last_block;
CV_FUNCNAME( "cvStartReadSeq" );
if( reader )
{
reader->seq = 0; //初試化CvSeqReader結構體reader
reader->block = 0;
reader->ptr = reader->block_max = reader->block_min = 0;
}
__BEGIN__;
if( !seq || !reader )
CV_ERROR( CV_StsNullPtr, "" );
reader->header_size = sizeof( CvSeqReader );
reader->seq = (CvSeq*)seq;
//將reader->seq指向序列seq地址
first_block = seq->first; ////將first_block指向序列seq->first地址
if( first_block )
//first_block是否以賦值
{
last_block = first_block->prev;
reader->ptr = first_block->data; //reader當前指針指向first_block數據地址
reader->prev_elem = CV_GET_LAST_ELEM( seq, last_block );
reader->delta_index = seq->first->start_index;
if( reverse ) //是正向還是反向讀數據
{
char *temp = reader->ptr;
reader->ptr = reader->prev_elem;
reader->prev_elem = temp;
reader->block = last_block;
}
else
{
reader->block = first_block;
}
reader->block_min = reader->block->data;
reader->block_max = reader->block_min + reader->block->count * seq->elem_size;
}
else //如果first_block沒有賦值
{
reader->delta_index = 0;
reader->block = 0;
reader->ptr = reader->prev_elem = reader->block_min = reader->block_max = 0;
}
__END__;
}