1 #include "mrilib.h"
2
mri_to_rgba(MRI_IMAGE * oldim)3 MRI_IMAGE *mri_to_rgba( MRI_IMAGE *oldim ) /* 11 Feb 1999 */
4 {
5 MRI_IMAGE *newim ;
6 register int ii , npix ;
7 register rgba * oar ;
8
9 ENTRY("mri_to_rgba") ;
10
11 if( oldim == NULL ) RETURN( NULL );
12
13 newim = mri_new_conforming( oldim , MRI_rgba ) ; oar = MRI_RGBA_PTR(newim) ;
14 npix = oldim->nvox ;
15
16 switch( oldim->kind ){
17
18 case MRI_byte:{ byte *qar = MRI_BYTE_PTR(oldim) ;
19 for( ii=0 ; ii < npix ; ii++ ){
20 oar[ii].r = oar[ii].g = oar[ii].b = qar[ii] ;
21 oar[ii].a = 255 ;
22 }
23 } break ;
24
25 case MRI_float:{ float *qar = MRI_FLOAT_PTR(oldim) ;
26 for( ii=0 ; ii < npix ; ii++ ){
27 oar[ii].r = oar[ii].g = oar[ii].b = qar[ii] ;
28 oar[ii].a = 255 ;
29 }
30 } break ;
31
32 case MRI_short:{ short *qar = MRI_SHORT_PTR(oldim) ;
33 for( ii=0 ; ii < npix ; ii++ ){
34 oar[ii].r = oar[ii].g = oar[ii].b = qar[ii] ;
35 oar[ii].a = 255 ;
36 }
37 } break ;
38
39 case MRI_rgb:{ byte *qar = MRI_RGB_PTR(oldim) ;
40 for( ii=0 ; ii < npix ; ii++ ){
41 oar[ii].r = qar[3*ii] ;
42 oar[ii].g = qar[3*ii+1] ;
43 oar[ii].b = qar[3*ii+2] ;
44 oar[ii].a = 255 ; /* maximum opacity */
45 }
46 } break ;
47
48 case MRI_rgba:{ rgba *qar = MRI_RGBA_PTR(oldim) ;
49 memcpy( oar , qar , sizeof(rgba)*npix ) ;
50 } break ;
51
52 default:
53 fprintf(stderr,"mri_to_rgb: unrecognized image conversion %d\n",oldim->kind) ;
54 RETURN( NULL );
55 }
56
57 MRI_COPY_AUX(newim,oldim) ;
58 RETURN( newim );
59 }
60
61 /*---------------------------------------------------------------------------
62 Inputs must be in same formats (# voxels and kinds - byte or float)!
63 -----------------------------------------------------------------------------*/
64
mri_4to_rgba(MRI_IMAGE * rim,MRI_IMAGE * gim,MRI_IMAGE * bim,MRI_IMAGE * aim)65 MRI_IMAGE * mri_4to_rgba( MRI_IMAGE *rim , MRI_IMAGE *gim , MRI_IMAGE *bim , MRI_IMAGE *aim )
66 {
67 MRI_IMAGE *newim ;
68 register int ii , npix ;
69 register rgba * pval ;
70
71 ENTRY("mri_4to_rgba") ;
72
73 if( rim == NULL || bim == NULL || gim == NULL || aim == NULL ) RETURN( NULL );
74
75 newim = mri_new_conforming( rim , MRI_rgba ) ; pval = MRI_RGBA_PTR(newim) ;
76 npix = rim->nvox ;
77
78 switch( rim->kind ){
79
80 case MRI_byte:{
81 byte *rr=MRI_BYTE_PTR(rim), *gg=MRI_BYTE_PTR(gim), *bb=MRI_BYTE_PTR(bim), *aa=MRI_BYTE_PTR(aim);
82 for( ii=0 ; ii < npix ; ii++ ){
83 pval[ii].r = rr[ii] ;
84 pval[ii].g = gg[ii] ;
85 pval[ii].b = bb[ii] ;
86 pval[ii].a = aa[ii] ;
87 }
88 }
89 break ;
90
91 case MRI_float:{
92 float *rr=MRI_FLOAT_PTR(rim), *gg=MRI_FLOAT_PTR(gim), *bb=MRI_FLOAT_PTR(bim), *aa=MRI_FLOAT_PTR(aim);
93 for( ii=0 ; ii < npix ; ii++ ){
94 pval[ii].r = BYTEIZE(rr[ii]) ;
95 pval[ii].g = BYTEIZE(gg[ii]) ;
96 pval[ii].b = BYTEIZE(bb[ii]) ;
97 pval[ii].a = BYTEIZE(aa[ii]) ;
98 }
99 }
100 break ;
101
102 default:
103 ERROR_message("mri_3to_rgb: unrecognized image conversion %d",rim->kind) ;
104 mri_free(newim) ; RETURN(NULL) ;
105 }
106
107 MRI_COPY_AUX(newim,rim) ;
108 RETURN( newim );
109 }
110
111 /*-------------------------------------------------------------------------------*/
112
mri_rgba_to_4float(MRI_IMAGE * oldim)113 MRI_IMARR * mri_rgba_to_4float( MRI_IMAGE *oldim )
114 {
115 MRI_IMARR *imar ;
116 MRI_IMAGE *rim , *gim , *bim , *aim ;
117 float *rr , *gg , *bb , *aa;
118 rgba *pval ;
119 int ii , npix ;
120
121 ENTRY("mri_rgba_to_4float") ;
122
123 if( oldim == NULL || oldim->kind != MRI_rgba ) RETURN( NULL );
124
125 rim = mri_new_conforming( oldim , MRI_float ) ; rr = MRI_FLOAT_PTR(rim) ;
126 gim = mri_new_conforming( oldim , MRI_float ) ; gg = MRI_FLOAT_PTR(gim) ;
127 bim = mri_new_conforming( oldim , MRI_float ) ; bb = MRI_FLOAT_PTR(bim) ;
128 aim = mri_new_conforming( oldim , MRI_float ) ; aa = MRI_FLOAT_PTR(aim) ;
129 pval= MRI_RGBA_PTR(oldim);
130 npix = oldim->nvox ;
131
132 for( ii=0 ; ii < npix ; ii++ ){
133 rr[ii] = (float)pval[ii].r ;
134 gg[ii] = (float)pval[ii].g ;
135 bb[ii] = (float)pval[ii].b ;
136 aa[ii] = (float)pval[ii].a ;
137 }
138
139 INIT_IMARR(imar) ;
140 ADDTO_IMARR(imar,rim) ; ADDTO_IMARR(imar,gim) ; ADDTO_IMARR(imar,bim) ;
141
142 RETURN( imar );
143 }
144
145 /*-------------------------------------------------------------------------------*/
146
mri_rgba_to_4byte(MRI_IMAGE * oldim)147 MRI_IMARR * mri_rgba_to_4byte( MRI_IMAGE *oldim )
148 {
149 MRI_IMARR *imar ;
150 MRI_IMAGE *rim , *gim , *bim , *aim ;
151 byte *rr , *gg , *bb , *aa ;
152 rgba *pval ;
153 int ii , npix ;
154
155 ENTRY("mri_rgba_to_4byte") ;
156 if( oldim == NULL || oldim->kind != MRI_rgba ) RETURN( NULL );
157
158 rim = mri_new_conforming( oldim , MRI_byte ) ; rr = MRI_BYTE_PTR(rim) ;
159 gim = mri_new_conforming( oldim , MRI_byte ) ; gg = MRI_BYTE_PTR(gim) ;
160 bim = mri_new_conforming( oldim , MRI_byte ) ; bb = MRI_BYTE_PTR(bim) ;
161 aim = mri_new_conforming( oldim , MRI_byte ) ; aa = MRI_BYTE_PTR(aim) ;
162 pval= MRI_RGBA_PTR(oldim);
163 npix = oldim->nvox ;
164
165 for( ii=0 ; ii < npix ; ii++ ){
166 rr[ii] = pval[ii].r ;
167 gg[ii] = pval[ii].g ;
168 bb[ii] = pval[ii].b ;
169 aa[ii] = pval[ii].a ;
170 }
171
172 INIT_IMARR(imar) ;
173 ADDTO_IMARR(imar,rim) ; ADDTO_IMARR(imar,gim) ; ADDTO_IMARR(imar,bim) ;
174
175 RETURN( imar );
176 }
177