/******************************************************************************
 **	Filename:    mfdefs.h
 **	Purpose:     Definition of micro-features
 **	Author:      Dan Johnson
 **	History:     Mon Jan 22 08:42:13 1990, 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.
 ******************************************************************************/
#ifndef   MFDEFS_H
#define   MFDEFS_H

/**----------------------------------------------------------------------------
          Include Files and Type Defines
----------------------------------------------------------------------------**/
#include "oldlist.h"
#include "matchdefs.h"
#include "xform2d.h"

/* maximum size of a bulge for length=1 is sqrt(2)/3 */
#define BULGENORMALIZER   0.942809041

/* definition of a list of micro-features */
typedef LIST MICROFEATURES;

/* definition of structure of micro-features */
#define MFSIZE        6
typedef FLOAT32 MFBLOCK[MFSIZE];
typedef FLOAT32 *MICROFEATURE;

/* definitions of individual micro-feature parameters */
#define XPOSITION     0
#define YPOSITION     1
#define MFLENGTH      2
#define ORIENTATION     3
#define FIRSTBULGE      4
#define SECONDBULGE     5

/**----------------------------------------------------------------------------
            Macros
----------------------------------------------------------------------------**/
/* macros for accessing micro-feature parameters */
#define CenterX(M)    ( (M)[XPOSITION] )
#define CenterY(M)    ( (M)[YPOSITION] )
#define LengthOf(M)   ( (M)[MFLENGTH] )
#define OrientationOf(M)  ( (M)[ORIENTATION] )
#define FirstBulgeOf(M)   ( (M)[FIRSTBULGE] )
#define SecondBulgeOf(M)  ( (M)[SECONDBULGE] )

/* macros for accessing micro-feature lists */
#define NextFeatureOf(L)  ( (MICROFEATURE) first_node ( L ) )

/**----------------------------------------------------------------------------
          Public Function Prototypes
----------------------------------------------------------------------------**/
MICROFEATURE NewMicroFeature();

void FreeMicroFeatures(MICROFEATURES MicroFeatures);
#endif
