tesseract  4.00.00dev
intproto.cpp File Reference
#include <math.h>
#include <stdio.h>
#include <assert.h>
#include "classify.h"
#include "const.h"
#include "emalloc.h"
#include "fontinfo.h"
#include "genericvector.h"
#include "globals.h"
#include "helpers.h"
#include "intproto.h"
#include "mfoutline.h"
#include "ndminx.h"
#include "picofeat.h"
#include "points.h"
#include "shapetable.h"
#include "svmnode.h"

Go to the source code of this file.

Classes

struct  FILL_SWITCH
 
struct  TABLE_FILLER
 
struct  FILL_SPEC
 

Namespaces

 tesseract
 

Macros

#define PROTO_PRUNER_SCALE   (4.0)
 
#define INT_DESCENDER   (0.0 * INT_CHAR_NORM_RANGE)
 
#define INT_BASELINE   (0.25 * INT_CHAR_NORM_RANGE)
 
#define INT_XHEIGHT   (0.75 * INT_CHAR_NORM_RANGE)
 
#define INT_CAPHEIGHT   (1.0 * INT_CHAR_NORM_RANGE)
 
#define INT_XCENTER   (0.5 * INT_CHAR_NORM_RANGE)
 
#define INT_YCENTER   (0.5 * INT_CHAR_NORM_RANGE)
 
#define INT_XRADIUS   (0.2 * INT_CHAR_NORM_RANGE)
 
#define INT_YRADIUS   (0.2 * INT_CHAR_NORM_RANGE)
 
#define INT_MIN_X   0
 
#define INT_MIN_Y   0
 
#define INT_MAX_X   INT_CHAR_NORM_RANGE
 
#define INT_MAX_Y   INT_CHAR_NORM_RANGE
 
#define HV_TOLERANCE   (0.0025) /* approx 0.9 degrees */
 
#define MAX_NUM_SWITCHES   3
 
#define OLD_MAX_NUM_CONFIGS   32
 
#define OLD_WERDS_PER_CONFIG_VEC
 
#define CircularIncrement(i, r)   (((i) < (r) - 1)?((i)++):((i) = 0))
 
#define MapParam(P, O, N)   (floor (((P) + (O)) * (N)))
 
#define MAX_LEVEL   2
 
#define XS   X_SHIFT
 
#define YS   Y_SHIFT
 
#define AS   ANGLE_SHIFT
 
#define NB   NUM_CP_BUCKETS
 

Enumerations

enum  SWITCH_TYPE { StartSwitch, EndSwitch, LastSwitch }
 

Functions

FLOAT32 BucketStart (int Bucket, FLOAT32 Offset, int NumBuckets)
 
FLOAT32 BucketEnd (int Bucket, FLOAT32 Offset, int NumBuckets)
 
void DoFill (FILL_SPEC *FillSpec, CLASS_PRUNER_STRUCT *Pruner, register uinT32 ClassMask, register uinT32 ClassCount, register uinT32 WordIndex)
 
BOOL8 FillerDone (TABLE_FILLER *Filler)
 
void FillPPCircularBits (uinT32 ParamTable[NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR], int Bit, FLOAT32 Center, FLOAT32 Spread, bool debug)
 
void FillPPLinearBits (uinT32 ParamTable[NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR], int Bit, FLOAT32 Center, FLOAT32 Spread, bool debug)
 
void GetCPPadsForLevel (int Level, FLOAT32 *EndPad, FLOAT32 *SidePad, FLOAT32 *AnglePad)
 
ScrollView::Color GetMatchColorFor (FLOAT32 Evidence)
 
void GetNextFill (TABLE_FILLER *Filler, FILL_SPEC *Fill)
 
void InitTableFiller (FLOAT32 EndPad, FLOAT32 SidePad, FLOAT32 AnglePad, PROTO Proto, TABLE_FILLER *Filler)
 
void RenderIntFeature (ScrollView *window, const INT_FEATURE_STRUCT *Feature, ScrollView::Color color)
 
void RenderIntProto (ScrollView *window, INT_CLASS Class, PROTO_ID ProtoId, ScrollView::Color color)
 
int TruncateParam (FLOAT32 Param, int Min, int Max, char *Id)
 
void AddIntClass (INT_TEMPLATES Templates, CLASS_ID ClassId, INT_CLASS Class)
 
int AddIntConfig (INT_CLASS Class)
 
int AddIntProto (INT_CLASS Class)
 
void AddProtoToClassPruner (PROTO Proto, CLASS_ID ClassId, INT_TEMPLATES Templates)
 
void AddProtoToProtoPruner (PROTO Proto, int ProtoId, INT_CLASS Class, bool debug)
 
uinT8 Bucket8For (FLOAT32 param, FLOAT32 offset, int num_buckets)
 
uinT16 Bucket16For (FLOAT32 param, FLOAT32 offset, int num_buckets)
 
uinT8 CircBucketFor (FLOAT32 param, FLOAT32 offset, int num_buckets)
 
void UpdateMatchDisplay ()
 
void ConvertConfig (BIT_VECTOR Config, int ConfigId, INT_CLASS Class)
 
void DisplayIntFeature (const INT_FEATURE_STRUCT *Feature, FLOAT32 Evidence)
 
void DisplayIntProto (INT_CLASS Class, PROTO_ID ProtoId, FLOAT32 Evidence)
 
INT_CLASS NewIntClass (int MaxNumProtos, int MaxNumConfigs)
 
void free_int_class (INT_CLASS int_class)
 
INT_TEMPLATES NewIntTemplates ()
 
void free_int_templates (INT_TEMPLATES templates)
 
void tesseract::ClearFeatureSpaceWindow (NORM_METHOD norm_method, ScrollView *window)
 
void InitIntMatchWindowIfReqd ()
 
void InitProtoDisplayWindowIfReqd ()
 
void InitFeatureDisplayWindowIfReqd ()
 
ScrollViewCreateFeatureSpaceWindow (const char *name, int xpos, int ypos)
 

Variables

ScrollViewIntMatchWindow = NULL
 
ScrollViewFeatureDisplayWindow = NULL
 
ScrollViewProtoDisplayWindow = NULL
 
int classify_num_cp_levels = 3
 
double classify_cp_angle_pad_loose = 45.0
 
double classify_cp_angle_pad_medium = 20.0
 
double classify_cp_angle_pad_tight = 10.0
 
double classify_cp_end_pad_loose = 0.5
 
double classify_cp_end_pad_medium = 0.5
 
double classify_cp_end_pad_tight = 0.5
 
double classify_cp_side_pad_loose = 2.5
 
double classify_cp_side_pad_medium = 1.2
 
double classify_cp_side_pad_tight = 0.6
 
double classify_pp_angle_pad = 45.0
 
double classify_pp_end_pad = 0.5
 
double classify_pp_side_pad = 2.5
 

Macro Definition Documentation

◆ AS

#define AS   ANGLE_SHIFT

◆ CircularIncrement

#define CircularIncrement (   i,
 
)    (((i) < (r) - 1)?((i)++):((i) = 0))

macro for performing circular increments of bucket indices

Definition at line 120 of file intproto.cpp.

◆ HV_TOLERANCE

#define HV_TOLERANCE   (0.0025) /* approx 0.9 degrees */

define pad used to snap near horiz/vertical protos to horiz/vertical

Definition at line 69 of file intproto.cpp.

◆ INT_BASELINE

#define INT_BASELINE   (0.25 * INT_CHAR_NORM_RANGE)

Definition at line 55 of file intproto.cpp.

◆ INT_CAPHEIGHT

#define INT_CAPHEIGHT   (1.0 * INT_CHAR_NORM_RANGE)

Definition at line 57 of file intproto.cpp.

◆ INT_DESCENDER

#define INT_DESCENDER   (0.0 * INT_CHAR_NORM_RANGE)

Definition at line 54 of file intproto.cpp.

◆ INT_MAX_X

#define INT_MAX_X   INT_CHAR_NORM_RANGE

Definition at line 65 of file intproto.cpp.

◆ INT_MAX_Y

#define INT_MAX_Y   INT_CHAR_NORM_RANGE

Definition at line 66 of file intproto.cpp.

◆ INT_MIN_X

#define INT_MIN_X   0

Definition at line 63 of file intproto.cpp.

◆ INT_MIN_Y

#define INT_MIN_Y   0

Definition at line 64 of file intproto.cpp.

◆ INT_XCENTER

#define INT_XCENTER   (0.5 * INT_CHAR_NORM_RANGE)

Definition at line 59 of file intproto.cpp.

◆ INT_XHEIGHT

#define INT_XHEIGHT   (0.75 * INT_CHAR_NORM_RANGE)

Definition at line 56 of file intproto.cpp.

◆ INT_XRADIUS

#define INT_XRADIUS   (0.2 * INT_CHAR_NORM_RANGE)

Definition at line 61 of file intproto.cpp.

◆ INT_YCENTER

#define INT_YCENTER   (0.5 * INT_CHAR_NORM_RANGE)

Definition at line 60 of file intproto.cpp.

◆ INT_YRADIUS

#define INT_YRADIUS   (0.2 * INT_CHAR_NORM_RANGE)

Definition at line 62 of file intproto.cpp.

◆ MapParam

#define MapParam (   P,
  O,
 
)    (floor (((P) + (O)) * (N)))

macro for mapping floats to ints without bounds checking

Definition at line 123 of file intproto.cpp.

◆ MAX_LEVEL

#define MAX_LEVEL   2

◆ MAX_NUM_SWITCHES

