/*****************************************************************************
Major portions of this software are copyrighted by the Medical College
of Wisconsin, 1994-2000, and are released under the Gnu General Public
License, Version 2. See the file README.Copyright for details.
******************************************************************************/
#include "mrilib.h"
#include "string.h"
/*** NOT 7D SAFE ***/
/** only works on short and byte images **/
MRI_IMAGE * mri_nsize( MRI_IMAGE * imin )
{
MRI_IMAGE * imout = NULL ;
int nx , ny , ntop , nxpad , nypad , ix,jy,ioff , ii;
if( imin == NULL ){
fprintf(stderr,"\n*** mri_nsize: NULL image passed as input!\n") ;
return NULL ;
}
if( ! MRI_IS_2D(imin) ){
fprintf(stderr,"\n*** mri_nsize only works on 2D images!\n") ;
EXIT(1) ;
}
nx = imin->nx ; ny = imin->ny ;
ntop = MAX(nx,ny) ;
if( ntop <= 32 ) ntop = 32 ; /* next power of 2 */
else if( ntop <= 64 ) ntop = 64 ;
else if( ntop <= 128 ) ntop = 128 ;
else if( ntop <= 256 ) ntop = 256 ;
else if( ntop <= 512 ) ntop = 512 ;
else if( ntop <=1024 ) ntop =1024 ;
else {
fprintf(stderr,"\n*** mri_nsize: cannot scale up %d x %d images!\n",nx,ny) ;
return NULL ;
}
switch( imin->kind ){
case MRI_short:{
short * ptin , * ptout ;
imout = mri_new( ntop,ntop , MRI_short ) ;
ptin = mri_data_pointer( imin ) ;
ptout = mri_data_pointer( imout ) ;
for( ii=0 ; ii < ntop*ntop ; ii++ ) ptout[ii] = 0 ;
nxpad = (ntop-nx) / 2 ;
nypad = (ntop-ny) / 2 ;
for( jy=0 ; jy < ny ; jy++ ){
ioff = (jy+nypad) * ntop + nxpad ;
for( ix=0 ; ix < nx ; ix++ )
ptout[ix+ioff] = ptin[ix+jy*nx] ;
}
}
break ;
case MRI_byte:{
byte * ptin , * ptout ;
imout = mri_new( ntop,ntop , MRI_byte ) ;
ptin = mri_data_pointer( imin ) ;
ptout = mri_data_pointer( imout ) ;
for( ii=0 ; ii < ntop*ntop ; ii++ ) ptout[ii] = 0 ;
nxpad = (ntop-nx) / 2 ;
nypad = (ntop-ny) / 2 ;
for( jy=0 ; jy < ny ; jy++ ){
ioff = (jy+nypad) * ntop + nxpad ;
for( ix=0 ; ix < nx ; ix++ )
ptout[ix+ioff] = ptin[ix+jy*nx] ;
}
}
break ;
case MRI_int:{
int * ptin , * ptout ;
imout = mri_new( ntop,ntop , MRI_int ) ;
ptin = mri_data_pointer( imin ) ;
ptout = mri_data_pointer( imout ) ;
for( ii=0 ; ii < ntop*ntop ; ii++ ) ptout[ii] = 0 ;
nxpad = (ntop-nx) / 2 ;
nypad = (ntop-ny) / 2 ;
for( jy=0 ; jy < ny ; jy++ ){
ioff = (jy+nypad) * ntop + nxpad ;
for( ix=0 ; ix < nx ; ix++ )
ptout[ix+ioff] = ptin[ix+jy*nx] ;
}
}
break ;
case MRI_float:{
float * ptin , * ptout ;
imout = mri_new( ntop,ntop , MRI_float ) ;
ptin = mri_data_pointer( imin ) ;
ptout = mri_data_pointer( imout ) ;
for( ii=0 ; ii < ntop*ntop ; ii++ ) ptout[ii] = 0 ;
nxpad = (ntop-nx) / 2 ;
nypad = (ntop-ny) / 2 ;
for( jy=0 ; jy < ny ; jy++ ){
ioff = (jy+nypad) * ntop + nxpad ;
for( ix=0 ; ix < nx ; ix++ )
ptout[ix+ioff] = ptin[ix+jy*nx] ;
}
}
break ;
case MRI_double:{
double * ptin , * ptout ;
imout = mri_new( ntop,ntop , MRI_double ) ;
ptin = mri_data_pointer( imin ) ;
ptout = mri_data_pointer( imout ) ;
for( ii=0 ; ii < ntop*ntop ; ii++ ) ptout[ii] = 0 ;
nxpad = (ntop-nx) / 2 ;
nypad = (ntop-ny) / 2 ;
for( jy=0 ; jy < ny ; jy++ ){
ioff = (jy+nypad) * ntop + nxpad ;
for( ix=0 ; ix < nx ; ix++ )
ptout[ix+ioff] = ptin[ix+jy*nx] ;
}
}
break ;
case MRI_complex:{
complex * ptin , * ptout ;
imout = mri_new( ntop,ntop , MRI_complex ) ;
ptin = mri_data_pointer( imin ) ;
ptout = mri_data_pointer( imout ) ;
for( ii=0 ; ii < ntop*ntop ; ii++ ) ptout[ii].r = ptout[ii].i = 0 ;
nxpad = (ntop-nx) / 2 ;
nypad = (ntop-ny) / 2 ;
for( jy=0 ; jy < ny ; jy++ ){
ioff = (jy+nypad) * ntop + nxpad ;
for( ix=0 ; ix < nx ; ix++ )
ptout[ix+ioff] = ptin[ix+jy*nx] ;
}
}
break ;
}
MRI_COPY_AUX(imout,imin) ;
return imout ;
}
syntax highlighted by Code2HTML, v. 0.9.1