/**********************************************************************
 * File:        paircmp.cpp  (Formerly paircmp.c)
 * Description: Code to compare two blobs using the adaptive matcher
 * Author:		Ray Smith
 * Created:		Wed Apr 21 09:31:02 BST 1993
 *
 * (C) Copyright 1993, Hewlett-Packard Ltd.
 ** 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.
 *
 **********************************************************************/

#include "mfcpch.h"
#include          "blobcmp.h"
#include          "tfacep.h"
#include          "paircmp.h"

#define EXTERN

/**********************************************************************
 * compare_blob_pairs
 *
 * A blob processor to compare pairs of selected blobs.
 **********************************************************************/

BOOL8 compare_blob_pairs(             //blob processor
                         BLOCK *,
                         ROW *row,    //row it came from
                         WERD *,
                         PBLOB *blob  //blob to compare
                        ) {
  static ROW *prev_row = NULL;   //other in pair
  static PBLOB *prev_blob = NULL;
  float rating;                  //from matcher

  if (prev_row == NULL || prev_blob == NULL) {
    prev_row = row;
    prev_blob = blob;
  }
  else {
    rating = compare_blobs (prev_blob, prev_row, blob, row);
    tprintf ("Rating=%g\n", rating);
    prev_row = NULL;
    prev_blob = NULL;
  }
  return TRUE;
}


/**********************************************************************
 * compare_blobs
 *
 * Compare 2 blobs and return the rating.
 **********************************************************************/

float compare_blobs(               //match 2 blobs
                    PBLOB *blob1,  //first blob
                    ROW *row1,     //row it came from
                    PBLOB *blob2,  //other blob
                    ROW *row2) {
  PBLOB *bn_blob1;               //baseline norm
  PBLOB *bn_blob2;
  DENORM denorm1, denorm2;
  float rating;                  //match result

  bn_blob1 = blob1->baseline_normalise (row1, &denorm1);
  bn_blob2 = blob2->baseline_normalise (row2, &denorm2);
  rating = compare_bln_blobs (bn_blob1, &denorm1, bn_blob2, &denorm2);
  delete bn_blob1;
  delete bn_blob2;
  return rating;
}


/**********************************************************************
 * compare_bln_blobs
 *
 * Compare 2 baseline normalised blobs and return the rating.
 **********************************************************************/

float compare_bln_blobs(               //match 2 blobs
                        PBLOB *blob1,  //first blob
                        DENORM *denorm1,
                        PBLOB *blob2,  //other blob
                        DENORM *denorm2) {
  TBLOB *tblob1;                 //tessblobs
  TBLOB *tblob2;
  TEXTROW tessrow1, tessrow2;    //tess rows
  float rating;                  //match result

  tblob1 = make_tess_blob (blob1, TRUE);
  make_tess_row(denorm1, &tessrow1); 
  tblob2 = make_tess_blob (blob2, TRUE);
  make_tess_row(denorm2, &tessrow2); 
  rating = compare_tess_blobs (tblob1, &tessrow1, tblob2, &tessrow2);
  free_blob(tblob1); 
  free_blob(tblob2); 

  return rating;
}
