cvWaitKey()的实现
int cvWaitKey( int delay )
{
int time0 = GetTickCount();
for(;;)
{
CvWindow* window;
MSG message;
int is_processed = 0;
if( (delay > 0 && abs((int)(GetTickCount() - time0)) >= delay) ||
hg_windows == 0 )
return -1;
if( delay <= 0 )
GetMessage(&message, 0, 0, 0);
else if( PeekMessage(&message, 0, 0, 0, PM_REMOVE) == FALSE )
{
Sleep(1);
continue;
}
for( window = hg_windows; window != 0 && is_processed == 0; window =
window->next )
{
if( window->hwnd == message.hwnd || window->frame == message.hwnd )
{
is_processed = 1;
switch(message.message)
{
case WM_DESTROY:
case WM_CHAR:
DispatchMessage(&message);
return (int)message.wParam;
case WM_KEYDOWN:
TranslateMessage(&message);
default:
DispatchMessage(&message);
is_processed = 1;
break;
}
}
}
if( !is_processed )
{
TranslateMessage(&message);
DispatchMessage(&message);
}
}
}
/**********************************************************/
cvReleaseMat的实现
void cvReleaseMat( CvMat** array )
{
CV_FUNCNAME( "cvReleaseMat" );
__BEGIN__;
if( !array )
CV_ERROR_FROM_CODE( CV_HeaderIsNull );
if( *array )
{
CvMat* arr = *array;
if( !CV_IS_MAT_HDR(arr) && !CV_IS_MATND_HDR(arr) )
CV_ERROR_FROM_CODE( CV_StsBadFlag );
*array = 0;
cvDecRefData( arr );
cvFree( &arr );
}
__END__;
}
/**********************************************************/
cvFree的实现
#define cvFree(ptr) (cvFree_(*(ptr)), *(ptr)=0)
void cvFree_( void* ptr )
{
CV_FUNCNAME( "cvFree_" );
__BEGIN__;
if( ptr )
{
CVStatus status = p_cvFree( ptr, p_cvAllocUserData );
if( status < 0 )
CV_ERROR( status, "Deallocation error" );
}
__END__;
}
*ptr==NULL;
/**********************************************************/
cvReleaseMemStorage的实现
void
cvReleaseMemStorage( CvMemStorage** storage )
{
CvMemStorage *st;
CV_FUNCNAME( "cvReleaseMemStorage" );
__BEGIN__;
if( !storage )
CV_ERROR( CV_StsNullPtr, "" );
st = *storage;
*storage = 0;
if( st )
{
CV_CALL( icvDestroyMemStorage( st ));
cvFree( &st );
}
__END__;
}
typedef struct CvMemStorage
{
int signature;
CvMemBlock* bottom;/* first allocated block */
CvMemBlock* top; /* current memory block - top of the stack */
struct CvMemStorage* parent; /* borrows new blocks from */
int block_size; /* block size */
int free_space; /* free space in the current block */
}
CvMemStorage;
typedef struct CvMemBlock
{
struct CvMemBlock* prev;
struct CvMemBlock* next;
}
CvMemBlock;
/**********************************************************/
cvSeqPush的实现
char* cvSeqPush( CvSeq *seq, void *element )
{
char *ptr = 0;
size_t elem_size;
CV_FUNCNAME( "cvSeqPush" );// means static char cvFuncName[] = Name
__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;
}
#define CV_FUNCNAME( Name ) \
static char cvFuncName[] = Name
#define CV_MEMCPY_AUTO( dst, src, len )
\
{
\
size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len);
\
char* _icv_memcpy_dst_ = (char*)(dst);
\
const char* _icv_memcpy_src_ = (const char*)(src);