Doxygen Source Code Documentation
thd_dsetrow.c File Reference
#include "mrilib.h"
Go to the source code of this file.
Functions | |
int | THD_get_dset_rowcount (THD_3dim_dataset *dset, int dcode) |
void * | THD_get_dset_row (THD_3dim_dataset *dset, int ival, int dcode, int xx, int yy, int zz) |
void | THD_put_dset_row (THD_3dim_dataset *dset, int ival, int dcode, int xx, int yy, int zz, void *row) |
Function Documentation
|
Extract a row from a dataset sub-brick in the direction given by dcode. The 3-index of a voxel from the row is in (xx,yy,zz). The return value is a pointer to a malloc()-ed array, whose type is given by DSET_BRICK_TYPE(dset,ival) and whose length is given by THD_get_dset_rowcount(dset,dcode). If NULL is returned, something bad happened. N.B.: dcode < 0 ==> data is extracted in the reverse direction. ----------------------------------------------------------------------------- Definition at line 41 of file thd_dsetrow.c. References AFMALL, DSET_ARRAY, DSET_BRICK_TYPE, DSET_NX, DSET_NY, DSET_NZ, ENTRY, free, mri_datum_size(), nz, RETURN, and THD_get_dset_rowcount(). Referenced by main(), THD_dataset_rowfillin(), and THD_dataset_zfillin().
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 /*-- We will extract brick[kbot+i*kdel] for i=0..nrow-1 --*/ 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 /*-- extract row, based on kind of data in sub-brick --*/ 00080 00081 switch( kind ){ 00082 00083 default: free(row) ; RETURN(NULL) ; /* bad */ 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 } |
|
Get the number of elements in a row of the dataset in a particular direction given by dcode:
Definition at line 20 of file thd_dsetrow.c. References DSET_NX, DSET_NY, DSET_NZ, and ISVALID_DSET. Referenced by THD_dataset_rowfillin(), THD_dataset_zfillin(), THD_get_dset_row(), and THD_put_dset_row().
00021 { 00022 if( !ISVALID_DSET(dset) ) return 0 ; /* bad */ 00023 switch( dcode ){ 00024 case 1: case -1: return DSET_NX(dset) ; /* good */ 00025 case 2: case -2: return DSET_NY(dset) ; /* good */ 00026 case 3: case -3: return DSET_NZ(dset) ; /* good */ 00027 } 00028 return 0 ; /* bad */ 00029 } |
|
Definition at line 146 of file thd_dsetrow.c. References DSET_ARRAY, DSET_BRICK_TYPE, DSET_NX, DSET_NY, DSET_NZ, ENTRY, nz, and THD_get_dset_rowcount(). Referenced by main(), THD_dataset_rowfillin(), and THD_dataset_zfillin().
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 /*-- We will insert brick[kbot+i*kdel] for i=0..nrow-1 --*/ 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 /*-- insert row, based on kind of data in sub-brick --*/ 00184 00185 switch( kind ){ 00186 00187 default: EXRETURN ; /* bad */ 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 } |