Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
mri_overlay.c
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 #include "mrilib.h"
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 void mri_overlay_2D( MRI_IMAGE *imbase , MRI_IMAGE *imover , int ix , int jy )
00021 {
00022    byte *ba , *ov ;
00023    int nxba,nyba , nxov,nyov , jj , nxxov,nyyov , psiz ;
00024    MRI_IMAGE *imov ;
00025 
00026 ENTRY("mri_overlay_2D") ;
00027 
00028    if( imbase == NULL || imover == NULL ){
00029 STATUS("bad inputs") ;
00030      EXRETURN ;  
00031    }
00032 
00033    
00034 
00035    if( imbase->kind == imover->kind ){
00036      STATUS("direct overlay possible") ;
00037      imov = imover ;
00038    } else if( imbase->kind == MRI_byte && imover->kind == MRI_rgb ){
00039      STATUS("conversion to byte needed") ;
00040      imov = mri_to_byte( imover ) ;
00041    } else if( imbase->kind == MRI_rgb  && imover->kind == MRI_byte ){
00042      STATUS("conversion to RGB needed") ;
00043      imov = mri_to_rgb( imover ) ;
00044    } else {
00045      if(PRINT_TRACING){
00046        char str[256] ;
00047        sprintf(str,"incompatible inputs: imbase=%s imover=%s",
00048                MRI_TYPE_NAME(imbase) , MRI_TYPE_NAME(imover) ) ;
00049        STATUS(str);
00050      }
00051      EXRETURN ;   
00052    }
00053 
00054    
00055 
00056    nxba = imbase->nx ; nyba = imbase->ny ; ba = mri_data_pointer(imbase) ;
00057    nxov = imov  ->nx ; nyov = imov  ->ny ; ov = mri_data_pointer(imov  ) ;
00058    psiz = imbase->pixel_size ;
00059 
00060    if( ix >= nxba || jy >= nyba ){          
00061 STATUS("overlay oompossible") ;
00062      if( imov != imover ) mri_free(imov) ;
00063      EXRETURN ;
00064    }
00065 
00066    
00067 
00068    if( ix < 0 ){
00069      ix = nxba + ix ;
00070      if( ix < 0 ){ 
00071       STATUS("ix < 0"); if( imov != imover ) mri_free(imov); EXRETURN;
00072      }
00073    }
00074    if( jy < 0 ){
00075      jy = nyba + jy ;
00076      if( jy < 0 ){ 
00077       STATUS("jy < 0"); if( imov != imover ) mri_free(imov); EXRETURN;
00078      }
00079    }
00080 
00081    nxxov = nxov ;                           
00082    if( ix+nxov > nxba ) nxxov = nxba - ix ; 
00083 
00084    nyyov = nyov ;                           
00085    if( jy+nyov > nyba ) nyyov = nyba - jy ; 
00086 
00087    
00088 STATUS("overlaying now") ;
00089 
00090    for( jj=0 ; jj < nyyov ; jj++ )
00091      memcpy( ba + ((jy+jj)*nxba + ix)*psiz , ov + jj*nxov*psiz , nxxov*psiz ) ;
00092 
00093    if( imov != imover ) mri_free(imov) ;  
00094    EXRETURN ;
00095 }