#define MAX_NUM_SWITCHES   3

Definition at line 74 of file intproto.cpp.

◆ NB

#define NB   NUM_CP_BUCKETS

◆ OLD_MAX_NUM_CONFIGS

#define OLD_MAX_NUM_CONFIGS   32

Definition at line 112 of file intproto.cpp.

◆ OLD_WERDS_PER_CONFIG_VEC

#define OLD_WERDS_PER_CONFIG_VEC
Value:
#define BITS_PER_WERD
Definition: intproto.h:44
#define OLD_MAX_NUM_CONFIGS
Definition: intproto.cpp:112

Definition at line 113 of file intproto.cpp.

◆ PROTO_PRUNER_SCALE

#define PROTO_PRUNER_SCALE   (4.0)

Definition at line 52 of file intproto.cpp.

◆ XS

#define XS   X_SHIFT

◆ YS

#define YS   Y_SHIFT

Enumeration Type Documentation

◆ SWITCH_TYPE

Enumerator
StartSwitch 
EndSwitch 
LastSwitch 

Definition at line 71 of file intproto.cpp.

Function Documentation

◆ AddIntClass()

void AddIntClass ( INT_TEMPLATES  Templates,
CLASS_ID  ClassId,
INT_CLASS  Class 
)

This routine adds a new class structure to a set of templates. Classes have to be added to Templates in the order of increasing ClassIds.

Parameters
Templatestemplates to add new class to
ClassIdclass id to associate new class with
Classclass data structure to add to templates

Globals: none

Note
Exceptions: none
History: Mon Feb 11 11:52:08 1991, DSJ, Created.

Definition at line 238 of file intproto.cpp.

238  {
239  int Pruner;
240 
241  assert (LegalClassId (ClassId));
242  if (ClassId != Templates->NumClasses) {
243  fprintf(stderr, "Please make sure that classes are added to templates");
244  fprintf(stderr, " in increasing order of ClassIds\n");
245  exit(1);
246  }
247  ClassForClassId (Templates, ClassId) = Class;
248  Templates->NumClasses++;
249 
250  if (Templates->NumClasses > MaxNumClassesIn (Templates)) {
251  Pruner = Templates->NumClassPruners++;
252  Templates->ClassPruners[Pruner] = new CLASS_PRUNER_STRUCT;
253  memset(Templates->ClassPruners[Pruner], 0, sizeof(CLASS_PRUNER_STRUCT));
254  }
255 } /* AddIntClass */
CLASS_PRUNER_STRUCT * ClassPruners[MAX_NUM_CLASS_PRUNERS]
Definition: intproto.h:125
#define LegalClassId(c)
Definition: intproto.h:179
#define ClassForClassId(T, c)
Definition: intproto.h:181
#define MaxNumClassesIn(T)
Definition: intproto.h:178

◆ AddIntConfig()

int AddIntConfig ( INT_CLASS  Class)

This routine returns the index of the next free config in Class.

Parameters
Classclass to add new configuration to

Globals: none

Returns
Index of next free config.
Note
Exceptions: none
History: Mon Feb 11 14:44:40 1991, DSJ, Created.

Definition at line 270 of file intproto.cpp.

270  {
271  int Index;
272 
273  assert(Class->NumConfigs < MAX_NUM_CONFIGS);
274 
275  Index = Class->NumConfigs++;
276  Class->ConfigLengths[Index] = 0;
277  return Index;
278 } /* AddIntConfig */
uinT8 NumConfigs
Definition: intproto.h:110
uinT16 ConfigLengths[MAX_NUM_CONFIGS]
Definition: intproto.h:113
#define MAX_NUM_CONFIGS
Definition: intproto.h:46

◆ AddIntProto()

int AddIntProto ( INT_CLASS  Class)

This routine allocates the next free proto in Class and returns its index.

Parameters
Classclass to add new proto to

Globals: none

Returns
Proto index of new proto.
Note
Exceptions: none
History: Mon Feb 11 13:26:41 1991, DSJ, Created.

Definition at line 293 of file intproto.cpp.

293  {
294  int Index;
295  int ProtoSetId;
296  PROTO_SET ProtoSet;
297  INT_PROTO Proto;
298  uinT32 *Word;
299 
300  if (Class->NumProtos >= MAX_NUM_PROTOS)
301  return (NO_PROTO);
302 
303  Index = Class->NumProtos++;
304 
305  if (Class->NumProtos > MaxNumIntProtosIn(Class)) {
306  ProtoSetId = Class->NumProtoSets++;
307 
308  ProtoSet = (PROTO_SET) Emalloc(sizeof(PROTO_SET_STRUCT));
309  Class->ProtoSets[ProtoSetId] = ProtoSet;
310  memset(ProtoSet, 0, sizeof(*ProtoSet));
311 
312  /* reallocate space for the proto lengths and install in class */
313  Class->ProtoLengths =
314  (uinT8 *)Erealloc(Class->ProtoLengths,
315  MaxNumIntProtosIn(Class) * sizeof(uinT8));
316  memset(&Class->ProtoLengths[Index], 0,
317  sizeof(*Class->ProtoLengths) * (MaxNumIntProtosIn(Class) - Index));
318  }
319 
320  /* initialize proto so its length is zero and it isn't in any configs */
321  Class->ProtoLengths[Index] = 0;
322  Proto = ProtoForProtoId (Class, Index);
323  for (Word = Proto->Configs;
324  Word < Proto->Configs + WERDS_PER_CONFIG_VEC; *Word++ = 0);
325 
326  return (Index);
327 }
PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS]
Definition: intproto.h:111
uinT8 NumProtoSets
Definition: intproto.h:109
#define MAX_NUM_PROTOS
Definition: intproto.h:47
struct PROTO_SET_STRUCT * PROTO_SET
void * Emalloc(int Size)
Definition: emalloc.cpp:47
uinT16 NumProtos
Definition: intproto.h:108
uinT8 * ProtoLengths
Definition: intproto.h:112
#define ProtoForProtoId(C, P)
Definition: intproto.h:171
uint32_t uinT32
Definition: host.h:39
uinT32 Configs[WERDS_PER_CONFIG_VEC]
Definition: intproto.h:86
#define NO_PROTO
Definition: matchdefs.h:42
void * Erealloc(void *ptr, int size)
Definition: emalloc.cpp:64
uint8_t uinT8
Definition: host.h:35
#define MaxNumIntProtosIn(C)
Definition: intproto.h:168
#define WERDS_PER_CONFIG_VEC
Definition: intproto.h:68

◆ AddProtoToClassPruner()

void AddProtoToClassPruner ( PROTO  Proto,
CLASS_ID  ClassId,
INT_TEMPLATES  Templates 
)

This routine adds Proto to the class pruning tables for the specified class in Templates.

Globals:

  • classify_num_cp_levels number of levels used in the class pruner
    Parameters
    Protofloating-pt proto to add to class pruner
    ClassIdclass id corresponding to Proto
    Templatesset of templates containing class pruner
    Returns
    none
    Note
    Exceptions: none
    History: Wed Feb 13 08:49:54 1991, DSJ, Created.

Definition at line 342 of file intproto.cpp.

345 {
346  CLASS_PRUNER_STRUCT* Pruner;
347  uinT32 ClassMask;
348  uinT32 ClassCount;
349  uinT32 WordIndex;
350  int Level;
351  FLOAT32 EndPad, SidePad, AnglePad;
352  TABLE_FILLER TableFiller;
353  FILL_SPEC FillSpec;
354 
355  Pruner = CPrunerFor (Templates, ClassId);
356  WordIndex = CPrunerWordIndexFor (ClassId);
357  ClassMask = CPrunerMaskFor (MAX_LEVEL, ClassId);
358 
359  for (Level = classify_num_cp_levels - 1; Level >= 0; Level--) {
360  GetCPPadsForLevel(Level, &EndPad, &SidePad, &AnglePad);
361  ClassCount = CPrunerMaskFor (Level, ClassId);
362  InitTableFiller(EndPad, SidePad, AnglePad, Proto, &TableFiller);
363 
364  while (!FillerDone (&TableFiller)) {
365  GetNextFill(&TableFiller, &FillSpec);
366  DoFill(&FillSpec, Pruner, ClassMask, ClassCount, WordIndex);
367  }
368  }
369 } /* AddProtoToClassPruner */
void InitTableFiller(FLOAT32 EndPad, FLOAT32 SidePad, FLOAT32 AnglePad, PROTO Proto, TABLE_FILLER *Filler)
Definition: intproto.cpp:1528
void DoFill(FILL_SPEC *FillSpec, CLASS_PRUNER_STRUCT *Pruner, register uinT32 ClassMask, register uinT32 ClassCount, register uinT32 WordIndex)
Definition: intproto.cpp:1181
#define CPrunerWordIndexFor(c)
Definition: intproto.h:185
int classify_num_cp_levels
Definition: intproto.cpp:188
uint32_t uinT32
Definition: host.h:39
#define CPrunerFor(T, c)
Definition: intproto.h:184
void GetCPPadsForLevel(int Level, FLOAT32 *EndPad, FLOAT32 *SidePad, FLOAT32 *AnglePad)
Definition: intproto.cpp:1409
float FLOAT32
Definition: host.h:42
void GetNextFill(TABLE_FILLER *Filler, FILL_SPEC *Fill)
Definition: intproto.cpp:1476
#define CPrunerMaskFor(L, c)
Definition: intproto.h:187
BOOL8 FillerDone(TABLE_FILLER *Filler)
Definition: intproto.cpp:1223
#define MAX_LEVEL

