Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
thd_dsetrow.c
Go to the documentation of this file.00001 #include "mrilib.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 int THD_get_dset_rowcount( THD_3dim_dataset *dset, int dcode )
00021 {
00022 if( !ISVALID_DSET(dset) ) return 0 ;
00023 switch( dcode ){
00024 case 1: case -1: return DSET_NX(dset) ;
00025 case 2: case -2: return DSET_NY(dset) ;
00026 case 3: case -3: return DSET_NZ(dset) ;
00027 }
00028 return 0 ;
00029 }
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 void * THD_get_dset_row( THD_3dim_dataset *dset, int ival,
00042 int dcode , int xx,int yy,int zz )
00043 {
00044 void *row , *brick ;
00045 int nrow , kind , nx,ny,nz,nxy , kbot,kdel,kk,ii ;
00046
00047 ENTRY("THD_get_dset_row") ;
00048
00049 nrow = THD_get_dset_rowcount( dset , dcode ) ;
00050 if( nrow < 1 ) RETURN(NULL) ;
00051
00052 nx = DSET_NX(dset) ;
00053 ny = DSET_NY(dset) ; nxy = nx*ny ;
00054 nz = DSET_NZ(dset) ;
00055
00056
00057
00058 switch( dcode ){
00059 case 1: case -1:
00060 if( yy < 0 || yy >= ny || zz < 0 || zz >= nz ) RETURN(NULL) ;
00061 kbot = yy*nx + zz*nxy ; kdel = 1 ;
00062 break ;
00063
00064 case 2: case -2:
00065 if( xx < 0 || xx >= nx || zz < 0 || zz >= nz ) RETURN(NULL) ;
00066 kbot = xx + zz*nxy ; kdel = nx ;
00067 break ;
00068
00069 case 3: case -3:
00070 if( xx < 0 || xx >= nx || yy < 0 || yy >= ny ) RETURN(NULL) ;
00071 kbot = xx + yy*nx ; kdel = nxy ;
00072 break ;
00073 }
00074
00075 kind = DSET_BRICK_TYPE(dset,ival) ;
00076 brick = DSET_ARRAY(dset,ival) ;
00077 row = AFMALL(void, mri_datum_size((MRI_TYPE)kind) * nrow ) ;
00078
00079
00080
00081 switch( kind ){
00082
00083 default: free(row) ; RETURN(NULL) ;
00084
00085 case MRI_short:{
00086 short *rr = (short *)row , *bb = (short *)brick ;
00087 if( dcode > 0 )
00088 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) rr[ii] = bb[kk+kbot] ;
00089 else
00090 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) rr[nrow-1-ii] = bb[kk+kbot] ;
00091 }
00092 break ;
00093
00094 case MRI_byte:{
00095 byte *rr = (byte *)row , *bb = (byte *)brick ;
00096 if( dcode > 0 )
00097 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) rr[ii] = bb[kk+kbot] ;
00098 else
00099 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) rr[nrow-1-ii] = bb[kk+kbot] ;
00100 }
00101 break ;
00102
00103 case MRI_float:{
00104 float *rr = (float *)row , *bb = (float *)brick ;
00105 if( dcode > 0 )
00106 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) rr[ii] = bb[kk+kbot] ;
00107 else
00108 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) rr[nrow-1-ii] = bb[kk+kbot] ;
00109 }
00110 break ;
00111
00112 case MRI_complex:{
00113 complex *rr = (complex *)row , *bb = (complex *)brick ;
00114 if( dcode > 0 )
00115 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) rr[ii] = bb[kk+kbot] ;
00116 else
00117 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) rr[nrow-1-ii] = bb[kk+kbot] ;
00118 }
00119 break ;
00120
00121 case MRI_rgb:{
00122 byte *rr = (byte *)row , *bb = (byte *)brick ;
00123 if( dcode > 0 )
00124 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ){
00125 rr[3*ii ] = bb[3*(kk+kbot) ] ;
00126 rr[3*ii+1] = bb[3*(kk+kbot)+1] ;
00127 rr[3*ii+2] = bb[3*(kk+kbot)+2] ;
00128 }
00129 else
00130 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ){
00131 rr[3*(nrow-1-ii) ] = bb[3*(kk+kbot) ] ;
00132 rr[3*(nrow-1-ii)+1] = bb[3*(kk+kbot)+1] ;
00133 rr[3*(nrow-1-ii)+2] = bb[3*(kk+kbot)+2] ;
00134 }
00135 }
00136 break ;
00137 }
00138
00139 RETURN(row) ;
00140 }
00141
00142
00143
00144
00145
00146 void THD_put_dset_row( THD_3dim_dataset *dset, int ival,
00147 int dcode, int xx,int yy,int zz, void *row )
00148 {
00149 void *brick ;
00150 int nrow , kind , nx,ny,nz,nxy , kbot,kdel,kk,ii ;
00151
00152 ENTRY("THD_put_dset_row") ;
00153
00154 nrow = THD_get_dset_rowcount( dset , dcode ) ;
00155 if( nrow < 1 ) EXRETURN ;
00156
00157 nx = DSET_NX(dset) ;
00158 ny = DSET_NY(dset) ; nxy = nx*ny ;
00159 nz = DSET_NZ(dset) ;
00160
00161
00162
00163 switch( dcode ){
00164 case 1: case -1:
00165 if( yy < 0 || yy >= ny || zz < 0 || zz >= nz ) EXRETURN ;
00166 kbot = yy*nx + zz*nxy ; kdel = 1 ;
00167 break ;
00168
00169 case 2: case -2:
00170 if( xx < 0 || xx >= nx || zz < 0 || zz >= nz ) EXRETURN ;
00171 kbot = xx + zz*nxy ; kdel = nx ;
00172 break ;
00173
00174 case 3: case -3:
00175 if( xx < 0 || xx >= nx || yy < 0 || yy >= ny ) EXRETURN ;
00176 kbot = xx + yy*nx ; kdel = nxy ;
00177 break ;
00178 }
00179
00180 kind = DSET_BRICK_TYPE(dset,ival) ;
00181 brick = DSET_ARRAY(dset,ival) ;
00182
00183
00184
00185 switch( kind ){
00186
00187 default: EXRETURN ;
00188
00189 case MRI_short:{
00190 short *rr = (short *)row , *bb = (short *)brick ;
00191 if( dcode > 0 )
00192 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) bb[kk+kbot] = rr[ii] ;
00193 else
00194 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) bb[kk+kbot] = rr[nrow-1-ii] ;
00195 }
00196 break ;
00197
00198 case MRI_byte:{
00199 byte *rr = (byte *)row , *bb = (byte *)brick ;
00200 if( dcode > 0 )
00201 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) bb[kk+kbot] = rr[ii] ;
00202 else
00203 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) bb[kk+kbot] = rr[nrow-1-ii] ;
00204 }
00205 break ;
00206
00207 case MRI_complex:{
00208 complex *rr = (complex *)row , *bb = (complex *)brick ;
00209 if( dcode > 0 )
00210 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) bb[kk+kbot] = rr[ii] ;
00211 else
00212 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) bb[kk+kbot] = rr[nrow-1-ii] ;
00213 }
00214 break ;
00215
00216 case MRI_float:{
00217 float *rr = (float *)row , *bb = (float *)brick ;
00218 if( dcode > 0 )
00219 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) bb[kk+kbot] = rr[ii] ;
00220 else
00221 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ) bb[kk+kbot] = rr[nrow-1-ii] ;
00222 }
00223 break ;
00224
00225 case MRI_rgb:{
00226 byte *rr = (byte *)row , *bb = (byte *)brick ;
00227 if( dcode > 0 )
00228 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ){
00229 bb[3*(kk+kbot) ] = rr[3*ii ] ;
00230 bb[3*(kk+kbot)+1] = rr[3*ii+1] ;
00231 bb[3*(kk+kbot)+2] = rr[3*ii+2] ;
00232 }
00233 else
00234 for( ii=kk=0 ; ii < nrow ; ii++,kk+=kdel ){
00235 bb[3*(kk+kbot) ] = rr[3*(nrow-1-ii) ] ;
00236 bb[3*(kk+kbot)+1] = rr[3*(nrow-1-ii)+1] ;
00237 bb[3*(kk+kbot)+2] = rr[3*(nrow-1-ii)+2] ;
00238 }
00239 }
00240 break ;
00241 }
00242
00243 EXRETURN ;
00244 }