text: /*
   * Copyright (C) 2011 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  /*$Id: db_feature_matching.cpp,v 1.4 2011/06/17 14:03:30 mbansal Exp $*/
  
  /*****************************************************************
  *    Lean and mean begins here                                   *
  *****************************************************************/
  
  #include "db_utilities.h"
  #include "db_feature_matching.h"
  #ifdef _VERBOSE_
  #include <iostream>
  #endif
  
  
  int AffineWarpPoint_NN_LUT_x[11][11];
  int AffineWarpPoint_NN_LUT_y[11][11];
  
  float AffineWarpPoint_BL_LUT_x[11][11];
  float AffineWarpPoint_BL_LUT_y[11][11];
  
  
  inline float db_SignedSquareNormCorr7x7_u(unsigned char **f_img,unsigned char **g_img,int x_f,int y_f,int x_g,int y_g)
  {
      unsigned char *pf,*pg;
      float f,g,fgsum,f2sum,g2sum,fsum,gsum,fg_corr,den;
      int xm_f,xm_g;
  
      xm_f=x_f-3;
      xm_g=x_g-3;
      fgsum=0.0; f2sum=0.0; g2sum=0.0; fsum=0.0; gsum=0.0;
  
      pf=f_img[y_f-3]+xm_f; pg=g_img[y_g-3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-2]+xm_f; pg=g_img[y_g-2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-1]+xm_f; pg=g_img[y_g-1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f]+xm_f; pg=g_img[y_g]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+1]+xm_f; pg=g_img[y_g+1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+2]+xm_f; pg=g_img[y_g+2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+3]+xm_f; pg=g_img[y_g+3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      fg_corr=49.0f*fgsum-fsum*gsum;
      den=(49.0f*f2sum-fsum*fsum)*(49.0f*g2sum-gsum*gsum);
      if(den!=0.0)
      {
          if(fg_corr>=0.0) return(fg_corr*fg_corr/den);
          return(-fg_corr*fg_corr/den);
      }
      return(0.0);
  }
  
  inline float db_SignedSquareNormCorr9x9_u(unsigned char **f_img,unsigned char **g_img,int x_f,int y_f,int x_g,int y_g)
  {
      unsigned char *pf,*pg;
      float f,g,fgsum,f2sum,g2sum,fsum,gsum,fg_corr,den;
      int xm_f,xm_g;
  
      xm_f=x_f-4;
      xm_g=x_g-4;
      fgsum=0.0; f2sum=0.0; g2sum=0.0; fsum=0.0; gsum=0.0;
  
      pf=f_img[y_f-4]+xm_f; pg=g_img[y_g-4]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-3]+xm_f; pg=g_img[y_g-3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-2]+xm_f; pg=g_img[y_g-2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-1]+xm_f; pg=g_img[y_g-1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f]+xm_f; pg=g_img[y_g]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+1]+xm_f; pg=g_img[y_g+1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+2]+xm_f; pg=g_img[y_g+2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+3]+xm_f; pg=g_img[y_g+3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+4]+xm_f; pg=g_img[y_g+4]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      fg_corr=81.0f*fgsum-fsum*gsum;
      den=(81.0f*f2sum-fsum*fsum)*(81.0f*g2sum-gsum*gsum);
      if(den!=0.0)
      {
          if(fg_corr>=0.0) return(fg_corr*fg_corr/den);
          return(-fg_corr*fg_corr/den);
      }
      return(0.0);
  }
  
  inline float db_SignedSquareNormCorr11x11_u(unsigned char **f_img,unsigned char **g_img,int x_f,int y_f,int x_g,int y_g)
  {
      unsigned char *pf,*pg;
      float f,g,fgsum,f2sum,g2sum,fsum,gsum,fg_corr,den;
      int xm_f,xm_g;
  
      xm_f=x_f-5;
      xm_g=x_g-5;
      fgsum=0.0; f2sum=0.0; g2sum=0.0; fsum=0.0; gsum=0.0;
  
      pf=f_img[y_f-5]+xm_f; pg=g_img[y_g-5]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-4]+xm_f; pg=g_img[y_g-4]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-3]+xm_f; pg=g_img[y_g-3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-2]+xm_f; pg=g_img[y_g-2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-1]+xm_f; pg=g_img[y_g-1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f]+xm_f; pg=g_img[y_g]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+1]+xm_f; pg=g_img[y_g+1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+2]+xm_f; pg=g_img[y_g+2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+3]+xm_f; pg=g_img[y_g+3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+4]+xm_f; pg=g_img[y_g+4]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+5]+xm_f; pg=g_img[y_g+5]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      fg_corr=121.0f*fgsum-fsum*gsum;
      den=(121.0f*f2sum-fsum*fsum)*(121.0f*g2sum-gsum*gsum);
      if(den!=0.0)
      {
          if(fg_corr>=0.0) return(fg_corr*fg_corr/den);
          return(-fg_corr*fg_corr/den);
      }
      return(0.0);
  }
  
  inline void db_SignedSquareNormCorr11x11_Pre_u(unsigned char **f_img,int x_f,int y_f,float *sum,float *recip)
  {
      unsigned char *pf;
      float den;
      int f,f2sum,fsum;
      int xm_f;
  
      xm_f=x_f-5;
  
      pf=f_img[y_f-5]+xm_f;
      f= *pf++; f2sum=f*f;  fsum=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f-4]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f-3]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f-2]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f-1]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f+1]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f+2]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f+3]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f+4]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f+5]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      *sum= (float) fsum;
      den=(121.0f*f2sum-fsum*fsum);
      *recip=(float)(((den!=0.0)?1.0/den:0.0));
  }
  
  inline void db_SignedSquareNormCorr5x5_PreAlign_u(short *patch,const unsigned char * const *f_img,int x_f,int y_f,float *sum,float *recip)
  {
      float den;
      int f2sum,fsum;
      int xm_f=x_f-2;
  
  #ifndef DB_USE_SSE2
      const unsigned char *pf;
      short f;
  
      pf=f_img[y_f-2]+xm_f;
      f= *pf++; f2sum=f*f; fsum=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f-1]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f+1]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f+2]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
      //int xwi;
      //int ywi;
      //f2sum=0;
      //fsum=0;
      //for (int r=-5;r<=5;r++){
      //  ywi=y_f+r;
      //  for (int c=-5;c<=5;c++){
      //      xwi=x_f+c;
      //      f=f_img[ywi][xwi];
      //      f2sum+=f*f;
      //      fsum+=f;
      //      (*patch++)=f;
      //  }
      //}
      (*patch++)=0; (*patch++)=0; (*patch++)=0; (*patch++)=0; (*patch++)=0;
      (*patch++)=0; (*patch++)=0;
  #endif /* DB_USE_SSE2 */
  
      *sum= (float) fsum;
      den=(25.0f*f2sum-fsum*fsum);
      *recip= (float)((den!=0.0)?1.0/den:0.0);
  }
  
  inline void db_SignedSquareNormCorr21x21_PreAlign_u(short *patch,const unsigned char * const *f_img,int x_f,int y_f,float *sum,float *recip)
  {
      float den;
      int f2sum,fsum;
      int xm_f=x_f-10;
      short f;
  
      int xwi;
      int ywi;
      f2sum=0;
      fsum=0;
      for (int r=-10;r<=10;r++){
          ywi=y_f+r;
          for (int c=-10;c<=10;c++){
              xwi=x_f+c;
              f=f_img[ywi][xwi];
              f2sum+=f*f;
              fsum+=f;
              (*patch++)=f;
          }
      }
  
      for(int i=442; i<512; i++)
          (*patch++)=0;
  
      *sum= (float) fsum;
      den=(441.0f*f2sum-fsum*fsum);
      *recip= (float)((den!=0.0)?1.0/den:0.0);
  
  
  }
  
  /* Lay out the image in the patch, computing norm and
  */
  inline void db_SignedSquareNormCorr11x11_PreAlign_u(short *patch,const unsigned char * const *f_img,int x_f,int y_f,float *sum,float *recip)
  {
      float den;
      int f2sum,fsum;
      int xm_f=x_f-5;
  
  #ifndef DB_USE_SSE2
      const unsigned char *pf;
      short f;
  
      pf=f_img[y_f-5]+xm_f;
      f= *pf++; f2sum=f*f;  fsum=f;  (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f-4]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f-3]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f-2]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f-1]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f+1]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f+2]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f+3]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f+4]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f+5]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      //int xwi;
      //int ywi;
      //f2sum=0;
      //fsum=0;
      //for (int r=-5;r<=5;r++){
      //  ywi=y_f+r;
      //  for (int c=-5;c<=5;c++){
      //      xwi=x_f+c;
      //      f=f_img[ywi][xwi];
      //      f2sum+=f*f;
      //      fsum+=f;
      //      (*patch++)=f;
      //  }
      //}
  
      (*patch++)=0; (*patch++)=0; (*patch++)=0; (*patch++)=0; (*patch++)=0;
      (*patch++)=0; (*patch++)=0;
  #else
      const unsigned char *pf0 =f_img[y_f-5]+xm_f;
      const unsigned char *pf1 =f_img[y_f-4]+xm_f;
      const unsigned char *pf2 =f_img[y_f-3]+xm_f;
      const unsigned char *pf3 =f_img[y_f-2]+xm_f;
      const unsigned char *pf4 =f_img[y_f-1]+xm_f;
      const unsigned char *pf5 =f_img[y_f  ]+xm_f;
      const unsigned char *pf6 =f_img[y_f+1]+xm_f;
      const unsigned char *pf7 =f_img[y_f+2]+xm_f;
      const unsigned char *pf8 =f_img[y_f+3]+xm_f;
      const unsigned char *pf9 =f_img[y_f+4]+xm_f;
      const unsigned char *pf10=f_img[y_f+5]+xm_f;
  
      /* pixel mask */
      const unsigned char pm[16] = {
          0xFF,0xFF,
          0xFF,0xFF,
          0xFF,0xFF,
          0,0,0,0,0,
          0,0,0,0,0};
      const unsigned char * pm_p = pm;
  
      _asm
      {
          mov         ecx,patch   /* load patch pointer */
          mov         ebx, pm_p   /* load pixel mask pointer */
          movdqu      xmm1,[ebx]  /* load pixel mask */
  
          pxor        xmm5,xmm5   /* set xmm5 to 0 accumulator for sum squares */
          pxor        xmm4,xmm4   /* set xmm4 to 0 accumulator for sum */
          pxor        xmm0,xmm0   /* set xmm0 to 0 */
  
          /* row 0 */
          mov         eax,pf0     /* load image pointer */
          movdqu      xmm7,[eax]  /* load 16 pixels */
          movdqa      xmm6,xmm7
  
          punpcklbw   xmm7,xmm0   /* unpack low pixels (first 8)*/
          punpckhbw   xmm6,xmm0   /* unpack high pixels (last 8)*/
  
          pand        xmm6,xmm1   /* mask out pixels 12-16 */
  
          movdqa      [ecx+0*22],xmm7 /* move short values to patch */
          movdqa      [ecx+0*22+16],xmm6  /* move short values to patch */
  
          paddusw     xmm4,xmm7   /* accumulate sums */
          pmaddwd     xmm7,xmm7   /* multiply 16 bit ints and add into 32 bit ints */
          paddd       xmm5,xmm7   /* accumulate sum squares */
  
          paddw       xmm4,xmm6   /* accumulate sums */
          pmaddwd     xmm6,xmm6   /* multiply 16 bit uints into 16 bit uints */
          paddd       xmm5,xmm6   /* accumulate sum squares */
  
          /* row 1 */
          mov         eax,pf1     /* load image pointer */
          movdqu      xmm7,[eax]  /* load 16 pixels */
          movdqa      xmm6,xmm7
  
          punpcklbw   xmm7,xmm0   /* unpack low pixels (first 8)*/
          punpckhbw   xmm6,xmm0   /* unpack high pixels (last 8)*/
  
          pand        xmm6,xmm1   /* mask out pixels 12-16 */
  
          movdqu      [ecx+1*22],xmm7 /* move short values to patch */
          movdqu      [ecx+1*22+16],xmm6  /* move short values to patch */
  
          paddusw     xmm4,xmm7   /* accumulate sums */
          pmaddwd     xmm7,xmm7   /* multiply 16 bit ints and add into 32 bit ints */
          paddd       xmm5,xmm7   /* accumulate sum squares */
  
          paddw       xmm4,xmm6   /* accumulate sums */
          pmaddwd     xmm6,xmm6   /* multiply 16 bit uints into 16 bit uints */
          paddd       xmm5,xmm6   /* accumulate sum squares */
  
          /* row 2 */
          mov         eax,pf2     /* load image pointer */
          movdqu      xmm7,[eax]  /* load 16 pixels */
          movdqa      xmm6,xmm7
  
          punpcklbw   xmm7,xmm0   /* unpack low pixels (first 8)*/
          punpckhbw   xmm6,xmm0   /* unpack high pixels (last 8)*/
  
          pand        xmm6,xmm1   /* mask out pixels 12-16 */
  
          movdqu      [ecx+2*22],xmm7 /* move short values to patch */
          movdqu      [ecx+2*22+16],xmm6  /* move short values to patch */
  
          paddusw     xmm4,xmm7   /* accumulate sums */
          pmaddwd     xmm7,xmm7   /* multiply 16 bit ints and add into 32 bit ints */
          paddd       xmm5,xmm7   /* accumulate sum squares */
  
          paddw       xmm4,xmm6   /* accumulate sums */
          pmaddwd     xmm6,xmm6   /* multiply 16 bit uints into 16 bit uints */
          paddd       xmm5,xmm6   /* accumulate sum squares */
  
          /* row 3 */
          mov         eax,pf3     /* load image pointer */
          movdqu      xmm7,[eax]  /* load 16 pixels */
          movdqa      xmm6,xmm7
  
          punpcklbw   xmm7,xmm0   /* unpack low pixels (first 8)*/
          punpckhbw   xmm6,xmm0   /* unpack high pixels (last 8)*/
  
          pand        xmm6,xmm1   /* mask out pixels 12-16 */
  
          movdqu      [ecx+3*22],xmm7 /* move short values to patch */
          movdqu      [ecx+3*22+16],xmm6  /* move short values to patch */
  
          paddusw     xmm4,xmm7   /* accumulate sums */
          pmaddwd     xmm7,xmm7   /* multiply 16 bit ints and add into 32 bit ints */
          paddd       xmm5,xmm7   /* accumulate sum squares */
  
          paddw       xmm4,xmm6   /* accumulate sums */
          pmaddwd     xmm6,xmm6   /* multiply 16 bit uints into 16 bit uints */
          paddd       xmm5,xmm6   /* accumulate sum squares */
  
          /* row 4 */
          mov         eax,pf4     /* load image pointer */
          movdqu      xmm7,[eax]  /* load 16 pixels */
          movdqa      xmm6,xmm7
  
          punpcklbw   xmm7,xmm0   /* unpack low pixels (first 8)*/
          punpckhbw   xmm6,xmm0   /* unpack high pixels (last 8)*/
  
          pand        xmm6,xmm1   /* mask out pixels 12-16 */
  
          movdqu      [ecx+4*22],xmm7 /* move short values to patch */
          movdqu      [ecx+4*22+16],xmm6  /* move short values to patch */
  
          paddusw     xmm4,xmm7   /* accumulate sums */
          pmaddwd     xmm7,xmm7   /* multiply 16 bit ints and add into 32 bit ints */
          paddd       xmm5,xmm7   /* accumulate sum squares */
  
          paddw       xmm4,xmm6   /* accumulate sums */
          pmaddwd     xmm6,xmm6   /* multiply 16 bit uints into 16 bit uints */
          paddd       xmm5,xmm6   /* accumulate sum squares */
  
          /* row 5 */
          mov         eax,pf5     /* load image pointer */
          movdqu      xmm7,[eax]  /* load 16 pixels */
          movdqa      xmm6,xmm7
  
          punpcklbw   xmm7,xmm0   /* unpack low pixels (first 8)*/
          punpckhbw   xmm6,xmm0   /* unpack high pixels (last 8)*/
  
          pand        xmm6,xmm1   /* mask out pixels 12-16 */
  
          movdqu      [ecx+5*22],xmm7 /* move short values to patch */
          movdqu      [ecx+5*22+16],xmm6  /* move short values to patch */
  
          paddusw     xmm4,xmm7   /* accumulate sums */
          pmaddwd     xmm7,xmm7   /* multiply 16 bit ints and add into 32 bit ints */
          paddd       xmm5,xmm7   /* accumulate sum squares */
  
          paddw       xmm4,xmm6   /* accumulate sums */
          pmaddwd     xmm6,xmm6   /* multiply 16 bit uints into 16 bit uints */
          paddd       xmm5,xmm6   /* accumulate sum squares */
  
          /* row 6 */
          mov         eax,pf6     /* load image pointer */
          movdqu      xmm7,[eax]  /* load 16 pixels */
          movdqa      xmm6,xmm7
  
          punpcklbw   xmm7,xmm0   /* unpack low pixels (first 8)*/
          punpckhbw   xmm6,xmm0   /* unpack high pixels (last 8)*/
  
          pand        xmm6,xmm1   /* mask out pixels 12-16 */
  
          movdqu      [ecx+6*22],xmm7 /* move short values to patch */
          movdqu      [ecx+6*22+16],xmm6  /* move short values to patch */
  
          paddusw     xmm4,xmm7   /* accumulate sums */
          pmaddwd     xmm7,xmm7   /* multiply 16 bit ints and add into 32 bit ints */
          paddd       xmm5,xmm7   /* accumulate sum squares */
  
          paddw       xmm4,xmm6   /* accumulate sums */
          pmaddwd     xmm6,xmm6   /* multiply 16 bit uints into 16 bit uints */
          paddd       xmm5,xmm6   /* accumulate sum squares */
  
          /* row 7 */
          mov         eax,pf7     /* load image pointer */
          movdqu      xmm7,[eax]  /* load 16 pixels */
          movdqa      xmm6,xmm7
  
          punpcklbw   xmm7,xmm0   /* unpack low pixels (first 8)*/
          punpckhbw   xmm6,xmm0   /* unpack high pixels (last 8)*/
  
          pand        xmm6,xmm1   /* mask out pixels 12-16 */
  
          movdqu      [ecx+7*22],xmm7 /* move short values to patch */
          movdqu      [ecx+7*22+16],xmm6  /* move short values to patch */
  
          paddusw     xmm4,xmm7   /* accumulate sums */
          pmaddwd     xmm7,xmm7   /* multiply 16 bit ints and add into 32 bit ints */
          paddd       xmm5,xmm7   /* accumulate sum squares */
  
          paddw       xmm4,xmm6   /* accumulate sums */
          pmaddwd     xmm6,xmm6   /* multiply 16 bit uints into 16 bit uints */
          paddd       xmm5,xmm6   /* accumulate sum squares */
  
          /* row 8 */
          mov         eax,pf8     /* load image pointer */
          movdqu      xmm7,[eax]  /* load 16 pixels */
          movdqa      xmm6,xmm7
  
          punpcklbw   xmm7,xmm0   /* unpack low pixels (first 8)*/
          punpckhbw   xmm6,xmm0   /* unpack high pixels (last 8)*/
  
          pand        xmm6,xmm1   /* mask out pixels 12-16 */
  
          movdqa      [ecx+8*22],xmm7 /* move short values to patch */
          movdqa      [ecx+8*22+16],xmm6  /* move short values to patch */
  
          paddusw     xmm4,xmm7   /* accumulate sums */
          pmaddwd     xmm7,xmm7   /* multiply 16 bit ints and add into 32 bit ints */
          paddd       xmm5,xmm7   /* accumulate sum squares */
  
          paddw       xmm4,xmm6   /* accumulate sums */
          pmaddwd     xmm6,xmm6   /* multiply 16 bit uints into 16 bit uints */
          paddd       xmm5,xmm6   /* accumulate sum squares */
  
          /* row 9 */
          mov         eax,pf9     /* load image pointer */
          movdqu      xmm7,[eax]  /* load 16 pixels */
          movdqa      xmm6,xmm7
  
          punpcklbw   xmm7,xmm0   /* unpack low pixels (first 8)*/
          punpckhbw   xmm6,xmm0   /* unpack high pixels (last 8)*/
  
          pand        xmm6,xmm1   /* mask out pixels 12-16 */
  
          movdqu      [ecx+9*22],xmm7 /* move short values to patch */
          movdqu      [ecx+9*22+16],xmm6  /* move short values to patch */
  
          paddusw     xmm4,xmm7   /* accumulate sums */
          pmaddwd     xmm7,xmm7   /* multiply 16 bit ints and add into 32 bit ints */
          paddd       xmm5,xmm7   /* accumulate sum squares */
  
          paddw       xmm4,xmm6   /* accumulate sums */
          pmaddwd     xmm6,xmm6   /* multiply 16 bit uints into 16 bit uints */
          paddd       xmm5,xmm6   /* accumulate sum squares */
  
          /* row 10 */
          mov         eax,pf10    /* load image pointer */
          movdqu      xmm7,[eax]  /* load 16 pixels */
          movdqa      xmm6,xmm7
  
          punpcklbw   xmm7,xmm0   /* unpack low pixels (first 8)*/
          punpckhbw   xmm6,xmm0   /* unpack high pixels (last 8)*/
  
          pand        xmm6,xmm1   /* mask out pixels 12-16 */
  
          movdqu      [ecx+10*22],xmm7    /* move short values to patch */
          movdqu      [ecx+10*22+16],xmm6 /* move short values to patch */
  
          paddusw     xmm4,xmm7   /* accumulate sums */
          pmaddwd     xmm7,xmm7   /* multiply 16 bit ints and add into 32 bit ints */
          paddd       xmm5,xmm7   /* accumulate sum squares */
  
          paddw       xmm4,xmm6   /* accumulate sums */
          pmaddwd     xmm6,xmm6   /* multiply 16 bit ints and add into 32 bit ints */
          paddd       xmm5,xmm6   /* accumulate sum squares */
  
          /* add up the sum squares */
          movhlps     xmm0,xmm5   /* high half to low half */
          paddd       xmm5,xmm0   /* add high to low */
          pshuflw     xmm0,xmm5, 0xE /* reshuffle */
          paddd       xmm5,xmm0   /* add remaining */
          movd        f2sum,xmm5
  
          /* add up the sum */
          movhlps     xmm0,xmm4
          paddw       xmm4,xmm0   /* halves added */
          pshuflw     xmm0,xmm4,0xE
          paddw       xmm4,xmm0   /* quarters added */
          pshuflw     xmm0,xmm4,0x1
          paddw       xmm4,xmm0   /* eighth added */
          movd        fsum, xmm4
  
          emms
      }
  
      fsum = fsum & 0xFFFF;
  
      patch[126] = 0;
      patch[127] = 0;
  #endif /* DB_USE_SSE2 */
  
      *sum= (float) fsum;
      den=(121.0f*f2sum-fsum*fsum);
      *recip= (float)((den!=0.0)?1.0/den:0.0);
  }
  
  void AffineWarpPointOffset(float &r_w,float &c_w,double Hinv[9],int r,int c)
  {
      r_w=(float)(Hinv[3]*c+Hinv[4]*r);
      c_w=(float)(Hinv[0]*c+Hinv[1]*r);
  }
  
  
  
  /*!
  Prewarp the patches with given affine transform. For a given homogeneous point "x", "H*x" is
  the warped point and for any displacement "d" in the warped image resulting in point "y", the
  corresponding point in the original image is given by "Hinv*y", which can be simplified for affine H.
  If "affine" is 1, then nearest neighbor method is used, else if it is 2, then
  bilinear method is used.
   */
  inline void db_SignedSquareNormCorr11x11_PreAlign_AffinePatchWarp_u(short *patch,const unsigned char * const *f_img,
                                                                      int xi,int yi,float *sum,float *recip,
                                                                      const double Hinv[9],int affine)
  {
      float den;
      short f;
      int f2sum,fsum;
  
      f2sum=0;
      fsum=0;
  
      if (affine==1)
      {
          for (int r=0;r<11;r++){
              for (int c=0;c<11;c++){
                  f=f_img[yi+AffineWarpPoint_NN_LUT_y[r][c]][xi+AffineWarpPoint_NN_LUT_x[r][c]];
                  f2sum+=f*f;
                  fsum+=f;
                  (*patch++)=f;
              }
          }
      }
      else if (affine==2)
      {
          for (int r=0;r<11;r++){
              for (int c=0;c<11;c++){
                  f=db_BilinearInterpolation(yi+AffineWarpPoint_BL_LUT_y[r][c]
                  ,xi+AffineWarpPoint_BL_LUT_x[r][c],f_img);
                  f2sum+=f*f;
                  fsum+=f;
                  (*patch++)=f;
              }
          }
      }
  
  
  
      (*patch++)=0; (*patch++)=0; (*patch++)=0; (*patch++)=0; (*patch++)=0;
      (*patch++)=0; (*patch++)=0;
  
      *sum= (float) fsum;
      den=(121.0f*f2sum-fsum*fsum);
      *recip= (float)((den!=0.0)?1.0/den:0.0);
  }
  
  
  inline float db_SignedSquareNormCorr11x11_Post_u(unsigned char **f_img,unsigned char **g_img,int x_f,int y_f,int x_g,int y_g,
                                                  float fsum_gsum,float f_recip_g_recip)
  {
      unsigned char *pf,*pg;
      int fgsum;
      float fg_corr;
      int xm_f,xm_g;
  
      xm_f=x_f-5;
      xm_g=x_g-5;
  
      pf=f_img[y_f-5]+xm_f; pg=g_img[y_g-5]+xm_g;
      fgsum=(*pf++)*(*pg++);  fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f-4]+xm_f; pg=g_img[y_g-4]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f-3]+xm_f; pg=g_img[y_g-3]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f-2]+xm_f; pg=g_img[y_g-2]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f-1]+xm_f; pg=g_img[y_g-1]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f]+xm_f; pg=g_img[y_g]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f+1]+xm_f; pg=g_img[y_g+1]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f+2]+xm_f; pg=g_img[y_g+2]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f+3]+xm_f; pg=g_img[y_g+3]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f+4]+xm_f; pg=g_img[y_g+4]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f+5]+xm_f; pg=g_img[y_g+5]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      fg_corr=121.0f*fgsum-fsum_gsum;
      if(fg_corr>=0.0) return(fg_corr*fg_corr*f_recip_g_recip);
      return(-fg_corr*fg_corr*f_recip_g_recip);
  }
  
  float db_SignedSquareNormCorr21x21Aligned_Post_s(const short *f_patch,const short *g_patch,float fsum_gsum,float f_recip_g_recip)
  {
      float fgsum,fg_corr;
  
      fgsum= (float) db_ScalarProduct512_s(f_patch,g_patch);
  
      fg_corr=441.0f*fgsum-fsum_gsum;
      if(fg_corr>=0.0) return(fg_corr*fg_corr*f_recip_g_recip);
      return(-fg_corr*fg_corr*f_recip_g_recip);
  }
  
  
  float db_SignedSquareNormCorr11x11Aligned_Post_s(const short *f_patch,const short *g_patch,float fsum_gsum,float f_recip_g_recip)
  {
      float fgsum,fg_corr;
  
      fgsum= (float) db_ScalarProduct128_s(f_patch,g_patch);
  
      fg_corr=121.0f*fgsum-fsum_gsum;
      if(fg_corr>=0.0) return(fg_corr*fg_corr*f_recip_g_recip);
      return(-fg_corr*fg_corr*f_recip_g_recip);
  }
  
  float db_SignedSquareNormCorr5x5Aligned_Post_s(const short *f_patch,const short *g_patch,float fsum_gsum,float f_recip_g_recip)
  {
      float fgsum,fg_corr;
  
      fgsum= (float) db_ScalarProduct32_s(f_patch,g_patch);
  
      fg_corr=25.0f*fgsum-fsum_gsum;
      if(fg_corr>=0.0) return(fg_corr*fg_corr*f_recip_g_recip);
      return(-fg_corr*fg_corr*f_recip_g_recip);
  }
  
  
  inline float db_SignedSquareNormCorr15x15_u(unsigned char **f_img,unsigned char **g_img,int x_f,int y_f,int x_g,int y_g)
  {
      unsigned char *pf,*pg;
      float f,g,fgsum,f2sum,g2sum,fsum,gsum,fg_corr,den;
      int xm_f,xm_g;
  
      xm_f=x_f-7;
      xm_g=x_g-7;
      fgsum=0.0; f2sum=0.0; g2sum=0.0; fsum=0.0; gsum=0.0;
  
      pf=f_img[y_f-7]+xm_f; pg=g_img[y_g-7]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-6]+xm_f; pg=g_img[y_g-6]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-5]+xm_f; pg=g_img[y_g-5]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-4]+xm_f; pg=g_img[y_g-4]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-3]+xm_f; pg=g_img[y_g-3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-2]+xm_f; pg=g_img[y_g-2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-1]+xm_f; pg=g_img[y_g-1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f]+xm_f; pg=g_img[y_g]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+1]+xm_f; pg=g_img[y_g+1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+2]+xm_f; pg=g_img[y_g+2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+3]+xm_f; pg=g_img[y_g+3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+4]+xm_f; pg=g_img[y_g+4]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+5]+xm_f; pg=g_img[y_g+5]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+6]+xm_f; pg=g_img[y_g+6]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+7]+xm_f; pg=g_img[y_g+7]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      fg_corr=225.0f*fgsum-fsum*gsum;
      den=(225.0f*f2sum-fsum*fsum)*(225.0f*g2sum-gsum*gsum);
      if(den!=0.0)
      {
          if(fg_corr>=0.0) return(fg_corr*fg_corr/den);
          return(-fg_corr*fg_corr/den);
      }
      return(0.0);
  }
  
  inline float db_SignedSquareNormCorr7x7_f(float **f_img,float **g_img,int x_f,int y_f,int x_g,int y_g)
  {
      float f,g,*pf,*pg,fgsum,f2sum,g2sum,fsum,gsum,fg_corr,den;
      int xm_f,xm_g;
  
      xm_f=x_f-3;
      xm_g=x_g-3;
      fgsum=0.0; f2sum=0.0; g2sum=0.0; fsum=0.0; gsum=0.0;
  
      pf=f_img[y_f-3]+xm_f; pg=g_img[y_g-3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-2]+xm_f; pg=g_img[y_g-2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-1]+xm_f; pg=g_img[y_g-1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f]+xm_f; pg=g_img[y_g]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+1]+xm_f; pg=g_img[y_g+1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+2]+xm_f; pg=g_img[y_g+2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+3]+xm_f; pg=g_img[y_g+3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      fg_corr=49.0f*fgsum-fsum*gsum;
      den=(49.0f*f2sum-fsum*fsum)*(49.0f*g2sum-gsum*gsum);
      if(den!=0.0)
      {
          if(fg_corr>=0.0) return(fg_corr*fg_corr/den);
          return(-fg_corr*fg_corr/den);
      }
      return(0.0);
  }
  
  inline float db_SignedSquareNormCorr9x9_f(float **f_img,float **g_img,int x_f,int y_f,int x_g,int y_g)
  {
      float f,g,*pf,*pg,fgsum,f2sum,g2sum,fsum,gsum,fg_corr,den;
      int xm_f,xm_g;
  
      xm_f=x_f-4;
      xm_g=x_g-4;
      fgsum=0.0; f2sum=0.0; g2sum=0.0; fsum=0.0; gsum=0.0;
  
      pf=f_img[y_f-4]+xm_f; pg=g_img[y_g-4]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-3]+xm_f; pg=g_img[y_g-3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-2]+xm_f; pg=g_img[y_g-2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-1]+xm_f; pg=g_img[y_g-1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f]+xm_f; pg=g_img[y_g]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+1]+xm_f; pg=g_img[y_g+1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+2]+xm_f; pg=g_img[y_g+2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+3]+xm_f; pg=g_img[y_g+3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+4]+xm_f; pg=g_img[y_g+4]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      fg_corr=81.0f*fgsum-fsum*gsum;
      den=(81.0f*f2sum-fsum*fsum)*(81.0f*g2sum-gsum*gsum);
      if(den!=0.0)
      {
          if(fg_corr>=0.0) return(fg_corr*fg_corr/den);
          return(-fg_corr*fg_corr/den);
      }
      return(0.0);
  }
  
  inline float db_SignedSquareNormCorr11x11_f(float **f_img,float **g_img,int x_f,int y_f,int x_g,int y_g)
  {
      float *pf,*pg;
      float f,g,fgsum,f2sum,g2sum,fsum,gsum,fg_corr,den;
      int xm_f,xm_g;
  
      xm_f=x_f-5;
      xm_g=x_g-5;
      fgsum=0.0; f2sum=0.0; g2sum=0.0; fsum=0.0; gsum=0.0;
  
      pf=f_img[y_f-5]+xm_f; pg=g_img[y_g-5]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-4]+xm_f; pg=g_img[y_g-4]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-3]+xm_f; pg=g_img[y_g-3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-2]+xm_f; pg=g_img[y_g-2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-1]+xm_f; pg=g_img[y_g-1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f]+xm_f; pg=g_img[y_g]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+1]+xm_f; pg=g_img[y_g+1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+2]+xm_f; pg=g_img[y_g+2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+3]+xm_f; pg=g_img[y_g+3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+4]+xm_f; pg=g_img[y_g+4]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+5]+xm_f; pg=g_img[y_g+5]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      fg_corr=121.0f*fgsum-fsum*gsum;
      den=(121.0f*f2sum-fsum*fsum)*(121.0f*g2sum-gsum*gsum);
      if(den!=0.0)
      {
          if(fg_corr>=0.0) return(fg_corr*fg_corr/den);
          return(-fg_corr*fg_corr/den);
      }
      return(0.0);
  }
  
  inline void db_SignedSquareNormCorr11x11_Pre_f(float **f_img,int x_f,int y_f,float *sum,float *recip)
  {
      float *pf,den;
      float f,f2sum,fsum;
      int xm_f;
  
      xm_f=x_f-5;
  
      pf=f_img[y_f-5]+xm_f;
      f= *pf++; f2sum=f*f;  fsum=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f-4]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f-3]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f-2]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f-1]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f+1]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f+2]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f+3]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f+4]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      pf=f_img[y_f+5]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf++; f2sum+=f*f; fsum+=f;
      f= *pf;   f2sum+=f*f; fsum+=f;
  
      *sum=fsum;
      den=(121.0f*f2sum-fsum*fsum);
      *recip= (float) ((den!=0.0)?1.0/den:0.0);
  }
  
  inline void db_SignedSquareNormCorr11x11_PreAlign_f(float *patch,const float * const *f_img,int x_f,int y_f,float *sum,float *recip)
  {
      const float *pf;
      float den,f,f2sum,fsum;
      int xm_f;
  
      xm_f=x_f-5;
  
      pf=f_img[y_f-5]+xm_f;
      f= *pf++; f2sum=f*f;  fsum=f;  (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f-4]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f-3]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f-2]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f-1]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f+1]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f+2]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f+3]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f+4]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      pf=f_img[y_f+5]+xm_f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf++; f2sum+=f*f; fsum+=f; (*patch++)=f;
      f= *pf;   f2sum+=f*f; fsum+=f; (*patch++)=f;
  
      (*patch++)=0.0; (*patch++)=0.0; (*patch++)=0.0; (*patch++)=0.0; (*patch++)=0.0;
      (*patch++)=0.0; (*patch++)=0.0;
  
      *sum=fsum;
      den=(121.0f*f2sum-fsum*fsum);
      *recip= (float) ((den!=0.0)?1.0/den:0.0);
  }
  
  inline float db_SignedSquareNormCorr11x11_Post_f(float **f_img,float **g_img,int x_f,int y_f,int x_g,int y_g,
                                                  float fsum_gsum,float f_recip_g_recip)
  {
      float *pf,*pg;
      float fgsum,fg_corr;
      int xm_f,xm_g;
  
      xm_f=x_f-5;
      xm_g=x_g-5;
  
      pf=f_img[y_f-5]+xm_f; pg=g_img[y_g-5]+xm_g;
      fgsum=(*pf++)*(*pg++);  fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f-4]+xm_f; pg=g_img[y_g-4]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f-3]+xm_f; pg=g_img[y_g-3]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f-2]+xm_f; pg=g_img[y_g-2]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f-1]+xm_f; pg=g_img[y_g-1]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f]+xm_f; pg=g_img[y_g]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f+1]+xm_f; pg=g_img[y_g+1]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f+2]+xm_f; pg=g_img[y_g+2]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f+3]+xm_f; pg=g_img[y_g+3]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f+4]+xm_f; pg=g_img[y_g+4]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      pf=f_img[y_f+5]+xm_f; pg=g_img[y_g+5]+xm_g;
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++); fgsum+=(*pf++)*(*pg++);
      fgsum+=(*pf++)*(*pg++); fgsum+=(*pf)*(*pg);
  
      fg_corr=121.0f*fgsum-fsum_gsum;
      if(fg_corr>=0.0) return(fg_corr*fg_corr*f_recip_g_recip);
      return(-fg_corr*fg_corr*f_recip_g_recip);
  }
  
  inline float db_SignedSquareNormCorr11x11Aligned_Post_f(const float *f_patch,const float *g_patch,float fsum_gsum,float f_recip_g_recip)
  {
      float fgsum,fg_corr;
  
      fgsum=db_ScalarProduct128Aligned16_f(f_patch,g_patch);
  
      fg_corr=121.0f*fgsum-fsum_gsum;
      if(fg_corr>=0.0) return(fg_corr*fg_corr*f_recip_g_recip);
      return(-fg_corr*fg_corr*f_recip_g_recip);
  }
  
  inline float db_SignedSquareNormCorr15x15_f(float **f_img,float **g_img,int x_f,int y_f,int x_g,int y_g)
  {
      float *pf,*pg;
      float f,g,fgsum,f2sum,g2sum,fsum,gsum,fg_corr,den;
      int xm_f,xm_g;
  
      xm_f=x_f-7;
      xm_g=x_g-7;
      fgsum=0.0; f2sum=0.0; g2sum=0.0; fsum=0.0; gsum=0.0;
  
      pf=f_img[y_f-7]+xm_f; pg=g_img[y_g-7]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-6]+xm_f; pg=g_img[y_g-6]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-5]+xm_f; pg=g_img[y_g-5]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-4]+xm_f; pg=g_img[y_g-4]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-3]+xm_f; pg=g_img[y_g-3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-2]+xm_f; pg=g_img[y_g-2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f-1]+xm_f; pg=g_img[y_g-1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f]+xm_f; pg=g_img[y_g]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+1]+xm_f; pg=g_img[y_g+1]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+2]+xm_f; pg=g_img[y_g+2]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+3]+xm_f; pg=g_img[y_g+3]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+4]+xm_f; pg=g_img[y_g+4]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+5]+xm_f; pg=g_img[y_g+5]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+6]+xm_f; pg=g_img[y_g+6]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      pf=f_img[y_f+7]+xm_f; pg=g_img[y_g+7]+xm_g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf++; g= *pg++; fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
      f= *pf;   g= *pg;   fgsum+=f*g; f2sum+=f*f; g2sum+=g*g; fsum+=f; gsum+=g;
  
      fg_corr=225.0f*fgsum-fsum*gsum;
      den=(225.0f*f2sum-fsum*fsum)*(225.0f*g2sum-gsum*gsum);
      if(den!=0.0)
      {
          if(fg_corr>=0.0) return(fg_corr*fg_corr/den);
          return(-fg_corr*fg_corr/den);
      }
      return(0.0);
  }
  
  db_Bucket_f** db_AllocBuckets_f(int nr_h,int nr_v,int bd)
  {
      int i,j;
      db_Bucket_f **bp,*b;
  
      b=new db_Bucket_f [(nr_h+2)*(nr_v+2)];
      bp=new db_Bucket_f* [(nr_v+2)];
      bp=bp+1;
      for(i= -1;i<=nr_v;i++)
      {
          bp[i]=b+1+(nr_h+2)*(i+1);
          for(j= -1;j<=nr_h;j++)
          {
              bp[i][j].ptr=new db_PointInfo_f [bd];
          }
      }
  
      return(bp);
  }
  
  db_Bucket_u** db_AllocBuckets_u(int nr_h,int nr_v,int bd)
  {
      int i,j;
      db_Bucket_u **bp,*b;
  
      b=new db_Bucket_u [(nr_h+2)*(nr_v+2)];
      bp=new db_Bucket_u* [(nr_v+2)];
      bp=bp+1;
      for(i= -1;i<=nr_v;i++)
      {
          bp[i]=b+1+(nr_h+2)*(i+1);
          for(j= -1;j<=nr_h;j++)
          {
              bp[i][j].ptr=new db_PointInfo_u [bd];
          }
      }
  
      return(bp);
  }
  
  void db_FreeBuckets_f(db_Bucket_f **bp,int nr_h,int nr_v)
  {
      int i,j;
  
      for(i= -1;i<=nr_v;i++) for(j= -1;j<=nr_h;j++)
      {
          delete [] bp[i][j].ptr;
      }
      delete [] (bp[-1]-1);
      delete [] (bp-1);
  }
  
  void db_FreeBuckets_u(db_Bucket_u **bp,int nr_h,int nr_v)
  {
      int i,j;
  
      for(i= -1;i<=nr_v;i++) for(j= -1;j<=nr_h;j++)
      {
          delete [] bp[i][j].ptr;
      }
      delete [] (bp[-1]-1);
      delete [] (bp-1);
  }
  
  void db_EmptyBuckets_f(db_Bucket_f **bp,int nr_h,int nr_v)
  {
      int i,j;
      for(i= -1;i<=nr_v;i++) for(j= -1;j<=nr_h;j++) bp[i][j].nr=0;
  }
  
  void db_EmptyBuckets_u(db_Bucket_u **bp,int nr_h,int nr_v)
  {
      int i,j;
      for(i= -1;i<=nr_v;i++) for(j= -1;j<=nr_h;j++) bp[i][j].nr=0;
  }
  
  float* db_FillBuckets_f(float *patch_space,const float * const *f_img,db_Bucket_f **bp,int bw,int bh,int nr_h,int nr_v,int bd,const double *x,const double *y,int nr_corners)
  {
      int i,xi,yi,xpos,ypos,nr;
      db_Bucket_f *br;
      db_PointInfo_f *pir;
  
      db_EmptyBuckets_f(bp,nr_h,nr_v);
      for(i=0;i<nr_corners;i++)
      {
          xi=(int) x[i];
          yi=(int) y[i];
          xpos=xi/bw;
          ypos=yi/bh;
          if(xpos>=0 && xpos<nr_h && ypos>=0 && ypos<nr_v)
          {
              br=&bp[ypos][xpos];
              nr=br->nr;
              if(nr<bd)
              {
                  pir=&(br->ptr[nr]);
                  pir->x=xi;
                  pir->y=yi;
                  pir->id=i;
                  pir->pir=0;
                  pir->patch=patch_space;
                  br->nr=nr+1;
  
                  db_SignedSquareNormCorr11x11_PreAlign_f(patch_space,f_img,xi,yi,&(pir->sum),&(pir->recip));
                  patch_space+=128;
              }
          }
      }
      return(patch_space);
  }
  
  short* db_FillBuckets_u(short *patch_space,const unsigned char * const *f_img,db_Bucket_u **bp,int bw,int bh,int nr_h,int nr_v,int bd,const double *x,const double *y,int nr_corners,int use_smaller_matching_window, int use_21)
  {
      int i,xi,yi,xpos,ypos,nr;
      db_Bucket_u *br;
      db_PointInfo_u *pir;
  
      db_EmptyBuckets_u(bp,nr_h,nr_v);
      for(i=0;i<nr_corners;i++)
      {
          xi=(int)db_roundi(x[i]);
          yi=(int)db_roundi(y[i]);
          xpos=xi/bw;
          ypos=yi/bh;
          if(xpos>=0 && xpos<nr_h && ypos>=0 && ypos<nr_v)
          {
              br=&bp[ypos][xpos];
              nr=br->nr;
              if(nr<bd)
              {
                  pir=&(br->ptr[nr]);
                  pir->x=xi;
                  pir->y=yi;
                  pir->id=i;
                  pir->pir=0;
                  pir->patch=patch_space;
                  br->nr=nr+1;
  
                  if(use_21)
                  {
                      db_SignedSquareNormCorr21x21_PreAlign_u(patch_space,f_img,xi,yi,&(pir->sum),&(pir->recip));
                      patch_space+=512;
                  }
                  else
                  {
                  if(!use_smaller_matching_window)
                  {
                      db_SignedSquareNormCorr11x11_PreAlign_u(patch_space,f_img,xi,yi,&(pir->sum),&(pir->recip));
                      patch_space+=128;
                  }
                  else
                  {
                      db_SignedSquareNormCorr5x5_PreAlign_u(patch_space,f_img,xi,yi,&(pir->sum),&(pir->recip));
                      patch_space+=32;
                  }
                  }
              }
          }
      }
      return(patch_space);
  }
  
  
  
  float* db_FillBucketsPrewarped_f(float *patch_space,const float *const *f_img,db_Bucket_f **bp,int bw,int bh,int nr_h,int nr_v,int bd,const double *x,const double *y,int nr_corners,const double H[9])
  {
      int i,xi,yi,xpos,ypos,nr,wxi,wyi;
      db_Bucket_f *br;
      db_PointInfo_f *pir;
      double xd[2],wx[2];
  
      db_EmptyBuckets_f(bp,nr_h,nr_v);
      for(i=0;i<nr_corners;i++)
      {
          xd[0]=x[i];
          xd[1]=y[i];
          xi=(int) xd[0];
          yi=(int) xd[1];
          db_ImageHomographyInhomogenous(wx,H,xd);
          wxi=(int) wx[0];
          wyi=(int) wx[1];
  
          xpos=((wxi+bw)/bw)-1;
          ypos=((wyi+bh)/bh)-1;
          if(xpos>= -1 && xpos<=nr_h && ypos>= -1 && ypos<=nr_v)
          {
              br=&bp[ypos][xpos];
              nr=br->nr;
              if(nr<bd)
              {
                  pir=&(br->ptr[nr]);
                  pir->x=wxi;
                  pir->y=wyi;
                  pir->id=i;
                  pir->pir=0;
                  pir->patch=patch_space;
                  br->nr=nr+1;
  
                  db_SignedSquareNormCorr11x11_PreAlign_f(patch_space,f_img,xi,yi,&(pir->sum),&(pir->recip));
                  patch_space+=128;
              }
          }
      }
      return(patch_space);
  }
  
  short* db_FillBucketsPrewarped_u(short *patch_space,const unsigned char * const *f_img,db_Bucket_u **bp,
                                   int bw,int bh,int nr_h,int nr_v,int bd,const double *x,const double *y,
                                   int nr_corners,const double H[9])
  {
      int i,xi,yi,xpos,ypos,nr,wxi,wyi;
      db_Bucket_u *br;
      db_PointInfo_u *pir;
      double xd[2],wx[2];
  
      db_EmptyBuckets_u(bp,nr_h,nr_v);
      for(i=0;i<nr_corners;i++)
      {
          xd[0]=x[i];
          xd[1]=y[i];
          xi=(int) db_roundi(xd[0]);
          yi=(int) db_roundi(xd[1]);
          db_ImageHomographyInhomogenous(wx,H,xd);
          wxi=(int) wx[0];
          wyi=(int) wx[1];
  
          xpos=((wxi+bw)/bw)-1;
          ypos=((wyi+bh)/bh)-1;
          if(xpos>= -1 && xpos<=nr_h && ypos>= -1 && ypos<=nr_v)
          {
              br=&bp[ypos][xpos];
              nr=br->nr;
              if(nr<bd)
              {
                  pir=&(br->ptr[nr]);
                  pir->x=wxi;
                  pir->y=wyi;
                  pir->id=i;
                  pir->pir=0;
                  pir->patch=patch_space;
                  br->nr=nr+1;
  
                  db_SignedSquareNormCorr11x11_PreAlign_u(patch_space,f_img,xi,yi,&(pir->sum),&(pir->recip));
                  patch_space+=128;
              }
          }
      }
      return(patch_space);
  }
  
  
  
  short* db_FillBucketsPrewarpedAffine_u(short *patch_space,const unsigned char * const *f_img,db_Bucket_u **bp,
                                   int bw,int bh,int nr_h,int nr_v,int bd,const double *x,const double *y,
                                   int nr_corners,const double H[9],const double Hinv[9],const int warpboundsp[4],
                                   int affine)
  {
      int i,xi,yi,xpos,ypos,nr,wxi,wyi;
      db_Bucket_u *br;
      db_PointInfo_u *pir;
      double xd[2],wx[2];
  
      db_EmptyBuckets_u(bp,nr_h,nr_v);
      for(i=0;i<nr_corners;i++)
      {
          xd[0]=x[i];
          xd[1]=y[i];
          xi=(int) db_roundi(xd[0]);
          yi=(int) db_roundi(xd[1]);
          db_ImageHomographyInhomogenous(wx,H,xd);
          wxi=(int) wx[0];
          wyi=(int) wx[1];
  
          xpos=((wxi+bw)/bw)-1;
          ypos=((wyi+bh)/bh)-1;
  
  
          if (xpos>= -1 && xpos<=nr_h && ypos>= -1 && ypos<=nr_v)
          {
              if( xi>warpboundsp[0] && xi<warpboundsp[1] && yi>warpboundsp[2] && yi<warpboundsp[3])
              {
  
                  br=&bp[ypos][xpos];
                  nr=br->nr;
                  if(nr<bd)
                  {
                      pir=&(br->ptr[nr]);
                      pir->x=wxi;
                      pir->y=wyi;
                      pir->id=i;
                      pir->pir=0;
                      pir->patch=patch_space;
                      br->nr=nr+1;
  
                      db_SignedSquareNormCorr11x11_PreAlign_AffinePatchWarp_u(patch_space,f_img,xi,yi,&(pir->sum),&(pir->recip),Hinv,affine);
                      patch_space+=128;
                  }
              }
          }
      }
      return(patch_space);
  }
  
  
  
  inline void db_MatchPointPair_f(db_PointInfo_f *pir_l,db_PointInfo_f *pir_r,
                              unsigned long kA,unsigned long kB)
  {
      int x_l,y_l,x_r,y_r,xm,ym;
      double score;
  
      x_l=pir_l->x;
      y_l=pir_l->y;
      x_r=pir_r->x;
      y_r=pir_r->y;
      xm=x_l-x_r;
      ym=y_l-y_r;
      /*Check if disparity is within the maximum disparity
      with the formula xm^2*256+ym^2*kA<kB
      where kA=256*w^2/h^2
      and   kB=256*max_disp^2*w^2*/
      if(((xm*xm)<<8)+ym*ym*kA<kB)
      {
          /*Correlate*/
          score=db_SignedSquareNormCorr11x11Aligned_Post_f(pir_l->patch,pir_r->patch,
              (pir_l->sum)*(pir_r->sum),
              (pir_l->recip)*(pir_r->recip));
  
          if((!(pir_l->pir)) || (score>pir_l->s))
          {
              /*Update left corner*/
              pir_l->s=score;
              pir_l->pir=pir_r;
          }
          if((!(pir_r->pir)) || (score>pir_r->s))
          {
              /*Update right corner*/
              pir_r->s=score;
              pir_r->pir=pir_l;
          }
      }
  }
  
  inline void db_MatchPointPair_u(db_PointInfo_u *pir_l,db_PointInfo_u *pir_r,
                              unsigned long kA,unsigned long kB, unsigned int rect_window,bool use_smaller_matching_window, int use_21)
  {
      int xm,ym;
      double score;
      bool compute_score;
  
  
      if( rect_window )
          compute_score = ((unsigned)db_absi(pir_l->x - pir_r->x)<kA && (unsigned)db_absi(pir_l->y - pir_r->y)<kB);
      else
      {   /*Check if disparity is within the maximum disparity
          with the formula xm^2*256+ym^2*kA<kB
          where kA=256*w^2/h^2
          and   kB=256*max_disp^2*w^2*/
          xm= pir_l->x - pir_r->x;
          ym= pir_l->y - pir_r->y;
          compute_score = ((xm*xm)<<8)+ym*ym*kA < kB;
      }
  
      if ( compute_score )
      {
          if(use_21)
          {
              score=db_SignedSquareNormCorr21x21Aligned_Post_s(pir_l->patch,pir_r->patch,
                  (pir_l->sum)*(pir_r->sum),
                  (pir_l->recip)*(pir_r->recip));
          }
          else
          {
          /*Correlate*/
          if(!use_smaller_matching_window)
          {
              score=db_SignedSquareNormCorr11x11Aligned_Post_s(pir_l->patch,pir_r->patch,
                  (pir_l->sum)*(pir_r->sum),
                  (pir_l->recip)*(pir_r->recip));
          }
          else
          {
              score=db_SignedSquareNormCorr5x5Aligned_Post_s(pir_l->patch,pir_r->patch,
                  (pir_l->sum)*(pir_r->sum),
                  (pir_l->recip)*(pir_r->recip));
          }
          }
  
          if((!(pir_l->pir)) || (score>pir_l->s))
          {
              /*Update left corner*/
              pir_l->s=score;
              pir_l->pir=pir_r;
          }
          if((!(pir_r->pir)) || (score>pir_r->s))
          {
              /*Update right corner*/
              pir_r->s=score;
              pir_r->pir=pir_l;
          }
      }
  }
  
  inline void db_MatchPointAgainstBucket_f(db_PointInfo_f *pir_l,db_Bucket_f *b_r,
                                         unsigned long kA,unsigned long kB)
  {
      int p_r,nr;
      db_PointInfo_f *pir_r;
  
      nr=b_r->nr;
      pir_r=b_r->ptr;
      for(p_r=0;p_r<nr;p_r++) db_MatchPointPair_f(pir_l,pir_r+p_r,kA,kB);
  }
  
  inline void db_MatchPointAgainstBucket_u(db_PointInfo_u *pir_l,db_Bucket_u *b_r,
                                         unsigned long kA,unsigned long kB,int rect_window, bool use_smaller_matching_window, int use_21)
  {
      int p_r,nr;
      db_PointInfo_u *pir_r;
  
      nr=b_r->nr;
      pir_r=b_r->ptr;
  
      for(p_r=0;p_r<nr;p_r++) db_MatchPointPair_u(pir_l,pir_r+p_r,kA,kB, rect_window, use_smaller_matching_window, use_21);
  
  }
  
  void db_MatchBuckets_f(db_Bucket_f **bp_l,db_Bucket_f **bp_r,int nr_h,int nr_v,
                       unsigned long kA,unsigned long kB)
  {
      int i,j,k,a,b,br_nr;
      db_Bucket_f *br;
      db_PointInfo_f *pir_l;
  
      /*For all buckets*/
      for(i=0;i<nr_v;i++) for(j=0;j<nr_h;j++)
      {
          br=&bp_l[i][j];
          br_nr=br->nr;
          /*For all points in bucket*/
          for(k=0;k<br_nr;k++)
          {
              pir_l=br->ptr+k;
              for(a=i-1;a<=i+1;a++)
              {
                  for(b=j-1;b<=j+1;b++)
                  {
                      db_MatchPointAgainstBucket_f(pir_l,&bp_r[a][b],kA,kB);
                  }
              }
          }
      }
  }
  
  void db_MatchBuckets_u(db_Bucket_u **bp_l,db_Bucket_u **bp_r,int nr_h,int nr_v,
                       unsigned long kA,unsigned long kB,int rect_window,bool use_smaller_matching_window, int use_21)
  {
      int i,j,k,a,b,br_nr;
      db_Bucket_u *br;
      db_PointInfo_u *pir_l;
  
      /*For all buckets*/
      for(i=0;i<nr_v;i++) for(j=0;j<nr_h;j++)
      {
          br=&bp_l[i][j];
          br_nr=br->nr;
          /*For all points in bucket*/
          for(k=0;k<br_nr;k++)
          {
              pir_l=br->ptr+k;
              for(a=i-1;a<=i+1;a++)
              {
                  for(b=j-1;b<=j+1;b++)
                  {
                      db_MatchPointAgainstBucket_u(pir_l,&bp_r[a][b],kA,kB,rect_window,use_smaller_matching_window, use_21);
                  }
              }
          }
      }
  }
  
  void db_CollectMatches_f(db_Bucket_f **bp_l,int nr_h,int nr_v,unsigned long target,int *id_l,int *id_r,int *nr_matches)
  {
      int i,j,k,br_nr;
      unsigned long count;
      db_Bucket_f *br;
      db_PointInfo_f *pir,*pir2;
  
      count=0;
      /*For all buckets*/
      for(i=0;i<nr_v;i++) for(j=0;j<nr_h;j++)
      {
          br=&bp_l[i][j];
          br_nr=br->nr;
          /*For all points in bucket*/
          for(k=0;k<br_nr;k++)
          {
              pir=br->ptr+k;
              pir2=pir->pir;
              if(pir2)
              {
                  /*This point has a best match*/
                  if((pir2->pir)==pir)
                  {
                      /*We have a mutually consistent match*/
                      if(count<target)
                      {
                          id_l[count]=pir->id;
                          id_r[count]=pir2->id;
                          count++;
                      }
                  }
              }
          }
      }
      *nr_matches=count;
  }
  
  void db_CollectMatches_u(db_Bucket_u **bp_l,int nr_h,int nr_v,unsigned long target,int *id_l,int *id_r,int *nr_matches)
  {
      int i,j,k,br_nr;
      unsigned long count;
      db_Bucket_u *br;
      db_PointInfo_u *pir,*pir2;
  
      count=0;
      /*For all buckets*/
      for(i=0;i<nr_v;i++) for(j=0;j<nr_h;j++)
      {
          br=&bp_l[i][j];
          br_nr=br->nr;
          /*For all points in bucket*/
          for(k=0;k<br_nr;k++)
          {
              pir=br->ptr+k;
              pir2=pir->pir;
              if(pir2)
              {
                  /*This point has a best match*/
                  if((pir2->pir)==pir)
                  {
                      /*We have a mutually consistent match*/
                      if(count<target)
                      {
                          id_l[count]=pir->id;
                          id_r[count]=pir2->id;
                          count++;
                      }
                  }
              }
          }
      }
      *nr_matches=count;
  }
  
  db_Matcher_f::db_Matcher_f()
  {
      m_w=0; m_h=0;
  }
  
  db_Matcher_f::~db_Matcher_f()
  {
      Clean();
  }
  
  void db_Matcher_f::Clean()
  {
      if(m_w)
      {
          /*Free buckets*/
          db_FreeBuckets_f(m_bp_l,m_nr_h,m_nr_v);
          db_FreeBuckets_f(m_bp_r,m_nr_h,m_nr_v);
          /*Free space for patch layouts*/
          delete [] m_patch_space;
      }
      m_w=0; m_h=0;
  }
  
  unsigned long db_Matcher_f::Init(int im_width,int im_height,double max_disparity,int target_nr_corners)
  {
      Clean();
      m_w=im_width;
      m_h=im_height;
      m_bw=db_maxi(1,(int) (max_disparity*((double)im_width)));
      m_bh=db_maxi(1,(int) (max_disparity*((double)im_height)));
      m_nr_h=1+(im_width-1)/m_bw;
      m_nr_v=1+(im_height-1)/m_bh;
      m_bd=db_maxi(1,(int)(((double)target_nr_corners)*
          max_disparity*max_disparity));
      m_target=target_nr_corners;
      m_kA=(long)(256.0*((double)(m_w*m_w))/((double)(m_h*m_h)));
      m_kB=(long)(256.0*max_disparity*max_disparity*((double)(m_w*m_w)));
  
      /*Alloc bucket structure*/
      m_bp_l=db_AllocBuckets_f(m_nr_h,m_nr_v,m_bd);
      m_bp_r=db_AllocBuckets_f(m_nr_h,m_nr_v,m_bd);
  
      /*Alloc 16byte-aligned space for patch layouts*/
      m_patch_space=new float [2*(m_nr_h+2)*(m_nr_v+2)*m_bd*128+16];
      m_aligned_patch_space=db_AlignPointer_f(m_patch_space,16);
  
      return(m_target);
  }
  
  void db_Matcher_f::Match(const float * const *l_img,const float * const *r_img,
          const double *x_l,const double *y_l,int nr_l,const double *x_r,const double *y_r,int nr_r,
          int *id_l,int *id_r,int *nr_matches,const double H[9])
  {
      float *ps;
  
      /*Insert the corners into bucket structure*/
      ps=db_FillBuckets_f(m_aligned_patch_space,l_img,m_bp_l,m_bw,m_bh,m_nr_h,m_nr_v,m_bd,x_l,y_l,nr_l);
      if(H==0) db_FillBuckets_f(ps,r_img,m_bp_r,m_bw,m_bh,m_nr_h,m_nr_v,m_bd,x_r,y_r,nr_r);
      else db_FillBucketsPrewarped_f(ps,r_img,m_bp_r,m_bw,m_bh,m_nr_h,m_nr_v,m_bd,x_r,y_r,nr_r,H);
  
      /*Compute all the necessary match scores*/
      db_MatchBuckets_f(m_bp_l,m_bp_r,m_nr_h,m_nr_v,m_kA,m_kB);
  
      /*Collect the correspondences*/
      db_CollectMatches_f(m_bp_l,m_nr_h,m_nr_v,m_target,id_l,id_r,nr_matches);
  }
  
  db_Matcher_u::db_Matcher_u()
  {
      m_w=0; m_h=0;
      m_rect_window = 0;
      m_bw=m_bh=m_nr_h=m_nr_v=m_bd=m_target=0;
      m_bp_l=m_bp_r=0;
      m_patch_space=m_aligned_patch_space=0;
  }
  
  db_Matcher_u::db_Matcher_u(const db_Matcher_u& cm)
  {
      Init(cm.m_w, cm.m_h, cm.m_max_disparity, cm.m_target, cm.m_max_disparity_v);
  }
  
  db_Matcher_u& db_Matcher_u::operator= (const db_Matcher_u& cm)
  {
      if ( this == &cm ) return *this;
      Init(cm.m_w, cm.m_h, cm.m_max_disparity, cm.m_target, cm.m_max_disparity_v);
      return *this;
  }
  
  
  db_Matcher_u::~db_Matcher_u()
  {
      Clean();
  }
  
  void db_Matcher_u::Clean()
  {
      if(m_w)
      {
          /*Free buckets*/
          db_FreeBuckets_u(m_bp_l,m_nr_h,m_nr_v);
          db_FreeBuckets_u(m_bp_r,m_nr_h,m_nr_v);
          /*Free space for patch layouts*/
          delete [] m_patch_space;
      }
      m_w=0; m_h=0;
  }
  
  
  unsigned long db_Matcher_u::Init(int im_width,int im_height,double max_disparity,int target_nr_corners,
                                   double max_disparity_v, bool use_smaller_matching_window, int use_21)
  {
      Clean();
      m_w=im_width;
      m_h=im_height;
      m_max_disparity=max_disparity;
      m_max_disparity_v=max_disparity_v;
  
      if ( max_disparity_v != DB_DEFAULT_NO_DISPARITY )
      {
          m_rect_window = 1;
  
          m_bw=db_maxi(1,(int)(max_disparity*((double)im_width)));
          m_bh=db_maxi(1,(int)(max_disparity_v*((double)im_height)));
  
          m_bd=db_maxi(1,(int)(((double)target_nr_corners)*max_disparity*max_disparity_v));
  
          m_kA=(int)(max_disparity*m_w);
          m_kB=(int)(max_disparity_v*m_h);
  
      } else
      {
          m_bw=(int)db_maxi(1,(int)(max_disparity*((double)im_width)));
          m_bh=(int)db_maxi(1,(int)(max_disparity*((double)im_height)));
  
          m_bd=db_maxi(1,(int)(((double)target_nr_corners)*max_disparity*max_disparity));
  
          m_kA=(long)(256.0*((double)(m_w*m_w))/((double)(m_h*m_h)));
          m_kB=(long)(256.0*max_disparity*max_disparity*((double)(m_w*m_w)));
      }
  
      m_nr_h=1+(im_width-1)/m_bw;
      m_nr_v=1+(im_height-1)/m_bh;
  
      m_target=target_nr_corners;
  
      /*Alloc bucket structure*/
      m_bp_l=db_AllocBuckets_u(m_nr_h,m_nr_v,m_bd);
      m_bp_r=db_AllocBuckets_u(m_nr_h,m_nr_v,m_bd);
  
      m_use_smaller_matching_window = use_smaller_matching_window;
      m_use_21 = use_21;
  
      if(m_use_21)
      {
          /*Alloc 64byte-aligned space for patch layouts*/
          m_patch_space=new short [2*(m_nr_h+2)*(m_nr_v+2)*m_bd*512+64];
          m_aligned_patch_space=db_AlignPointer_s(m_patch_space,64);
      }
      else
      {
      if(!m_use_smaller_matching_window)
      {
          /*Alloc 16byte-aligned space for patch layouts*/
          m_patch_space=new short [2*(m_nr_h+2)*(m_nr_v+2)*m_bd*128+16];
          m_aligned_patch_space=db_AlignPointer_s(m_patch_space,16);
      }
      else
      {
          /*Alloc 4byte-aligned space for patch layouts*/
          m_patch_space=new short [2*(m_nr_h+2)*(m_nr_v+2)*m_bd*32+4];
          m_aligned_patch_space=db_AlignPointer_s(m_patch_space,4);
      }
      }
  
      return(m_target);
  }
  
  void db_Matcher_u::Match(const unsigned char * const *l_img,const unsigned char * const *r_img,
          const double *x_l,const double *y_l,int nr_l,const double *x_r,const double *y_r,int nr_r,
          int *id_l,int *id_r,int *nr_matches,const double H[9],int affine)
  {
      short *ps;
  
      /*Insert the corners into bucket structure*/
      ps=db_FillBuckets_u(m_aligned_patch_space,l_img,m_bp_l,m_bw,m_bh,m_nr_h,m_nr_v,m_bd,x_l,y_l,nr_l,m_use_smaller_matching_window,m_use_21);
      if(H==0)
          db_FillBuckets_u(ps,r_img,m_bp_r,m_bw,m_bh,m_nr_h,m_nr_v,m_bd,x_r,y_r,nr_r,m_use_smaller_matching_window,m_use_21);
      else
      {
          if (affine)
          {
              double Hinv[9];
              db_InvertAffineTransform(Hinv,H);
              float r_w, c_w;
              float stretch_x[2];
              float stretch_y[2];
              AffineWarpPointOffset(r_w,c_w,Hinv, 5,5);
              stretch_x[0]=db_absf(c_w);stretch_y[0]=db_absf(r_w);
              AffineWarpPointOffset(r_w,c_w,Hinv, 5,-5);
              stretch_x[1]=db_absf(c_w);stretch_y[1]=db_absf(r_w);
              int max_stretxh_x=(int) (db_maxd(stretch_x[0],stretch_x[1]));
              int max_stretxh_y=(int) (db_maxd(stretch_y[0],stretch_y[1]));
              int warpbounds[4]={max_stretxh_x,m_w-1-max_stretxh_x,max_stretxh_y,m_h-1-max_stretxh_y};
  
              for (int r=-5;r<=5;r++){
                  for (int c=-5;c<=5;c++){
                      AffineWarpPointOffset(r_w,c_w,Hinv,r,c);
                      AffineWarpPoint_BL_LUT_y[r+5][c+5]=r_w;
                      AffineWarpPoint_BL_LUT_x[r+5][c+5]=c_w;
  
                      AffineWarpPoint_NN_LUT_y[r+5][c+5]=db_roundi(r_w);
                      AffineWarpPoint_NN_LUT_x[r+5][c+5]=db_roundi(c_w);
  
                  }
              }
  
              db_FillBucketsPrewarpedAffine_u(ps,r_img,m_bp_r,m_bw,m_bh,m_nr_h,m_nr_v,m_bd,
                  x_r,y_r,nr_r,H,Hinv,warpbounds,affine);
          }
          else
              db_FillBucketsPrewarped_u(ps,r_img,m_bp_r,m_bw,m_bh,m_nr_h,m_nr_v,m_bd,x_r,y_r,nr_r,H);
      }
  
  
      /*Compute all the necessary match scores*/
      db_MatchBuckets_u(m_bp_l,m_bp_r,m_nr_h,m_nr_v,m_kA,m_kB, m_rect_window,m_use_smaller_matching_window,m_use_21);
  
      /*Collect the correspondences*/
      db_CollectMatches_u(m_bp_l,m_nr_h,m_nr_v,m_target,id_l,id_r,nr_matches);
  }
  
  int db_Matcher_u::IsAllocated()
  {
      return (int)(m_w != 0);
  }
  