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 }