⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cxdatastructs.cpp

📁 将OpenCV移植到DSP上
💻 CPP
📖 第 1 页 / 共 5 页
字号:
CV_IMPL voidcvStartWriteSeq( int seq_flags, int header_size,                 int elem_size, CvMemStorage * storage, CvSeqWriter * writer ){    CvSeq *seq = 0;    CV_FUNCNAME( "cvStartWriteSeq" );    __BEGIN__;    if( !storage || !writer )        CV_ERROR( CV_StsNullPtr, "" );    CV_CALL( seq = cvCreateSeq( seq_flags, header_size, elem_size, storage ));    cvStartAppendToSeq( seq, writer );    __END__;}/* updates sequence header */CV_IMPL voidcvFlushSeqWriter( CvSeqWriter * writer ){    CvSeq *seq = 0;    CV_FUNCNAME( "cvFlushSeqWriter" );    __BEGIN__;    if( !writer )        CV_ERROR( CV_StsNullPtr, "" );    seq = writer->seq;    seq->ptr = writer->ptr;    if( writer->block )    {        int total = 0;        CvSeqBlock *first_block = writer->seq->first;        CvSeqBlock *block = first_block;        writer->block->count = (int)((writer->ptr - writer->block->data) / seq->elem_size);        assert( writer->block->count > 0 );        do        {            total += block->count;            block = block->next;        }        while( block != first_block );        writer->seq->total = total;    }    __END__;}/* calls icvFlushSeqWriter and finishes writing process */CV_IMPL CvSeq *cvEndWriteSeq( CvSeqWriter * writer ){    CvSeq *seq = 0;    CV_FUNCNAME( "cvEndWriteSeq" );    __BEGIN__;    if( !writer )        CV_ERROR( CV_StsNullPtr, "" );    CV_CALL( cvFlushSeqWriter( writer ));    seq = writer->seq;    /* truncate the last block */    if( writer->block && writer->seq->storage )    {        CvMemStorage *storage = seq->storage;        char *storage_block_max = (char *) storage->top + storage->block_size;        assert( writer->block->count > 0 );        if( (unsigned)((storage_block_max - storage->free_space)            - seq->block_max) < CV_STRUCT_ALIGN )        {            storage->free_space = cvAlignLeft((int)(storage_block_max - seq->ptr), CV_STRUCT_ALIGN);            seq->block_max = seq->ptr;        }    }    writer->ptr = 0;    __END__;    return seq;}/* creates new sequence block */CV_IMPL voidcvCreateSeqBlock( CvSeqWriter * writer ){    CV_FUNCNAME( "cvCreateSeqBlock" );    __BEGIN__;    CvSeq *seq;    if( !writer || !writer->seq )        CV_ERROR( CV_StsNullPtr, "" );    seq = writer->seq;    cvFlushSeqWriter( writer );    CV_CALL( icvGrowSeq( seq, 0 ));    writer->block = seq->first->prev;    writer->ptr = seq->ptr;    writer->block_max = seq->block_max;    __END__;}/****************************************************************************************\*                               Sequence Reader implementation                           *\****************************************************************************************//* initializes sequence reader */CV_IMPL voidcvStartReadSeq( const CvSeq *seq, CvSeqReader * reader, int reverse ){    CvSeqBlock *first_block;    CvSeqBlock *last_block;    CV_FUNCNAME( "cvStartReadSeq" );    if( reader )    {        reader->seq = 0;        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;    first_block = seq->first;    if( first_block )    {        last_block = first_block->prev;        reader->ptr = first_block->data;        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    {        reader->delta_index = 0;        reader->block = 0;        reader->ptr = reader->prev_elem = reader->block_min = reader->block_max = 0;    }    __END__;}/* changes the current reading block to the previous or to the next */CV_IMPL voidcvChangeSeqBlock( void* _reader, int direction ){    CV_FUNCNAME( "cvChangeSeqBlock" );    __BEGIN__;    CvSeqReader* reader = (CvSeqReader*)_reader;        if( !reader )        CV_ERROR( CV_StsNullPtr, "" );    if( direction > 0 )    {        reader->block = reader->block->next;        reader->ptr = reader->block->data;    }    else    {        reader->block = reader->block->prev;        reader->ptr = CV_GET_LAST_ELEM( reader->seq, reader->block );    }    reader->block_min = reader->block->data;    reader->block_max = reader->block_min + reader->block->count * reader->seq->elem_size;    __END__;}/* returns the current reader position */CV_IMPL intcvGetSeqReaderPos( CvSeqReader* reader ){    int elem_size;    int index = -1;    CV_FUNCNAME( "cvGetSeqReaderPos" );    __BEGIN__;    if( !reader || !reader->ptr )        CV_ERROR( CV_StsNullPtr, "" );    elem_size = reader->seq->elem_size;    if( elem_size <= ICV_SHIFT_TAB_MAX && (index = icvPower2ShiftTab[elem_size - 1]) >= 0 )        index = (int)((reader->ptr - reader->block_min) >> index);    else        index = (int)((reader->ptr - reader->block_min) / elem_size);    index += reader->block->start_index - reader->delta_index;    __END__;    return index;}/* sets reader position to given absolute or relative   (relatively to the current one) position */CV_IMPL voidcvSetSeqReaderPos( CvSeqReader* reader, int index, int is_relative ){    CV_FUNCNAME( "cvSetSeqReaderPos" );    __BEGIN__;    CvSeqBlock *block;    int elem_size, count, total;    if( !reader || !reader->seq )        CV_ERROR( CV_StsNullPtr, "" );    total = reader->seq->total;    elem_size = reader->seq->elem_size;    if( !is_relative )    {        if( index < 0 )        {            if( index < -total )                CV_ERROR( CV_StsOutOfRange, "" );            index += total;        }        else if( index >= total )        {            index -= total;            if( index >= total )                CV_ERROR( CV_StsOutOfRange, "" );        }        block = reader->seq->first;        if( index >= (count = block->count) )        {            if( index + index <= total )            {                do                {                    block = block->next;                    index -= count;                }                while( index >= (count = block->count) );            }            else            {                do                {                    block = block->prev;                    total -= block->count;                }                while( index < total );                index -= total;            }        }        reader->ptr = block->data + index * elem_size;        if( reader->block != block )        {            reader->block = block;            reader->block_min = block->data;            reader->block_max = block->data + block->count * elem_size;        }    }    else    {        char* ptr = reader->ptr;        index *= elem_size;        block = reader->block;        if( index > 0 )        {            while( ptr + index >= reader->block_max )            {                int delta = (int)(reader->block_max - ptr);                index -= delta;                reader->block = block = block->next;                reader->block_min = ptr = block->data;                reader->block_max = block->data + block->count*elem_size;            }            reader->ptr = ptr + index;        }        else        {            while( ptr + index < reader->block_min )            {                int delta = (int)(ptr - reader->block_min);                index += delta;                reader->block = block = block->prev;                reader->block_min = block->data;                reader->block_max = ptr = block->data + block->count*elem_size;            }            reader->ptr = ptr + index;        }    }    __END__;}/* pushes element to the sequence */CV_IMPL char*cvSeqPush( CvSeq *seq, void *element ){    char *ptr = 0;    size_t elem_size;    CV_FUNCNAME( "cvSeqPush" );    __BEGIN__;    if( !seq )        CV_ERROR( CV_StsNullPtr, "" );    elem_size = seq->elem_size;    ptr = seq->ptr;    if( ptr >= seq->block_max )    {        CV_CALL( icvGrowSeq( seq, 0 ));        ptr = seq->ptr;        assert( ptr + elem_size <= seq->block_max /*&& ptr == seq->block_min */  );    }    if( element )        CV_MEMCPY_AUTO( ptr, element, elem_size );    seq->first->prev->count++;    seq->total++;    seq->ptr = ptr + elem_size;    __END__;    return ptr;}/* pops the last element out of the sequence */CV_IMPL voidcvSeqPop( CvSeq *seq, void *element ){    char *ptr;    int elem_size;    CV_FUNCNAME( "cvSeqPop" );    __BEGIN__;    if( !seq )        CV_ERROR( CV_StsNullPtr, "" );    if( seq->total <= 0 )        CV_ERROR( CV_StsBadSize, "" );    elem_size = seq->elem_size;    seq->ptr = ptr = seq->ptr - elem_size;    if( element )        CV_MEMCPY_AUTO( element, ptr, elem_size );    seq->ptr = ptr;    seq->total--;    if( --(seq->first->prev->count) == 0 )    {        icvFreeSeqBlock( seq, 0 );        assert( seq->ptr == seq->block_max );    }    __END__;}/* pushes element to the front of the sequence */CV_IMPL char*cvSeqPushFront( CvSeq *seq, void *element ){    char* ptr = 0;    int elem_size;    CvSeqBlock *block;    CV_FUNCNAME( "cvSeqPushFront" );    __BEGIN__;    if( !seq )        CV_ERROR( CV_StsNullPtr, "" );    elem_size = seq->elem_size;    block = seq->first;    if( !block || block->start_index == 0 )    {        CV_CALL( icvGrowSeq( seq, 1 ));        block = seq->first;        assert( block->start_index > 0 );    }    ptr = block->data -= elem_size;    if( element )        CV_MEMCPY_AUTO( ptr, element, elem_size );    block->count++;    block->start_index--;    seq->total++;    __END__;    return ptr;}/* pulls out the first element of the sequence */CV_IMPL voidcvSeqPopFront( CvSeq *seq, void *element ){    int elem_size;    CvSeqBlock *block;    CV_FUNCNAME( "cvSeqPopFront" );    __BEGIN__;    if( !seq )        CV_ERROR( CV_StsNullPtr, "" );    if( seq->total <= 0 )        CV_ERROR( CV_StsBadSize, "" );    elem_size = seq->elem_size;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -