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