/******************************************************************************
 **	Filename:    float2int.c
 **	Purpose:     Routines for converting float features to int features
 **	Author:      Dan Johnson
 **	History:     Wed Mar 13 07:47:48 1991, DSJ, Created.
 **
 **	(c) Copyright Hewlett-Packard Company, 1988.
 ** 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 Files and Type Defines
----------------------------------------------------------------------------**/
#include "float2int.h"
#include "normmatch.h"
#include "mfoutline.h"
#include "classify.h"
#include "picofeat.h"

#define MAX_INT_CHAR_NORM (INT_CHAR_NORM_RANGE - 1)

/**----------------------------------------------------------------------------
              Public Code
----------------------------------------------------------------------------**/
/*---------------------------------------------------------------------------*/
namespace tesseract {

void ClearCharNormArray(INT_TEMPLATES Templates,
                        CLASS_NORMALIZATION_ARRAY CharNormArray) {
/*
 **	Parameters:
 **		Templates	specifies classes currently defined
 **		CharNormArray	array to be cleared
 **	Globals: none
 **	Operation: For each class in Templates, clear the corresponding
 **		entry in CharNormArray.  CharNormArray is indexed by class
 **		indicies (as obtained from Templates) rather than class id's.
 **	Return: none
 **	Exceptions: none
 **	History: Wed Feb 20 11:20:54 1991, DSJ, Created.
 */
  int i;

  for (i = 0; i < Templates->NumClasses; i++) {
    CharNormArray[i] = 0;
  }

}                                /* ClearCharNormArray */


/*---------------------------------------------------------------------------*/
void Classify::ComputeIntCharNormArray(
  FEATURE NormFeature, INT_TEMPLATES Templates,
  CLASS_NORMALIZATION_ARRAY CharNormArray) {
/*
 **	Parameters:
 **		NormFeature	character normalization feature
 **		Templates	specifies classes currently defined
 **		CharNormArray	place to put results
 **	Globals: none
 **	Operation: For each class in Templates, compute the match between
 **		NormFeature and the normalization protos for that class.
 **		Convert this number to the range from 0 - 255 and store it
 **		into CharNormArray.  CharNormArray is indexed by class
 **		indicies (as obtained from Templates) rather than class id's.
 **	Return: none (results are returned in CharNormArray)
 **	Exceptions: none
 **	History: Wed Feb 20 11:20:54 1991, DSJ, Created.
 */
  int i;
  int NormAdjust;

  for (i = 0; i < Templates->NumClasses; i++) {
    NormAdjust = (int) (INT_CHAR_NORM_RANGE *
      ComputeNormMatch (i, NormFeature, FALSE));
    if (NormAdjust < 0)
      NormAdjust = 0;
    else if (NormAdjust > MAX_INT_CHAR_NORM)
      NormAdjust = MAX_INT_CHAR_NORM;

    CharNormArray[i] = NormAdjust;
  }
}                                /* ComputeIntCharNormArray */

}  // namespace tesseract

/*---------------------------------------------------------------------------*/
void ComputeIntFeatures(FEATURE_SET Features, INT_FEATURE_ARRAY IntFeatures) {
/*
 **	Parameters:
 **		Features	floating point pico-features to be converted
 **		IntFeatures	array to put converted features into
 **	Globals: none
 **	Operation: This routine converts each floating point pico-feature
 **		in Features into integer format and saves it into
 **		IntFeatures.
 **	Return: none (results are returned in IntFeatures)
 **	Exceptions: none
 **	History: Wed Feb 20 10:58:45 1991, DSJ, Created.
 */
  int Fid;
  FEATURE Feature;
  FLOAT32 YShift;

  if (classify_norm_method == baseline)
    YShift = BASELINE_Y_SHIFT;
  else
    YShift = Y_SHIFT;

  for (Fid = 0; Fid < Features->NumFeatures; Fid++) {
    Feature = Features->Features[Fid];

    IntFeatures[Fid].X = BucketFor (Feature->Params[PicoFeatX],
      X_SHIFT, INT_FEAT_RANGE);
    IntFeatures[Fid].Y = BucketFor (Feature->Params[PicoFeatY],
      YShift, INT_FEAT_RANGE);
    IntFeatures[Fid].Theta = CircBucketFor (Feature->Params[PicoFeatDir],
      ANGLE_SHIFT, INT_FEAT_RANGE);
    IntFeatures[Fid].CP_misses = 0;
  }
}                                /* ComputeIntFeatures */
