Doxygen Source Code Documentation
mri_rgba_compose.c File Reference
#include "mrilib.h"
#include <stdarg.h>
Go to the source code of this file.
Defines | |
#define | MAX_OPACITY 0.95 |
Functions | |
MRI_IMAGE * | mri_rgba_composite_array (MRI_IMARR *imar, float alpha) |
MRI_IMAGE * | mri_rgba_composite_VA (float alpha,...) |
MRI_IMAGE * | mri_rgba_composite_two (float alpha, MRI_IMAGE *i1, MRI_IMAGE *i2) |
Define Documentation
|
|
Function Documentation
|
Composite a collection of MRI_rgb/MRI_rgba/MRI_byte images. The first image is on top, etc. For MRI_rgb/MRI_byte images, the default opacity is alpha in 0..1. Black (0,0,0) pixels on input are not overlaid (unless AFNI_OVERLAY_ZERO is YES). The output image is MRI_rgb; it is composited against a black backdrop. --------------------------------------------------------------------------- Definition at line 11 of file mri_rgba_compose.c. References rgba::a, AFNI_yesenv(), rgba::b, rgbyte::b, ENTRY, free, rgba::g, rgbyte::g, IMARR_COUNT, IMARR_SUBIM, MRI_IMAGE::kind, malloc, MRI_BYTE_PTR, mri_new_conforming, MRI_RGB_PTR, MRI_RGBA_PTR, MRI_IMAGE::nvox, rgba::r, rgbyte::r, and RETURN. Referenced by mri_rgba_composite_two(), and mri_rgba_composite_VA().
00012 { 00013 register int npix,ii,jj , nn,nim ; 00014 MRI_IMAGE *outim , *inim ; 00015 rgbyte *outar ; 00016 float *usop ; 00017 int reject_zero = !AFNI_yesenv("AFNI_OVERLAY_ZERO") ; 00018 00019 ENTRY("mri_rgba_composite") ; 00020 00021 if( imar == NULL || IMARR_COUNT(imar) == 0 ) RETURN(NULL) ; 00022 00023 if( alpha <= 0.0 || alpha > 1.0 ) alpha = 1.0 ; /* default default */ 00024 00025 nim = IMARR_COUNT(imar) ; 00026 outim = mri_new_conforming( IMARR_SUBIM(imar,0) , MRI_rgb ) ; 00027 outar = (rgbyte *) MRI_RGB_PTR(outim) ; /* is all zero */ 00028 npix = outim->nvox ; 00029 00030 usop = (float *) malloc(sizeof(float)*npix) ; /* used up opacity */ 00031 for( ii=0 ; ii < npix ; ii++ ) usop[ii] = 0.0 ; 00032 00033 #undef MAX_OPACITY 00034 #define MAX_OPACITY 0.95 00035 00036 for( nn=0 ; nn < nim ; nn++ ){ 00037 inim = IMARR_SUBIM(imar,nn) ; 00038 if( inim->nvox < npix ) continue ; /* bad */ 00039 00040 switch( inim->kind ){ 00041 default: break ; /* bad */ 00042 00043 case MRI_byte:{ 00044 byte *inar = (byte *) MRI_BYTE_PTR(inim) , val ; 00045 register float opa ; 00046 for( ii=0 ; ii < npix ; ii++ ){ 00047 if( reject_zero && inar[ii]==0 ) continue ; 00048 if( usop[ii] < MAX_OPACITY ){ 00049 00050 opa = alpha * (1.0-usop[ii]) ; usop[ii] += opa ; 00051 val = (byte)( opa * inar[ii] ) ; 00052 00053 outar[ii].r += val ; 00054 outar[ii].g += val ; 00055 outar[ii].b += val ; 00056 } 00057 } 00058 } 00059 00060 case MRI_rgb:{ 00061 rgbyte *inar = (rgbyte *) MRI_RGB_PTR(inim) ; 00062 register float opa ; 00063 for( ii=0 ; ii < npix ; ii++ ){ 00064 if( reject_zero && inar[ii].r==0 00065 && inar[ii].g==0 && inar[ii].b==0 ) continue ; 00066 if( usop[ii] < MAX_OPACITY ){ 00067 00068 opa = alpha * (1.0-usop[ii]) ; usop[ii] += opa ; 00069 00070 outar[ii].r += (byte)( opa * inar[ii].r ) ; 00071 outar[ii].g += (byte)( opa * inar[ii].g ) ; 00072 outar[ii].b += (byte)( opa * inar[ii].b ) ; 00073 } 00074 } 00075 } 00076 break ; 00077 00078 case MRI_rgba:{ 00079 rgba *inar = (rgba *) MRI_RGBA_PTR(inim) ; 00080 register float opa ; 00081 for( ii=0 ; ii < npix ; ii++ ){ 00082 if( reject_zero && inar[ii].r==0 00083 && inar[ii].g==0 && inar[ii].b==0 ) continue ; 00084 if( usop[ii] < MAX_OPACITY ){ 00085 00086 opa = 0.00392156*inar[ii].a * (1.0-usop[ii]) ; usop[ii] += opa ; 00087 00088 outar[ii].r += (byte)( opa * inar[ii].r ) ; 00089 outar[ii].g += (byte)( opa * inar[ii].g ) ; 00090 outar[ii].b += (byte)( opa * inar[ii].b ) ; 00091 } 00092 } 00093 } 00094 break ; 00095 } 00096 } 00097 00098 free(usop) ; RETURN(outim) ; 00099 } |
|
Definition at line 130 of file mri_rgba_compose.c. References ADDTO_IMARR, FREE_IMARR, i1, i2, INIT_IMARR, and mri_rgba_composite_array().
00131 { 00132 MRI_IMARR *imar ; MRI_IMAGE *im ; 00133 INIT_IMARR(imar) ; 00134 ADDTO_IMARR(imar,i1) ; ADDTO_IMARR(imar,i2) ; 00135 im = mri_rgba_composite_array( imar , alpha ) ; 00136 FREE_IMARR(imar) ; return im ; 00137 } |
|
Definition at line 105 of file mri_rgba_compose.c. References ADDTO_IMARR, FREE_IMARR, INIT_IMARR, and mri_rgba_composite_array().
00106 { 00107 MRI_IMARR *imar=NULL ; 00108 MRI_IMAGE *im ; 00109 va_list vararg_ptr ; 00110 00111 va_start( vararg_ptr , alpha ) ; 00112 00113 while(1){ 00114 im = va_arg( vararg_ptr , MRI_IMAGE * ) ; 00115 if( im == NULL ) break ; 00116 if( imar == NULL ) INIT_IMARR(imar) ; 00117 ADDTO_IMARR(imar,im) ; 00118 } 00119 00120 va_end( vararg_ptr ) ; 00121 00122 if( imar == NULL ) return NULL ; 00123 im = mri_rgba_composite_array( imar , alpha ) ; 00124 00125 FREE_IMARR(imar) ; return im ; 00126 } |