◆ AddProtoToProtoPruner()

void AddProtoToProtoPruner ( PROTO  Proto,
int  ProtoId,
INT_CLASS  Class,
bool  debug 
)

This routine updates the proto pruner lookup tables for Class to include a new proto identified by ProtoId and described by Proto.

Parameters
Protofloating-pt proto to be added to proto pruner
ProtoIdid of proto
Classinteger class that contains desired proto pruner
debugdebug flag
Note
Globals: none
Returns
none
Note
Exceptions: none
History: Fri Feb 8 13:07:19 1991, DSJ, Created.

Definition at line 384 of file intproto.cpp.

385  {
386  FLOAT32 Angle, X, Y, Length;
387  FLOAT32 Pad;
388  int Index;
389  PROTO_SET ProtoSet;
390 
391  if (ProtoId >= Class->NumProtos)
392  cprintf("AddProtoToProtoPruner:assert failed: %d < %d",
393  ProtoId, Class->NumProtos);
394  assert(ProtoId < Class->NumProtos);
395 
396  Index = IndexForProto (ProtoId);
397  ProtoSet = Class->ProtoSets[SetForProto (ProtoId)];
398 
399  Angle = Proto->Angle;
400 #ifndef _WIN32
401  assert(!isnan(Angle));
402 #endif
403 
404  FillPPCircularBits (ProtoSet->ProtoPruner[PRUNER_ANGLE], Index,
405  Angle + ANGLE_SHIFT, classify_pp_angle_pad / 360.0,
406  debug);
407 
408  Angle *= 2.0 * PI;
409  Length = Proto->Length;
410 
411  X = Proto->X + X_SHIFT;
412  Pad = MAX (fabs (cos (Angle)) * (Length / 2.0 +
415  fabs (sin (Angle)) * (classify_pp_side_pad *
417 
418  FillPPLinearBits(ProtoSet->ProtoPruner[PRUNER_X], Index, X, Pad, debug);
419 
420  Y = Proto->Y + Y_SHIFT;
421  Pad = MAX (fabs (sin (Angle)) * (Length / 2.0 +
424  fabs (cos (Angle)) * (classify_pp_side_pad *
426 
427  FillPPLinearBits(ProtoSet->ProtoPruner[PRUNER_Y], Index, Y, Pad, debug);
428 } /* AddProtoToProtoPruner */
PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS]
Definition: intproto.h:111
#define PRUNER_ANGLE
Definition: intproto.h:36
#define PRUNER_Y
Definition: intproto.h:35
void FillPPCircularBits(uinT32 ParamTable[NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR], int Bit, FLOAT32 Center, FLOAT32 Spread, bool debug)
Definition: intproto.cpp:1252
uinT16 NumProtos
Definition: intproto.h:108
double classify_pp_side_pad
Definition: intproto.cpp:203
PROTO_PRUNER ProtoPruner
Definition: intproto.h:96
FLOAT32 Length
Definition: protos.h:50
#define PI
Definition: const.h:19
#define Y_SHIFT
Definition: intproto.h:41
#define X_SHIFT
Definition: intproto.h:40
#define IndexForProto(P)
Definition: intproto.h:170
#define isnan(x)
Definition: mathfix.h:31
FLOAT32 Y
Definition: protos.h:48
FLOAT32 X
Definition: protos.h:47
#define ANGLE_SHIFT
Definition: intproto.h:39
#define MAX(x, y)
Definition: ndminx.h:24
#define SetForProto(P)
Definition: intproto.h:169
float FLOAT32
Definition: host.h:42
#define PRUNER_X
Definition: intproto.h:34
FLOAT32 Angle
Definition: protos.h:49
void cprintf(const char *format,...)
Definition: callcpp.cpp:40
double classify_pp_angle_pad
Definition: intproto.cpp:201
void FillPPLinearBits(uinT32 ParamTable[NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR], int Bit, FLOAT32 Center, FLOAT32 Spread, bool debug)
Definition: intproto.cpp:1295
#define GetPicoFeatureLength()
Definition: picofeat.h:59
double classify_pp_end_pad
Definition: intproto.cpp:202

◆ Bucket16For()

uinT16 Bucket16For ( FLOAT32  param,
FLOAT32  offset,
int  num_buckets 
)

Definition at line 439 of file intproto.cpp.

439  {
440  int bucket = IntCastRounded(MapParam(param, offset, num_buckets));
441  return static_cast<uinT16>(ClipToRange(bucket, 0, num_buckets - 1));
442 }
voidpf uLong offset
Definition: ioapi.h:42
#define MapParam(P, O, N)
Definition: intproto.cpp:123
int IntCastRounded(double x)
Definition: helpers.h:179
T ClipToRange(const T &x, const T &lower_bound, const T &upper_bound)
Definition: helpers.h:122
uint16_t uinT16
Definition: host.h:37

◆ Bucket8For()

uinT8 Bucket8For ( FLOAT32  param,
FLOAT32  offset,
int  num_buckets 
)

Returns a quantized bucket for the given param shifted by offset, notionally (param + offset) * num_buckets, but clipped and casted to the appropriate type.

Definition at line 435 of file intproto.cpp.

435  {
436  int bucket = IntCastRounded(MapParam(param, offset, num_buckets));
437  return static_cast<uinT8>(ClipToRange(bucket, 0, num_buckets - 1));
438 }
voidpf uLong offset
Definition: ioapi.h:42
#define MapParam(P, O, N)
Definition: intproto.cpp:123
int IntCastRounded(double x)
Definition: helpers.h:179
T ClipToRange(const T &x, const T &lower_bound, const T &upper_bound)
Definition: helpers.h:122
uint8_t uinT8
Definition: host.h:35

◆ BucketEnd()

FLOAT32 BucketEnd ( int  Bucket,
FLOAT32  Offset,
int  NumBuckets 
)

This routine returns the parameter value which corresponds to the end of the specified bucket. The bucket number should have been generated using the BucketFor() function with parameters Offset and NumBuckets.

Parameters
Bucketbucket whose end is to be computed
Offsetoffset used to map params to buckets
NumBucketstotal number of buckets
Returns
Param value corresponding to end position of Bucket.
Note
Globals: none
Exceptions: none
History: Thu Feb 14 13:24:33 1991, DSJ, Created.

Definition at line 1163 of file intproto.cpp.

1163  {
1164  return (((FLOAT32) (Bucket + 1) / NumBuckets) - Offset);
1165 } /* BucketEnd */
float FLOAT32
Definition: host.h:42

◆ BucketStart()

FLOAT32 BucketStart ( int  Bucket,
FLOAT32  Offset,
int  NumBuckets 
)

This routine returns the parameter value which corresponds to the beginning of the specified bucket. The bucket number should have been generated using the BucketFor() function with parameters Offset and NumBuckets.

Parameters
Bucketbucket whose start is to be computed
Offsetoffset used to map params to buckets
NumBucketstotal number of buckets
Returns
Param value corresponding to start position of Bucket.
Note
Globals: none
Exceptions: none
History: Thu Feb 14 13:24:33 1991, DSJ, Created.

Definition at line 1145 of file intproto.cpp.

1145  {
1146  return (((FLOAT32) Bucket / NumBuckets) - Offset);
1147 
1148 } /* BucketStart */
float FLOAT32
Definition: host.h:42

◆ CircBucketFor()

uinT8 CircBucketFor ( FLOAT32  param,
FLOAT32  offset,
int  num_buckets 
)

Returns a quantized bucket for the given circular param shifted by offset, notionally (param + offset) * num_buckets, but modded and casted to the appropriate type.

Definition at line 449 of file intproto.cpp.

449  {
450  int bucket = IntCastRounded(MapParam(param, offset, num_buckets));
451  return static_cast<uinT8>(Modulo(bucket, num_buckets));
452 } /* CircBucketFor */
voidpf uLong offset
Definition: ioapi.h:42
#define MapParam(P, O, N)
Definition: intproto.cpp:123
int IntCastRounded(double x)
Definition: helpers.h:179
uint8_t uinT8
Definition: host.h:35
int Modulo(int a, int b)
Definition: helpers.h:164

◆ ConvertConfig()

void ConvertConfig ( BIT_VECTOR  Config,
int  ConfigId,
INT_CLASS  Class 
)

This operation updates the config vectors of all protos in Class to indicate that the protos with 1's in Config belong to a new configuration identified by ConfigId. It is assumed that the length of the Config bit vector is equal to the number of protos in Class.

Parameters
Configconfig to be added to class
ConfigIdid to be used for new config
Classclass to add new config to
Returns
none
Note
Globals: none
Exceptions: none
History: Mon Feb 11 14:57:31 1991, DSJ, Created.

Definition at line 487 of file intproto.cpp.

487  {
488  int ProtoId;
489  INT_PROTO Proto;
490  int TotalLength;
491 
492  for (ProtoId = 0, TotalLength = 0;
493  ProtoId < Class->NumProtos; ProtoId++) {
494  if (test_bit(Config, ProtoId)) {
495  Proto = ProtoForProtoId(Class, ProtoId);
496  SET_BIT(Proto->Configs, ConfigId);
497  TotalLength += Class->ProtoLengths[ProtoId];
498  }
499  }
500  Class->ConfigLengths[ConfigId] = TotalLength;
501 } /* ConvertConfig */
uinT16 NumProtos
Definition: intproto.h:108
CLUSTERCONFIG Config
uinT8 * ProtoLengths
Definition: intproto.h:112
#define ProtoForProtoId(C, P)
Definition: intproto.h:171
uinT16 ConfigLengths[MAX_NUM_CONFIGS]
Definition: intproto.h:113
uinT32 Configs[WERDS_PER_CONFIG_VEC]
Definition: intproto.h:86
#define test_bit(array, bit)
Definition: bitvec.h:61
#define SET_BIT(array, bit)
Definition: bitvec.h:57

◆ CreateFeatureSpaceWindow()

ScrollView* CreateFeatureSpaceWindow ( const char *  name,
int  xpos,
int  ypos 
)

Creates a window of the appropriate size for displaying elements in feature space.

Definition at line 1858 of file intproto.cpp.

1858  {
1859  return new ScrollView(name, xpos, ypos, 520, 520, 260, 260, true);
1860 }

◆ DisplayIntFeature()

void DisplayIntFeature ( const INT_FEATURE_STRUCT Feature,
FLOAT32  Evidence 
)

This routine renders the specified feature into a global display list.

Globals:

  • FeatureShapes global display list for features
    Parameters
    Featurepico-feature to be displayed
    Evidencebest evidence for this feature (0-1)
    Returns
    none
    Note
    Exceptions: none
    History: Thu Mar 21 14:45:04 1991, DSJ, Created.

Definition at line 623 of file intproto.cpp.

623  {
624  ScrollView::Color color = GetMatchColorFor(Evidence);
625  RenderIntFeature(IntMatchWindow, Feature, color);
626  if (FeatureDisplayWindow) {
627  RenderIntFeature(FeatureDisplayWindow, Feature, color);
628  }
629 } /* DisplayIntFeature */
ScrollView * IntMatchWindow
Definition: intproto.cpp:179
void RenderIntFeature(ScrollView *window, const INT_FEATURE_STRUCT *Feature, ScrollView::Color color)
Definition: intproto.cpp:1693
ScrollView * FeatureDisplayWindow
Definition: intproto.cpp:180
ScrollView::Color GetMatchColorFor(FLOAT32 Evidence)
Definition: intproto.cpp:1450

◆ DisplayIntProto()

void DisplayIntProto ( INT_CLASS  Class,
PROTO_ID  ProtoId,
FLOAT32  Evidence 
)

This routine renders the specified proto into a global display list.

Globals:

  • ProtoShapes global display list for protos
    Parameters
    Classclass to take proto from
    ProtoIdid of proto in Class to be displayed
    Evidencetotal evidence for proto (0-1)
    Returns
    none
    Note
    Exceptions: none
    History: Thu Mar 21 14:45:04 1991, DSJ, Created.

Definition at line 644 of file intproto.cpp.

644  {
645  ScrollView::Color color = GetMatchColorFor(Evidence);
646  RenderIntProto(IntMatchWindow, Class, ProtoId, color);
647  if (ProtoDisplayWindow) {
648  RenderIntProto(ProtoDisplayWindow, Class, ProtoId, color);
649  }
650 } /* DisplayIntProto */
ScrollView * IntMatchWindow
Definition: intproto.cpp:179
void RenderIntProto(ScrollView *window, INT_CLASS Class, PROTO_ID ProtoId, ScrollView::Color color)
Definition: intproto.cpp:1729
ScrollView::Color GetMatchColorFor(FLOAT32 Evidence)
Definition: intproto.cpp:1450
ScrollView * ProtoDisplayWindow
Definition: intproto.cpp:181

◆ DoFill()

void DoFill ( FILL_SPEC FillSpec,
CLASS_PRUNER_STRUCT Pruner,
register uinT32  ClassMask,
register uinT32  ClassCount,
register uinT32  WordIndex 
)

This routine fills in the section of a class pruner corresponding to a single x value for a single proto of a class.

Parameters
FillSpecspecifies which bits to fill in pruner
Prunerclass pruner to be filled
ClassMaskindicates which bits to change in each word
ClassCountindicates what to change bits to
WordIndexindicates which word to change
Returns
none
Note
Globals: none
Exceptions: none
History: Tue Feb 19 11:11:29 1991, DSJ, Created.

Definition at line 1181 of file intproto.cpp.

1185  {
1186  int X, Y, Angle;
1187  uinT32 OldWord;
1188 
1189  X = FillSpec->X;
1190  if (X < 0)
1191  X = 0;
1192  if (X >= NUM_CP_BUCKETS)
1193  X = NUM_CP_BUCKETS - 1;
1194 
1195  if (FillSpec->YStart < 0)
1196  FillSpec->YStart = 0;
1197  if (FillSpec->YEnd >= NUM_CP_BUCKETS)
1198  FillSpec->YEnd = NUM_CP_BUCKETS - 1;
1199 
1200  for (Y = FillSpec->YStart; Y <= FillSpec->YEnd; Y++)
1201  for (Angle = FillSpec->AngleStart;
1203  OldWord = Pruner->p[X][Y][Angle][WordIndex];
1204  if (ClassCount > (OldWord & ClassMask)) {
1205  OldWord &= ~ClassMask;
1206  OldWord |= ClassCount;
1207  Pruner->p[X][Y][Angle][WordIndex] = OldWord;
1208  }
1209  if (Angle == FillSpec->AngleEnd)
1210  break;
1211  }
1212 } /* DoFill */
#define CircularIncrement(i, r)
Definition: intproto.cpp:120
#define TRUE
Definition: capi.h:45
inT8 YEnd
Definition: intproto.cpp:103
inT8 YStart
Definition: intproto.cpp:103
uinT8 AngleStart
Definition: intproto.cpp:104
uinT32 p[NUM_CP_BUCKETS][NUM_CP_BUCKETS][NUM_CP_BUCKETS][WERDS_PER_CP_VECTOR]
Definition: intproto.h:77
#define NUM_CP_BUCKETS
Definition: intproto.h:52
uint32_t uinT32
Definition: host.h:39
uinT8 AngleEnd
Definition: intproto.cpp:104

◆ FillerDone()

BOOL8 FillerDone ( TABLE_FILLER Filler)

Return TRUE if the specified table filler is done, i.e. if it has no more lines to fill.

Parameters
Fillertable filler to check if done
Returns
TRUE if no more lines to fill, FALSE otherwise.
Note
Globals: none
Exceptions: none
History: Tue Feb 19 10:08:05 1991, DSJ, Created.

Definition at line 1223 of file intproto.cpp.

1223  {
1224  FILL_SWITCH *Next;
1225 
1226  Next = &(Filler->Switch[Filler->NextSwitch]);
1227 
1228  if (Filler->X > Next->X && Next->Type == LastSwitch)
1229  return (TRUE);
1230  else
1231  return (FALSE);
1232 
1233 } /* FillerDone */
#define TRUE
Definition: capi.h:45
uinT8 NextSwitch
Definition: intproto.cpp:89
FILL_SWITCH Switch[MAX_NUM_SWITCHES]
Definition: intproto.cpp:94
#define FALSE
Definition: capi.h:46
SWITCH_TYPE Type
Definition: intproto.cpp:78

◆ FillPPCircularBits()

void FillPPCircularBits ( uinT32  ParamTable[NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR],
int  Bit,
FLOAT32  Center,
FLOAT32  Spread,
bool  debug 
)

This routine sets Bit in each bit vector whose bucket lies within the range Center +- Spread. The fill is done for a circular dimension, i.e. bucket 0 is adjacent to the last bucket. It is assumed that Center and Spread are expressed in a circular coordinate system whose range is 0 to 1.

Parameters
ParamTabletable of bit vectors, one per param bucket
Bitbit position in vectors to be filled
Centercenter of filled area
Spreadspread of filled area
debugdebug flag
Returns
none
Note
Globals: none
Exceptions: none
History: Tue Oct 16 09:26:54 1990, DSJ, Created.

Definition at line 1252 of file intproto.cpp.

1253  {
1254  int i, FirstBucket, LastBucket;
1255 
1256  if (Spread > 0.5)
1257  Spread = 0.5;
1258 
1259  FirstBucket = (int) floor ((Center - Spread) * NUM_PP_BUCKETS);
1260  if (FirstBucket < 0)
1261  FirstBucket += NUM_PP_BUCKETS;
1262 
1263  LastBucket = (int) floor ((Center + Spread) * NUM_PP_BUCKETS);
1264  if (LastBucket >= NUM_PP_BUCKETS)
1265  LastBucket -= NUM_PP_BUCKETS;
1266  if (debug) tprintf("Circular fill from %d to %d", FirstBucket, LastBucket);
1267  for (i = FirstBucket; TRUE; CircularIncrement (i, NUM_PP_BUCKETS)) {
1268  SET_BIT (ParamTable[i], Bit);
1269 
1270  /* exit loop after we have set the bit for the last bucket */
1271  if (i == LastBucket)
1272  break;
1273  }
1274 
1275 } /* FillPPCircularBits */
#define CircularIncrement(i, r)
Definition: intproto.cpp:120
#define TRUE
Definition: capi.h:45
#define tprintf(...)
Definition: tprintf.h:31
#define NUM_PP_BUCKETS
Definition: intproto.h:51
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
#define SET_BIT(array, bit)
Definition: bitvec.h:57

◆ FillPPLinearBits()

void FillPPLinearBits ( uinT32  ParamTable[NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR],
int  Bit,
FLOAT32  Center,
FLOAT32  Spread,
bool  debug 
)

This routine sets Bit in each bit vector whose bucket lies within the range Center +- Spread. The fill is done for a linear dimension, i.e. there is no wrap-around for this dimension. It is assumed that Center and Spread are expressed in a linear coordinate system whose range is approximately 0 to 1. Values outside this range will be clipped.

Parameters
ParamTabletable of bit vectors, one per param bucket
Bitbit number being filled
Centercenter of filled area
Spreadspread of filled area
debugdebug flag
Returns
none
Note
Globals: none
Exceptions: none
History: Tue Oct 16 09:26:54 1990, DSJ, Created.

Definition at line 1295 of file intproto.cpp.

1296  {
1297  int i, FirstBucket, LastBucket;
1298 
1299  FirstBucket = (int) floor ((Center - Spread) * NUM_PP_BUCKETS);
1300  if (FirstBucket < 0)
1301  FirstBucket = 0;
1302 
1303  LastBucket = (int) floor ((Center + Spread) * NUM_PP_BUCKETS);
1304  if (LastBucket >= NUM_PP_BUCKETS)
1305  LastBucket = NUM_PP_BUCKETS - 1;
1306 
1307  if (debug) tprintf("Linear fill from %d to %d", FirstBucket, LastBucket);
1308  for (i = FirstBucket; i <= LastBucket; i++)
1309  SET_BIT (ParamTable[i], Bit);
1310 
1311 } /* FillPPLinearBits */
#define tprintf(...)
Definition: tprintf.h:31
#define NUM_PP_BUCKETS
Definition: intproto.h:51
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
#define SET_BIT(array, bit)
Definition: bitvec.h:57

◆ free_int_class()

void free_int_class ( INT_CLASS  int_class)

Definition at line 703 of file intproto.cpp.

703  {
704  int i;
705 
706  for (i = 0; i < int_class->NumProtoSets; i++) {
707  Efree (int_class->ProtoSets[i]);
708  }
709  if (int_class->ProtoLengths != NULL) {
710  Efree (int_class->ProtoLengths);
711  }
712  Efree(int_class);
713 }
PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS]
Definition: intproto.h:111
uinT8 NumProtoSets
Definition: intproto.h:109
uinT8 * ProtoLengths
Definition: intproto.h:112
void Efree(void *ptr)
Definition: emalloc.cpp:79

◆ free_int_templates()

void free_int_templates ( INT_TEMPLATES  templates)

Definition at line 739 of file intproto.cpp.

739  {
740  int i;
741 
742  for (i = 0; i < templates->NumClasses; i++)
743  free_int_class(templates->Class[i]);
744  for (i = 0; i < templates->NumClassPruners; i++)
745  delete templates->ClassPruners[i];
746  Efree(templates);
747 }
CLASS_PRUNER_STRUCT * ClassPruners[MAX_NUM_CLASS_PRUNERS]
Definition: intproto.h:125
void free_int_class(INT_CLASS int_class)
Definition: intproto.cpp:703
INT_CLASS Class[MAX_NUM_CLASSES]
Definition: intproto.h:124
void Efree(void *ptr)
Definition: emalloc.cpp:79

◆ GetCPPadsForLevel()

void GetCPPadsForLevel ( int  Level,
FLOAT32 EndPad,
FLOAT32 SidePad,
FLOAT32 AnglePad 
)

This routine copies the appropriate global pad variables into EndPad, SidePad, and AnglePad. This is a kludge used to get around the fact that global control variables cannot be arrays. If the specified level is illegal, the tightest possible pads are returned.

Parameters
Level"tightness" level to return pads for
EndPadplace to put end pad for Level
SidePadplace to put side pad for Level
AnglePadplace to put angle pad for Level
Returns
none (results are returned in EndPad, SidePad, and AnglePad.
Note
Globals: none
Exceptions: none
History: Thu Feb 14 08:26:49 1991, DSJ, Created.

Definition at line 1409 of file intproto.cpp.

1412  {
1413  switch (Level) {
1414  case 0:
1417  *AnglePad = classify_cp_angle_pad_loose / 360.0;
1418  break;
1419 
1420  case 1:
1423  *AnglePad = classify_cp_angle_pad_medium / 360.0;
1424  break;
1425 
1426  case 2:
1429  *AnglePad = classify_cp_angle_pad_tight / 360.0;
1430  break;
1431 
1432  default:
1435  *AnglePad = classify_cp_angle_pad_tight / 360.0;
1436  break;
1437  }
1438  if (*AnglePad > 0.5)
1439  *AnglePad = 0.5;
1440 
1441 } /* GetCPPadsForLevel */
double classify_cp_angle_pad_loose
Definition: intproto.cpp:190
double classify_cp_angle_pad_tight
Definition: intproto.cpp:194
double classify_cp_side_pad_loose
Definition: intproto.cpp:198
double classify_cp_end_pad_medium
Definition: intproto.cpp:196
double classify_cp_side_pad_medium
Definition: intproto.cpp:199
double classify_cp_end_pad_tight
Definition: intproto.cpp:197
#define GetPicoFeatureLength()
Definition: picofeat.h:59
double classify_cp_angle_pad_medium
Definition: intproto.cpp:192
double classify_cp_side_pad_tight
Definition: intproto.cpp:200
double classify_cp_end_pad_loose
Definition: intproto.cpp:195

◆ GetMatchColorFor()

ScrollView::Color GetMatchColorFor ( FLOAT32  Evidence)
Parameters
Evidenceevidence value to return color for
Returns
Color which corresponds to specified Evidence value.
Note
Globals: none
Exceptions: none
History: Thu Mar 21 15:24:52 1991, DSJ, Created.

Definition at line 1450 of file intproto.cpp.

1450  {
1451  assert (Evidence >= 0.0);
1452  assert (Evidence <= 1.0);
1453 
1454  if (Evidence >= 0.90)
1455  return ScrollView::WHITE;
1456  else if (Evidence >= 0.75)
1457  return ScrollView::GREEN;
1458  else if (Evidence >= 0.50)
1459  return ScrollView::RED;
1460  else
1461  return ScrollView::BLUE;
1462 } /* GetMatchColorFor */

◆ GetNextFill()

void GetNextFill ( TABLE_FILLER Filler,
FILL_SPEC Fill 
)

This routine returns (in Fill) the specification of the next line to be filled from Filler. FillerDone() should always be called before GetNextFill() to ensure that we do not run past the end of the fill table.

Parameters
Fillerfiller to get next fill spec from
Fillplace to put spec for next fill
Returns
none (results are returned in Fill)
Note
Globals: none
Exceptions: none
History: Tue Feb 19 10:17:42 1991, DSJ, Created.

Definition at line 1476 of file intproto.cpp.

1476  {
1477  FILL_SWITCH *Next;
1478 
1479  /* compute the fill assuming no switches will be encountered */
1480  Fill->AngleStart = Filler->AngleStart;
1481  Fill->AngleEnd = Filler->AngleEnd;
1482  Fill->X = Filler->X;
1483  Fill->YStart = Filler->YStart >> 8;
1484  Fill->YEnd = Filler->YEnd >> 8;
1485 
1486  /* update the fill info and the filler for ALL switches at this X value */
1487  Next = &(Filler->Switch[Filler->NextSwitch]);
1488  while (Filler->X >= Next->X) {
1489  Fill->X = Filler->X = Next->X;
1490  if (Next->Type == StartSwitch) {
1491  Fill->YStart = Next->Y;
1492  Filler->StartDelta = Next->Delta;
1493  Filler->YStart = Next->YInit;
1494  }
1495  else if (Next->Type == EndSwitch) {
1496  Fill->YEnd = Next->Y;
1497  Filler->EndDelta = Next->Delta;
1498  Filler->YEnd = Next->YInit;
1499  }
1500  else { /* Type must be LastSwitch */
1501  break;
1502  }
1503  Filler->NextSwitch++;
1504  Next = &(Filler->Switch[Filler->NextSwitch]);
1505  }
1506 
1507  /* prepare the filler for the next call to this routine */
1508  Filler->X++;
1509  Filler->YStart += Filler->StartDelta;
1510  Filler->YEnd += Filler->EndDelta;
1511 
1512 } /* GetNextFill */
inT16 YInit
Definition: intproto.cpp:80
inT8 YEnd
Definition: intproto.cpp:103
inT8 YStart
Definition: intproto.cpp:103
inT16 YStart
Definition: intproto.cpp:92
inT16 EndDelta
Definition: intproto.cpp:93
uinT8 AngleStart
Definition: intproto.cpp:104
inT16 YEnd
Definition: intproto.cpp:92
inT16 StartDelta
Definition: intproto.cpp:93
uinT8 AngleStart
Definition: intproto.cpp:90
uinT8 NextSwitch
Definition: intproto.cpp:89
FILL_SWITCH Switch[MAX_NUM_SWITCHES]
Definition: intproto.cpp:94
SWITCH_TYPE Type
Definition: intproto.cpp:78
uinT8 AngleEnd
Definition: intproto.cpp:104
inT16 Delta
Definition: intproto.cpp:81
uinT8 AngleEnd
Definition: intproto.cpp:90

◆ InitFeatureDisplayWindowIfReqd()

void InitFeatureDisplayWindowIfReqd ( )

Initializes the feature display window if it is not already initialized.

Definition at line 1849 of file intproto.cpp.

1849  {
1850  if (FeatureDisplayWindow == NULL) {
1851  FeatureDisplayWindow = CreateFeatureSpaceWindow("FeatureDisplayWindow",
1852  50, 700);
1853  }
1854 }
ScrollView * CreateFeatureSpaceWindow(const char *name, int xpos, int ypos)
Definition: intproto.cpp:1858
ScrollView * FeatureDisplayWindow
Definition: intproto.cpp:180

◆ InitIntMatchWindowIfReqd()

void InitIntMatchWindowIfReqd ( )

Initializes the int matcher window if it is not already initialized.

Definition at line 1817 of file intproto.cpp.

1817  {
1818  if (IntMatchWindow == NULL) {
1819  IntMatchWindow = CreateFeatureSpaceWindow("IntMatchWindow", 50, 200);
1820  SVMenuNode* popup_menu = new SVMenuNode();
1821 
1822  popup_menu->AddChild("Debug Adapted classes", IDA_ADAPTIVE,
1823  "x", "Class to debug");
1824  popup_menu->AddChild("Debug Static classes", IDA_STATIC,
1825  "x", "Class to debug");
1826  popup_menu->AddChild("Debug Both", IDA_BOTH,
1827  "x", "Class to debug");
1828  popup_menu->AddChild("Debug Shape Index", IDA_SHAPE_INDEX,
1829  "0", "Index to debug");
1830  popup_menu->BuildMenu(IntMatchWindow, false);
1831  }
1832 }
ScrollView * CreateFeatureSpaceWindow(const char *name, int xpos, int ypos)
Definition: intproto.cpp:1858
ScrollView * IntMatchWindow
Definition: intproto.cpp:179
SVMenuNode * AddChild(const char *txt)
Definition: svmnode.cpp:59
void BuildMenu(ScrollView *sv, bool menu_bar=true)
Definition: svmnode.cpp:121

◆ InitProtoDisplayWindowIfReqd()

void InitProtoDisplayWindowIfReqd ( )

Initializes the proto display window if it is not already initialized.

Definition at line 1838 of file intproto.cpp.

1838  {
1839  if (ProtoDisplayWindow == NULL) {
1840  ProtoDisplayWindow = CreateFeatureSpaceWindow("ProtoDisplayWindow",
1841  550, 200);
1842  }
1843 }
ScrollView * CreateFeatureSpaceWindow(const char *name, int xpos, int ypos)
Definition: intproto.cpp:1858
ScrollView * ProtoDisplayWindow
Definition: intproto.cpp:181

◆ InitTableFiller()

void InitTableFiller ( FLOAT32  EndPad,
FLOAT32  SidePad,
FLOAT32  AnglePad,
PROTO  Proto,
TABLE_FILLER Filler 
)

This routine computes a data structure (Filler) which can be used to fill in a rectangle surrounding the specified Proto.

Parameters
EndPad,SidePad,AnglePadpadding to add to proto
Protoproto to create a filler for
Fillerplace to put table filler
Returns
none (results are returned in Filler)
Note
Globals: none
Exceptions: none
History: Thu Feb 14 09:27:05 1991, DSJ, Created.

Definition at line 1528 of file intproto.cpp.

1534 {
1535  FLOAT32 Angle;
1536  FLOAT32 X, Y, HalfLength;
1537  FLOAT32 Cos, Sin;
1538  FLOAT32 XAdjust, YAdjust;
1539  FPOINT Start, Switch1, Switch2, End;
1540  int S1 = 0;
1541  int S2 = 1;
1542 
1543  Angle = Proto->Angle;
1544  X = Proto->X;
1545  Y = Proto->Y;
1546  HalfLength = Proto->Length / 2.0;
1547 
1548  Filler->AngleStart = CircBucketFor(Angle - AnglePad, AS, NB);
1549  Filler->AngleEnd = CircBucketFor(Angle + AnglePad, AS, NB);
1550  Filler->NextSwitch = 0;
1551 
1552  if (fabs (Angle - 0.0) < HV_TOLERANCE || fabs (Angle - 0.5) < HV_TOLERANCE) {
1553  /* horizontal proto - handle as special case */
1554  Filler->X = Bucket8For(X - HalfLength - EndPad, XS, NB);
1555  Filler->YStart = Bucket16For(Y - SidePad, YS, NB * 256);
1556  Filler->YEnd = Bucket16For(Y + SidePad, YS, NB * 256);
1557  Filler->StartDelta = 0;
1558  Filler->EndDelta = 0;
1559  Filler->Switch[0].Type = LastSwitch;
1560  Filler->Switch[0].X = Bucket8For(X + HalfLength + EndPad, XS, NB);
1561  } else if (fabs(Angle - 0.25) < HV_TOLERANCE ||
1562  fabs(Angle - 0.75) < HV_TOLERANCE) {
1563  /* vertical proto - handle as special case */
1564  Filler->X = Bucket8For(X - SidePad, XS, NB);
1565  Filler->YStart = Bucket16For(Y - HalfLength - EndPad, YS, NB * 256);
1566  Filler->YEnd = Bucket16For(Y + HalfLength + EndPad, YS, NB * 256);
1567  Filler->StartDelta = 0;
1568  Filler->EndDelta = 0;
1569  Filler->Switch[0].Type = LastSwitch;
1570  Filler->Switch[0].X = Bucket8For(X + SidePad, XS, NB);
1571  } else {
1572  /* diagonal proto */
1573 
1574  if ((Angle > 0.0 && Angle < 0.25) || (Angle > 0.5 && Angle < 0.75)) {
1575  /* rising diagonal proto */
1576  Angle *= 2.0 * PI;
1577  Cos = fabs(cos(Angle));
1578  Sin = fabs(sin(Angle));
1579 
1580  /* compute the positions of the corners of the acceptance region */
1581  Start.x = X - (HalfLength + EndPad) * Cos - SidePad * Sin;
1582  Start.y = Y - (HalfLength + EndPad) * Sin + SidePad * Cos;
1583  End.x = 2.0 * X - Start.x;
1584  End.y = 2.0 * Y - Start.y;
1585  Switch1.x = X - (HalfLength + EndPad) * Cos + SidePad * Sin;
1586  Switch1.y = Y - (HalfLength + EndPad) * Sin - SidePad * Cos;
1587  Switch2.x = 2.0 * X - Switch1.x;
1588  Switch2.y = 2.0 * Y - Switch1.y;
1589 
1590  if (Switch1.x > Switch2.x) {
1591  S1 = 1;
1592  S2 = 0;
1593  }
1594 
1595  /* translate into bucket positions and deltas */
1596  Filler->X = Bucket8For(Start.x, XS, NB);
1597  Filler->StartDelta = -(inT16) ((Cos / Sin) * 256);
1598  Filler->EndDelta = (inT16) ((Sin / Cos) * 256);
1599 
1600  XAdjust = BucketEnd(Filler->X, XS, NB) - Start.x;
1601  YAdjust = XAdjust * Cos / Sin;
1602  Filler->YStart = Bucket16For(Start.y - YAdjust, YS, NB * 256);
1603  YAdjust = XAdjust * Sin / Cos;
1604  Filler->YEnd = Bucket16For(Start.y + YAdjust, YS, NB * 256);
1605 
1606  Filler->Switch[S1].Type = StartSwitch;
1607  Filler->Switch[S1].X = Bucket8For(Switch1.x, XS, NB);
1608  Filler->Switch[S1].Y = Bucket8For(Switch1.y, YS, NB);
1609  XAdjust = Switch1.x - BucketStart(Filler->Switch[S1].X, XS, NB);
1610  YAdjust = XAdjust * Sin / Cos;
1611  Filler->Switch[S1].YInit = Bucket16For(Switch1.y - YAdjust, YS, NB * 256);
1612  Filler->Switch[S1].Delta = Filler->EndDelta;
1613 
1614  Filler->Switch[S2].Type = EndSwitch;
1615  Filler->Switch[S2].X = Bucket8For(Switch2.x, XS, NB);
1616  Filler->Switch[S2].Y = Bucket8For(Switch2.y, YS, NB);
1617  XAdjust = Switch2.x - BucketStart(Filler->Switch[S2].X, XS, NB);
1618  YAdjust = XAdjust * Cos / Sin;
1619  Filler->Switch[S2].YInit = Bucket16For(Switch2.y + YAdjust, YS, NB * 256);
1620  Filler->Switch[S2].Delta = Filler->StartDelta;
1621 
1622  Filler->Switch[2].Type = LastSwitch;
1623  Filler->Switch[2].X = Bucket8For(End.x, XS, NB);
1624  } else {
1625  /* falling diagonal proto */
1626  Angle *= 2.0 * PI;
1627  Cos = fabs(cos(Angle));
1628  Sin = fabs(sin(Angle));
1629 
1630  /* compute the positions of the corners of the acceptance region */
1631  Start.x = X - (HalfLength + EndPad) * Cos - SidePad * Sin;
1632  Start.y = Y + (HalfLength + EndPad) * Sin - SidePad * Cos;
1633  End.x = 2.0 * X - Start.x;
1634  End.y = 2.0 * Y - Start.y;
1635  Switch1.x = X - (HalfLength + EndPad) * Cos + SidePad * Sin;
1636  Switch1.y = Y + (HalfLength + EndPad) * Sin + SidePad * Cos;
1637  Switch2.x = 2.0 * X - Switch1.x;
1638  Switch2.y = 2.0 * Y - Switch1.y;
1639 
1640  if (Switch1.x > Switch2.x) {
1641  S1 = 1;
1642  S2 = 0;
1643  }
1644 
1645  /* translate into bucket positions and deltas */
1646  Filler->X = Bucket8For(Start.x, XS, NB);
1647  Filler->StartDelta = static_cast<inT16>(ClipToRange<int>(
1648  -IntCastRounded((Sin / Cos) * 256), MIN_INT16, MAX_INT16));
1649  Filler->EndDelta = static_cast<inT16>(ClipToRange<int>(
1650  IntCastRounded((Cos / Sin) * 256), MIN_INT16, MAX_INT16));
1651 
1652  XAdjust = BucketEnd(Filler->X, XS, NB) - Start.x;
1653  YAdjust = XAdjust * Sin / Cos;
1654  Filler->YStart = Bucket16For(Start.y - YAdjust, YS, NB * 256);
1655  YAdjust = XAdjust * Cos / Sin;
1656  Filler->YEnd = Bucket16For(Start.y + YAdjust, YS, NB * 256);
1657 
1658  Filler->Switch[S1].Type = EndSwitch;
1659  Filler->Switch[S1].X = Bucket8For(Switch1.x, XS, NB);
1660  Filler->Switch[S1].Y = Bucket8For(Switch1.y, YS, NB);
1661  XAdjust = Switch1.x - BucketStart(Filler->Switch[S1].X, XS, NB);
1662  YAdjust = XAdjust * Sin / Cos;
1663  Filler->Switch[S1].YInit = Bucket16For(Switch1.y + YAdjust, YS, NB * 256);
1664  Filler->Switch[S1].Delta = Filler->StartDelta;
1665 
1666  Filler->Switch[S2].Type = StartSwitch;
1667  Filler->Switch[S2].X = Bucket8For(Switch2.x, XS, NB);
1668  Filler->Switch[S2].Y = Bucket8For(Switch2.y, YS, NB);
1669  XAdjust = Switch2.x - BucketStart(Filler->Switch[S2].X, XS, NB);
1670  YAdjust = XAdjust * Cos / Sin;
1671  Filler->Switch[S2].YInit = Bucket16For(Switch2.y - YAdjust, YS, NB * 256);
1672  Filler->Switch[S2].Delta = Filler->EndDelta;
1673 
1674  Filler->Switch[2].Type = LastSwitch;
1675  Filler->Switch[2].X = Bucket8For(End.x, XS, NB);
1676  }
1677  }
1678 } /* InitTableFiller */
uinT8 Bucket8For(FLOAT32 param, FLOAT32 offset, int num_buckets)
Definition: intproto.cpp:435
Definition: fpoint.h:29
inT16 YInit
Definition: intproto.cpp:80
#define YS
inT16 YStart
Definition: intproto.cpp:92
#define MAX_INT16
Definition: host.h:61
inT16 EndDelta
Definition: intproto.cpp:93
#define HV_TOLERANCE
Definition: intproto.cpp:69
int IntCastRounded(double x)
Definition: helpers.h:179
int16_t inT16
Definition: host.h:36
inT16 YEnd
Definition: intproto.cpp:92
inT16 StartDelta
Definition: intproto.cpp:93
#define AS
uinT16 Bucket16For(FLOAT32 param, FLOAT32 offset, int num_buckets)
Definition: intproto.cpp:439
uinT8 AngleStart
Definition: intproto.cpp:90
uinT8 NextSwitch
Definition: intproto.cpp:89
FLOAT32 Length
Definition: protos.h:50
FILL_SWITCH Switch[MAX_NUM_SWITCHES]
Definition: intproto.cpp:94
#define PI
Definition: const.h:19
#define XS
FLOAT32 BucketEnd(int Bucket, FLOAT32 Offset, int NumBuckets)
Definition: intproto.cpp:1163
FLOAT32 Y
Definition: protos.h:48
FLOAT32 X
Definition: protos.h:47
FLOAT32 y
Definition: fpoint.h:31
uinT8 CircBucketFor(FLOAT32 param, FLOAT32 offset, int num_buckets)
Definition: intproto.cpp:449
float FLOAT32
Definition: host.h:42
FLOAT32 Angle
Definition: protos.h:49
#define MIN_INT16
Definition: host.h:69
FLOAT32 x
Definition: fpoint.h:31
SWITCH_TYPE Type
Definition: intproto.cpp:78
#define NB
inT16 Delta
Definition: intproto.cpp:81
FLOAT32 BucketStart(int Bucket, FLOAT32 Offset, int NumBuckets)
Definition: intproto.cpp:1145
uinT8 AngleEnd
Definition: intproto.cpp:90

◆ NewIntClass()

INT_CLASS NewIntClass ( int  MaxNumProtos,
int  MaxNumConfigs 
)

This routine creates a new integer class data structure and returns it. Sufficient space is allocated to handle the specified number of protos and configs.

Parameters
MaxNumProtosnumber of protos to allocate space for
MaxNumConfigsnumber of configs to allocate space for
Returns
New class created.
Note
Globals: none
Exceptions: none
History: Fri Feb 8 10:51:23 1991, DSJ, Created.

Definition at line 664 of file intproto.cpp.

664  {
665  INT_CLASS Class;
666  PROTO_SET ProtoSet;
667  int i;
668 
669  assert(MaxNumConfigs <= MAX_NUM_CONFIGS);
670 
671  Class = (INT_CLASS) Emalloc(sizeof(INT_CLASS_STRUCT));
672  Class->NumProtoSets = ((MaxNumProtos + PROTOS_PER_PROTO_SET - 1) /
674 
675  assert(Class->NumProtoSets <= MAX_NUM_PROTO_SETS);
676 
677  Class->NumProtos = 0;
678  Class->NumConfigs = 0;
679 
680  for (i = 0; i < Class->NumProtoSets; i++) {
681  /* allocate space for a proto set, install in class, and initialize */
682  ProtoSet = (PROTO_SET) Emalloc(sizeof(PROTO_SET_STRUCT));
683  memset(ProtoSet, 0, sizeof(*ProtoSet));
684  Class->ProtoSets[i] = ProtoSet;
685 
686  /* allocate space for the proto lengths and install in class */
687  }
688  if (MaxNumIntProtosIn (Class) > 0) {
689  Class->ProtoLengths =
690  (uinT8 *)Emalloc(MaxNumIntProtosIn (Class) * sizeof (uinT8));
691  memset(Class->ProtoLengths, 0,
692  MaxNumIntProtosIn(Class) * sizeof(*Class->ProtoLengths));
693  } else {
694  Class->ProtoLengths = NULL;
695  }
696  memset(Class->ConfigLengths, 0, sizeof(Class->ConfigLengths));
697 
698  return (Class);
699 
700 } /* NewIntClass */
PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS]
Definition: intproto.h:111
uinT8 NumProtoSets
Definition: intproto.h:109
uinT8 NumConfigs
Definition: intproto.h:110
struct PROTO_SET_STRUCT * PROTO_SET
void * Emalloc(int Size)
Definition: emalloc.cpp:47
uinT16 NumProtos
Definition: intproto.h:108
uinT8 * ProtoLengths
Definition: intproto.h:112
uinT16 ConfigLengths[MAX_NUM_CONFIGS]
Definition: intproto.h:113
#define MAX_NUM_PROTO_SETS
Definition: intproto.h:49
struct INT_CLASS_STRUCT * INT_CLASS
#define PROTOS_PER_PROTO_SET
Definition: intproto.h:48
uint8_t uinT8
Definition: host.h:35
#define MAX_NUM_CONFIGS
Definition: intproto.h:46
#define MaxNumIntProtosIn(C)
Definition: intproto.h:168

◆ NewIntTemplates()

INT_TEMPLATES NewIntTemplates ( )

This routine allocates a new set of integer templates initialized to hold 0 classes.

Returns
The integer templates created.
Note
Globals: none
Exceptions: none
History: Fri Feb 8 08:38:51 1991, DSJ, Created.

Definition at line 723 of file intproto.cpp.

723  {
724  INT_TEMPLATES T;
725  int i;
726 
727  T = (INT_TEMPLATES) Emalloc (sizeof (INT_TEMPLATES_STRUCT));
728  T->NumClasses = 0;
729  T->NumClassPruners = 0;
730 
731  for (i = 0; i < MAX_NUM_CLASSES; i++)
732  ClassForClassId (T, i) = NULL;
733 
734  return (T);
735 } /* NewIntTemplates */
void * Emalloc(int Size)
Definition: emalloc.cpp:47
#define ClassForClassId(T, c)
Definition: intproto.h:181
struct INT_TEMPLATES_STRUCT * INT_TEMPLATES
#define MAX_NUM_CLASSES
Definition: matchdefs.h:31

◆ RenderIntFeature()

void RenderIntFeature ( ScrollView window,
const INT_FEATURE_STRUCT Feature,
ScrollView::Color  color 
)

This routine renders the specified feature into ShapeList.

Parameters
windowto add feature rendering to
Featurefeature to be rendered
colorcolor to use for feature rendering
Returns
New shape list with rendering of Feature added.
Note
Globals: none
Exceptions: none
History: Thu Mar 21 14:57:41 1991, DSJ, Created.

Definition at line 1693 of file intproto.cpp.

1694  {
1695  FLOAT32 X, Y, Dx, Dy, Length;
1696 
1697  window->Pen(color);
1698  assert(Feature != NULL);
1699  assert(color != 0);
1700 
1701  X = Feature->X;
1702  Y = Feature->Y;
1703  Length = GetPicoFeatureLength() * 0.7 * INT_CHAR_NORM_RANGE;
1704  // The -PI has no significant effect here, but the value of Theta is computed
1705  // using BinaryAnglePlusPi in intfx.cpp.
1706  Dx = (Length / 2.0) * cos((Feature->Theta / 256.0) * 2.0 * PI - PI);
1707  Dy = (Length / 2.0) * sin((Feature->Theta / 256.0) * 2.0 * PI - PI);
1708 
1709  window->SetCursor(X, Y);
1710  window->DrawTo(X + Dx, Y + Dy);
1711 } /* RenderIntFeature */
void SetCursor(int x, int y)
Definition: scrollview.cpp:525
#define PI
Definition: const.h:19
#define INT_CHAR_NORM_RANGE
Definition: intproto.h:133
float FLOAT32
Definition: host.h:42
#define GetPicoFeatureLength()
Definition: picofeat.h:59
void Pen(Color color)
Definition: scrollview.cpp:726
void DrawTo(int x, int y)
Definition: scrollview.cpp:531

◆ RenderIntProto()

void RenderIntProto ( ScrollView window,
INT_CLASS  Class,
PROTO_ID  ProtoId,
ScrollView::Color  color 
)

This routine extracts the parameters of the specified proto from the class description and adds a rendering of the proto onto the ShapeList.

Parameters
windowScrollView instance
Classclass that proto is contained in
ProtoIdid of proto to be rendered
colorcolor to render proto in

Globals: none

Returns
New shape list with a rendering of one proto added.
Note
Exceptions: none
History: Thu Mar 21 10:21:09 1991, DSJ, Created.

Definition at line 1729 of file intproto.cpp.

1732  {
1733  PROTO_SET ProtoSet;
1734  INT_PROTO Proto;
1735  int ProtoSetIndex;
1736  int ProtoWordIndex;
1737  FLOAT32 Length;
1738  int Xmin, Xmax, Ymin, Ymax;
1739  FLOAT32 X, Y, Dx, Dy;
1740  uinT32 ProtoMask;
1741  int Bucket;
1742 
1743  assert(ProtoId >= 0);
1744  assert(Class != NULL);
1745  assert(ProtoId < Class->NumProtos);
1746  assert(color != 0);
1747  window->Pen(color);
1748 
1749  ProtoSet = Class->ProtoSets[SetForProto(ProtoId)];
1750  ProtoSetIndex = IndexForProto(ProtoId);
1751  Proto = &(ProtoSet->Protos[ProtoSetIndex]);
1752  Length = (Class->ProtoLengths[ProtoId] *
1754  ProtoMask = PPrunerMaskFor(ProtoId);
1755  ProtoWordIndex = PPrunerWordIndexFor(ProtoId);
1756 
1757  // find the x and y extent of the proto from the proto pruning table
1758  Xmin = Ymin = NUM_PP_BUCKETS;
1759  Xmax = Ymax = 0;
1760  for (Bucket = 0; Bucket < NUM_PP_BUCKETS; Bucket++) {
1761  if (ProtoMask & ProtoSet->ProtoPruner[PRUNER_X][Bucket][ProtoWordIndex]) {
1762  UpdateRange(Bucket, &Xmin, &Xmax);
1763  }
1764 
1765  if (ProtoMask & ProtoSet->ProtoPruner[PRUNER_Y][Bucket][ProtoWordIndex]) {
1766  UpdateRange(Bucket, &Ymin, &Ymax);
1767  }
1768  }
1769  X = (Xmin + Xmax + 1) / 2.0 * PROTO_PRUNER_SCALE;
1770  Y = (Ymin + Ymax + 1) / 2.0 * PROTO_PRUNER_SCALE;
1771  // The -PI has no significant effect here, but the value of Theta is computed
1772  // using BinaryAnglePlusPi in intfx.cpp.
1773  Dx = (Length / 2.0) * cos((Proto->Angle / 256.0) * 2.0 * PI - PI);
1774  Dy = (Length / 2.0) * sin((Proto->Angle / 256.0) * 2.0 * PI - PI);
1775 
1776  window->SetCursor(X - Dx, Y - Dy);
1777  window->DrawTo(X + Dx, Y + Dy);
1778 } /* RenderIntProto */
PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS]
Definition: intproto.h:111
INT_PROTO_STRUCT Protos[PROTOS_PER_PROTO_SET]
Definition: intproto.h:97
#define PPrunerWordIndexFor(I)
Definition: intproto.h:173
#define PRUNER_Y
Definition: intproto.h:35
uinT8 * ProtoLengths
Definition: intproto.h:112
void SetCursor(int x, int y)
Definition: scrollview.cpp:525
PROTO_PRUNER ProtoPruner
Definition: intproto.h:96
uint32_t uinT32
Definition: host.h:39
#define PI
Definition: const.h:19
#define INT_CHAR_NORM_RANGE
Definition: intproto.h:133
#define IndexForProto(P)
Definition: intproto.h:170
#define NUM_PP_BUCKETS
Definition: intproto.h:51
#define SetForProto(P)
Definition: intproto.h:169
#define PROTO_PRUNER_SCALE
Definition: intproto.cpp:52
float FLOAT32
Definition: host.h:42
#define PRUNER_X
Definition: intproto.h:34
#define GetPicoFeatureLength()
Definition: picofeat.h:59
void UpdateRange(const T1 &x, T2 *lower_bound, T2 *upper_bound)
Definition: helpers.h:132
void Pen(Color color)
Definition: scrollview.cpp:726
#define PPrunerMaskFor(I)
Definition: intproto.h:176
void DrawTo(int x, int y)
Definition: scrollview.cpp:531

◆ TruncateParam()

int TruncateParam ( FLOAT32  Param,
int  Min,
int  Max,
char *  Id 
)

This routine truncates Param to lie within the range of Min-Max inclusive. If a truncation is performed, and Id is not null, an warning message is printed.

Parameters
Paramparameter value to be truncated
Min,Maxparameter limits (inclusive)
Idstring id of parameter for error messages

Globals: none

Returns
Truncated parameter.
Note
Exceptions: none
History: Fri Feb 8 11:54:28 1991, DSJ, Created.

Definition at line 1796 of file intproto.cpp.

1796  {
1797  if (Param < Min) {
1798  if (Id)
1799  cprintf("Warning: Param %s truncated from %f to %d!\n",
1800  Id, Param, Min);
1801  Param = Min;
1802  } else if (Param > Max) {
1803  if (Id)
1804  cprintf("Warning: Param %s truncated from %f to %d!\n",
1805  Id, Param, Max);
1806  Param = Max;
1807  }
1808  return static_cast<int>(floor(Param));
1809 } /* TruncateParam */
void cprintf(const char *format,...)
Definition: callcpp.cpp:40

◆ UpdateMatchDisplay()

void UpdateMatchDisplay ( )

This routine clears the global feature and proto display lists.

Globals:

  • FeatureShapes display list for features
  • ProtoShapes display list for protos
    Returns
    none
    Note
    Exceptions: none
    History: Thu Mar 21 15:40:19 1991, DSJ, Created.

Definition at line 467 of file intproto.cpp.

467  {
468  if (IntMatchWindow != NULL)
470 } /* ClearMatchDisplay */
ScrollView * IntMatchWindow
Definition: intproto.cpp:179
static void Update()
Definition: scrollview.cpp:715

Variable Documentation

◆ classify_cp_angle_pad_loose

double classify_cp_angle_pad_loose = 45.0

"Class Pruner Angle Pad Loose"

Definition at line 190 of file intproto.cpp.

◆ classify_cp_angle_pad_medium

double classify_cp_angle_pad_medium = 20.0

"Class Pruner Angle Pad Medium"

Definition at line 192 of file intproto.cpp.

◆ classify_cp_angle_pad_tight

double classify_cp_angle_pad_tight = 10.0

"CLass Pruner Angle Pad Tight"

Definition at line 194 of file intproto.cpp.

◆ classify_cp_end_pad_loose

double classify_cp_end_pad_loose = 0.5

"Class Pruner End Pad Loose"

Definition at line 195 of file intproto.cpp.

◆ classify_cp_end_pad_medium

double classify_cp_end_pad_medium = 0.5

"Class Pruner End Pad Medium"

Definition at line 196 of file intproto.cpp.

◆ classify_cp_end_pad_tight

double classify_cp_end_pad_tight = 0.5

"Class Pruner End Pad Tight"

Definition at line 197 of file intproto.cpp.

◆ classify_cp_side_pad_loose

double classify_cp_side_pad_loose = 2.5

"Class Pruner Side Pad Loose"

Definition at line 198 of file intproto.cpp.

◆ classify_cp_side_pad_medium

double classify_cp_side_pad_medium = 1.2

"Class Pruner Side Pad Medium"

Definition at line 199 of file intproto.cpp.

◆ classify_cp_side_pad_tight

double classify_cp_side_pad_tight = 0.6

"Class Pruner Side Pad Tight"

Definition at line 200 of file intproto.cpp.

◆ classify_num_cp_levels

int classify_num_cp_levels = 3

"Number of Class Pruner Levels"

Definition at line 188 of file intproto.cpp.

◆ classify_pp_angle_pad

double classify_pp_angle_pad = 45.0

"Proto Pruner Angle Pad"

Definition at line 201 of file intproto.cpp.

◆ classify_pp_end_pad

double classify_pp_end_pad = 0.5

"Proto Prune End Pad"

Definition at line 202 of file intproto.cpp.

◆ classify_pp_side_pad

double classify_pp_side_pad = 2.5

"Proto Pruner Side Pad"

Definition at line 203 of file intproto.cpp.

◆ FeatureDisplayWindow

ScrollView* FeatureDisplayWindow = NULL

Definition at line 180 of file intproto.cpp.

◆ IntMatchWindow

ScrollView* IntMatchWindow = NULL

Definition at line 179 of file intproto.cpp.

◆ ProtoDisplayWindow

ScrollView* ProtoDisplayWindow = NULL

Definition at line 181 of file intproto.cpp.