1 /*****************************************************************************
2    Major portions of this software are copyrighted by the Medical College
3    of Wisconsin, 1994-2000, and are released under the Gnu General Public
4    License, Version 2.  See the file README.Copyright for details.
5 ******************************************************************************/
6 
7 #include "mrilib.h"
8 
9 /*** 7D SAFE ***/
10 
11 /*-------------------------------------------------------------------------*/
12 /*! Return the pointer to the data array in an MRI_IMAGE struct.
13 ---------------------------------------------------------------------------*/
14 
mri_data_pointer(MRI_IMAGE * im)15 void *mri_data_pointer(MRI_IMAGE *im )
16 {
17    void *data ;
18 
19    if( im == NULL ) return NULL ;  /* 27 Jul 2004 */
20 
21    if( im->fname != NULL && (im->fondisk & INPUT_DELAY) )
22       mri_input_delay( im ) ;
23    else if( MRI_IS_PURGED(im) ) /* 20 Dec 2006 */
24       mri_unpurge( im ) ;
25 
26    data = im->im ;
27    return data ;
28 }
29 
30 /*-------------------------------------------------------------------------*/
31 /*! Modify the data pointer in an MRI_IMAGE struct.
32 ---------------------------------------------------------------------------*/
33 
mri_fix_data_pointer(void * ptr,MRI_IMAGE * im)34 void mri_fix_data_pointer( void *ptr , MRI_IMAGE *im )
35 {
36    if( im == NULL ) return ;
37    im->im = ptr ;
38    return ;
39 }
40 
41 /*-------------------------------------------------------------------------*/
42 /*! Get rid of an MRI_IMAGE struct and all its contents.
43 ---------------------------------------------------------------------------*/
44 
mri_free(MRI_IMAGE * im)45 void mri_free( MRI_IMAGE *im )
46 {
47    void *ptr ;
48 
49 ENTRY("mri_free") ;
50    if( im == NULL ) EXRETURN ;
51    if( !mcw_malloc_OK(im) ){  /* 07 Oct 2015 */
52      ERROR_message("bad image ptr=%p passed to mri_free()",im) ;
53      TRACEBACK ;
54      ININFO_message(" [Not a fatal error - program continues - I hope]") ;
55      EXRETURN ;
56    }
57    STATUS("call killpurge") ;
58    mri_killpurge(im) ;  /* 20 Dec 2006 */
59    if( im->fname    != NULL ){ STATUS("free fname");    free(im->fname);    im->fname = NULL;    }
60    if( im->comments != NULL ){ STATUS("free comments"); free(im->comments); im->comments = NULL; }
61    im->fondisk = 0 ;
62    if( im->name != NULL ){ STATUS("free name"); free(im->name); im->name = NULL; }
63    ptr = mri_data_pointer(im) ;
64    if( ptr != NULL ){ STATUS("free ptr"); free(ptr); }
65 #if 0
66 INFO_message("---------- mri_free(%p)",im) ; TRACEBACK ; INFO_message("----------") ;
67 #endif
68    STATUS("free im"); free(im) ;
69    EXRETURN ;
70 }
71 
72 /*-------------------------------------------------------------------------*/
73 /* Delete the data, but keep the shell of the image */
74 
mri_clear(MRI_IMAGE * im)75 void mri_clear( MRI_IMAGE *im )  /* 31 Jan 2007 */
76 {
77   void *ptr ;
78   if( im == NULL ) return ;
79   mri_killpurge(im) ;
80   ptr = mri_data_pointer(im) ;
81   if( ptr != NULL ){ free(ptr); mri_fix_data_pointer(NULL,im); }
82   return ;
83 }
84 
85 /*-------------------------------------------------------------------------*/
86 /*! Return the size (bytes) of one data element of the given type.
87 ---------------------------------------------------------------------------*/
88 
mri_datum_size(MRI_TYPE typ)89 int mri_datum_size( MRI_TYPE typ )
90 {
91    switch( typ ){
92      case MRI_byte:    return sizeof(byte) ;
93      case MRI_short:   return sizeof(short) ;
94      case MRI_int:     return sizeof(int) ;
95      case MRI_float:   return sizeof(float) ;
96      case MRI_double:  return sizeof(double) ;
97      case MRI_complex: return sizeof(complex) ;
98      case MRI_rgb:     return 3*sizeof(byte) ;
99      case MRI_rgba:    return sizeof(rgba) ;
100      default:          return 0 ;
101    }
102 }
103 
104 /*-------------------------------------------------------------------------*/
105 /* Replaces former MRI_DIMENSIONALITY macro.  [12 Dec 2007] */
106 
mri_dimensionality(MRI_IMAGE * im)107 int mri_dimensionality( MRI_IMAGE *im )
108 {
109   if( im == NULL ) return 0 ;
110   if( im->nw > 1 ) return 7 ;
111   if( im->nv > 1 ) return 6 ;
112   if( im->nu > 1 ) return 5 ;
113   if( im->nt > 1 ) return 4 ;
114   if( im->nz > 1 ) return 3 ;
115   if( im->ny > 1 ) return 2 ;
116   return 1;
117 }
118 
119 /*-------------------------------------------------------------------------*/
120 /*! Replace the guts of MRI_IMAGE struct qim with those of zim.
121     Afterwards, what's left of zim is mri_free()-ed, so don't ever refer
122     to it again. If you want a copy of an image, use mri_copy() instead.
123 ---------------------------------------------------------------------------*/
124 
mri_move_guts(MRI_IMAGE * qim,MRI_IMAGE * zim)125 void mri_move_guts( MRI_IMAGE *qim , MRI_IMAGE *zim )
126 {
127    void *ptr ;
128 
129 ENTRY("mri_move_guts") ;
130 
131    if( qim == NULL || zim == NULL ) EXRETURN ;  /* stupid caller */
132 
133    /* destroy the contents inside qim, if any */
134 
135    if( qim->fname != NULL ) free(qim->fname) ;
136    if( qim->name  != NULL ) free(qim->name) ;
137    ptr = mri_data_pointer(qim) ;
138    if( ptr != NULL ) free(ptr) ;
139 
140    /* put the contents of zim in their place */
141 
142    *qim = *zim ;
143 
144    /* NULL out the contents of zim that are pointers */
145 
146    mri_fix_data_pointer( NULL , zim ) ;
147    zim->name  = NULL ;
148    zim->fname = NULL ;
149    EXRETURN ;
150 }
151 
152 /*---------------- added fake rint() 12 Feb 2001 ---------------*/
153 
154 #ifdef NO_RINT
rint(double x)155 double rint( double x )
156 {
157    int nn ;
158 
159    if( x >= 0.0 ) nn = (int)(x+0.49999999) ;
160    else           nn = (int)(x-0.49999999) ;
161    return (double)nn ;
162 }
163 #endif
164