#include "mrilib.h"
/*-------------------------------------------------------------------
Fill in the blanks (zeros) in a row of shorts that are at most
maxgap in length, and are bounded by the same value.
Return value is number of filled-in blanks.
---------------------------------------------------------------------*/
static int THD_rowfillin_short( int nrow , short * row , int maxgap )
{
int ii , nfill=0 , jj ;
short vbot ;
/*-- skip zeros at start --*/
for( ii=0 ; ii < nrow && row[ii] == 0 ; ii++ ) ; /* nada */
if( ii == nrow ) return nfill ; /*** was all zeros ***/
/*-- row[ii] is not zero here; now find a gap at or above this --*/
#if 0
{ int kk ; fprintf(stderr,"maxgap=%d: row in:",maxgap);
for( kk=0 ; kk < nrow ; kk++ ) fprintf(stderr," %d",row[kk]) ;
fprintf(stderr,"\n") ; }
#endif
while( 1 ){
/*-- find next zero value (start of blank region) --*/
for( ; ii < nrow && row[ii] != 0 ; ii++ ) ; /* nada */
if( ii == nrow ) return nfill ; /*** didn't find any zero ***/
#if 0
fprintf(stderr," gap start at %d\n",ii) ;
#endif
vbot = row[ii-1] ; /* value just before gap */
/*-- find next nonzero value above this zero --*/
for( jj=ii+1 ; jj < nrow && row[jj] == 0 ; jj++ ) ; /* nada */
if( jj == nrow ) return nfill ; /*** was all zeros to the end ***/
#if 0
fprintf(stderr," gap end at %d: vbot=%d row[jj]=%d\n",jj,vbot,row[jj]) ;
#endif
if( row[jj] == vbot && jj-ii <= maxgap ){ /*** fill in this gap!!! ***/
nfill += (jj-ii) ;
for( ; ii < jj ; ii++ ) row[ii] = vbot ;
#if 0
{ int kk ; fprintf(stderr,"filled:");
for( kk=0 ; kk < nrow ; kk++ ) fprintf(stderr," %d",row[kk]) ;
fprintf(stderr,"\n") ; }
#endif
}
ii = jj ; /* loop back and look for another gap */
} /* endless loop */
}
/*------------------------------------------------------------------------*/
static int THD_rowfillin_byte( int nrow , byte * row , int maxgap )
{
int ii , nfill=0 , jj ;
byte vbot ;
/*-- skip zeros --*/
for( ii=0 ; ii < nrow && row[ii] == 0 ; ii++ ) ; /* nada */
if( ii == nrow ) return nfill ; /*** was all zeros ***/
/*-- row[ii] is not zero here; now find a gap at or above this --*/
while( 1 ){
/*-- find next zero value --*/
for( ; ii < nrow && row[ii] != 0 ; ii++ ) ; /* nada */
if( ii == nrow ) return nfill ; /*** didn't find any zero ***/
vbot = row[ii-1] ; /* value at start of gap */
/*-- find next nonzero value above this zero --*/
for( jj=ii+1 ; jj < nrow && row[jj] == 0 ; jj++ ) ; /* nada */
if( jj == nrow ) return nfill ; /*** was all zeros to the end ***/
if( row[jj] == vbot && jj-ii <= maxgap ){ /*** fill in this gap!!! ***/
nfill += (jj-ii) ;
for( ; ii < jj ; ii++ ) row[ii] = vbot ;
}
ii = jj ; /* loop back and look for another gap */
} /* endless loop */
}
/*------------------------------------------------------------------------*/
static int THD_rowfillin_float( int nrow , float * row , int maxgap )
{
int ii , nfill=0 , jj ;
float vbot ;
/*-- skip zeros --*/
for( ii=0 ; ii < nrow && row[ii] == 0 ; ii++ ) ; /* nada */
if( ii == nrow ) return nfill ; /*** was all zeros ***/
/*-- row[ii] is not zero here; now find a gap at or above this --*/
while( 1 ){
/*-- find next zero value --*/
for( ; ii < nrow && row[ii] != 0 ; ii++ ) ; /* nada */
if( ii == nrow ) return nfill ; /*** didn't find any zero ***/
vbot = row[ii-1] ; /* value at start of gap */
/*-- find next nonzero value above this zero --*/
for( jj=ii+1 ; jj < nrow && row[jj] == 0 ; jj++ ) ; /* nada */
if( jj == nrow ) return nfill ; /*** was all zeros to the end ***/
if( row[jj] == vbot && jj-ii <= maxgap ){ /*** fill in this gap!!! ***/
nfill += (jj-ii) ;
for( ; ii < jj ; ii++ ) row[ii] = vbot ;
}
ii = jj ; /* loop back and look for another gap */
} /* endless loop */
}
/*---------------------------------------------------------------------------
Do the fillin thing on each 1D row from a dataset sub-brick.
Return value is number of voxels filled in (-1 if an error transpired).
-----------------------------------------------------------------------------*/
int THD_dataset_rowfillin( THD_3dim_dataset * dset, int ival, int dcode, int maxgap )
{
int kind , xx,yy,zz , nrow , nx,ny,nz ;
int xtop,ytop,ztop , nff , nfftot=0 ;
ENTRY("THD_dataset_rowfillin") ;
if( !ISVALID_DSET(dset) ||
ival < 0 ||
ival >= DSET_NVALS(dset) ||
maxgap < 1 ) RETURN(-1) ; /* bad things */
kind = DSET_BRICK_TYPE(dset,ival) ;
if( kind != MRI_short && kind != MRI_byte && kind != MRI_float ) RETURN(-1) ; /* bad */
nrow = THD_get_dset_rowcount( dset , dcode ) ;
if( nrow < 1 ) RETURN(-1) ; /* bad */
nx = DSET_NX(dset) ;
ny = DSET_NY(dset) ;
nz = DSET_NZ(dset) ;
xtop = ytop = ztop = 1 ;
switch( dcode ){
case 1: case -1: ytop=ny ; ztop=nz ; break ;
case 2: case -2: xtop=nx ; ztop=nz ; break ;
case 3: case -3: xtop=nx ; ytop=ny ; break ;
}
switch( kind ){
case MRI_short:{
short * row ;
for( zz=0 ; zz < ztop ; zz++ )
for( yy=0 ; yy < ytop ; yy++ )
for( xx=0 ; xx < xtop ; xx++ ){
row = THD_get_dset_row( dset,ival , dcode,xx,yy,zz ) ;
nff = THD_rowfillin_short( nrow , row , maxgap ) ;
if( nff > 0 ){
THD_put_dset_row( dset,ival , dcode,xx,yy,zz , row ) ;
nfftot += nff ;
}
free(row) ;
}
}
break ;
case MRI_byte:{
byte * row ;
for( zz=0 ; zz < ztop ; zz++ )
for( yy=0 ; yy < ytop ; yy++ )
for( xx=0 ; xx < xtop ; xx++ ){
row = THD_get_dset_row( dset,ival , dcode,xx,yy,zz ) ;
nff = THD_rowfillin_byte( nrow , row , maxgap ) ;
if( nff > 0 ){
THD_put_dset_row( dset,ival , dcode,xx,yy,zz , row ) ;
nfftot += nff ;
}
free(row) ;
}
}
break ;
case MRI_float:{
float * row ;
for( zz=0 ; zz < ztop ; zz++ )
for( yy=0 ; yy < ytop ; yy++ )
for( xx=0 ; xx < xtop ; xx++ ){
row = THD_get_dset_row( dset,ival , dcode,xx,yy,zz ) ;
nff = THD_rowfillin_float( nrow , row , maxgap ) ;
if( nff > 0 ){
THD_put_dset_row( dset,ival , dcode,xx,yy,zz , row ) ;
nfftot += nff ;
}
free(row) ;
}
}
break ;
}
RETURN(nfftot) ;
}
syntax highlighted by Code2HTML, v. 0.9.1