Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

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_IMAGEmri_rgba_composite_array (MRI_IMARR *imar, float alpha)
MRI_IMAGEmri_rgba_composite_VA (float alpha,...)
MRI_IMAGEmri_rgba_composite_two (float alpha, MRI_IMAGE *i1, MRI_IMAGE *i2)

Define Documentation

#define MAX_OPACITY   0.95
 


Function Documentation

MRI_IMAGE* mri_rgba_composite_array MRI_IMARR   imar,
float    alpha
 

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 }

MRI_IMAGE* mri_rgba_composite_two float    alpha,
MRI_IMAGE   i1,
MRI_IMAGE   i2
 

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 }

MRI_IMAGE* mri_rgba_composite_VA float    alpha,
...   
 

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 }
 

Powered by Plone

This site conforms to the following standards: