tesseract  3.05.02
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 OLD_MAX_NUM_CONFIGS
Definition: intproto.cpp:112
#define BITS_PER_WERD
Definition: intproto.h:44

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 */
#define ClassForClassId(T, c)
Definition: intproto.h:181
#define MaxNumClassesIn(T)
Definition: intproto.h:178
#define LegalClassId(c)
Definition: intproto.h:179
CLASS_PRUNER_STRUCT * ClassPruners[MAX_NUM_CLASS_PRUNERS]
Definition: intproto.h:125

◆ 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 */
#define MAX_NUM_CONFIGS
Definition: intproto.h:46
uinT16 ConfigLengths[MAX_NUM_CONFIGS]
Definition: intproto.h:113
uinT8 NumConfigs
Definition: intproto.h:110

◆ 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 }
uinT16 NumProtos
Definition: intproto.h:108
#define ProtoForProtoId(C, P)
Definition: intproto.h:171
struct PROTO_SET_STRUCT * PROTO_SET
unsigned char uinT8
Definition: host.h:32
#define MaxNumIntProtosIn(C)
Definition: intproto.h:168
#define MAX_NUM_PROTOS
Definition: intproto.h:47
#define WERDS_PER_CONFIG_VEC
Definition: intproto.h:68
uinT8 NumProtoSets
Definition: intproto.h:109
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
PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS]
Definition: intproto.h:111
unsigned int uinT32
Definition: host.h:36
void * Emalloc(int Size)
Definition: emalloc.cpp:47
uinT8 * ProtoLengths
Definition: intproto.h:112

◆ 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 */
BOOL8 FillerDone(TABLE_FILLER *Filler)
Definition: intproto.cpp:1285
#define CPrunerFor(T, c)
Definition: intproto.h:184
void GetNextFill(TABLE_FILLER *Filler, FILL_SPEC *Fill)
Definition: intproto.cpp:1538
void InitTableFiller(FLOAT32 EndPad, FLOAT32 SidePad, FLOAT32 AnglePad, PROTO Proto, TABLE_FILLER *Filler)
Definition: intproto.cpp:1590
void DoFill(FILL_SPEC *FillSpec, CLASS_PRUNER_STRUCT *Pruner, register uinT32 ClassMask, register uinT32 ClassCount, register uinT32 WordIndex)
Definition: intproto.cpp:1243
#define CPrunerWordIndexFor(c)
Definition: intproto.h:185
#define CPrunerMaskFor(L, c)
Definition: intproto.h:187
float FLOAT32
Definition: host.h:44
void GetCPPadsForLevel(int Level, FLOAT32 *EndPad, FLOAT32 *SidePad, FLOAT32 *AnglePad)
Definition: intproto.cpp:1471
unsigned int uinT32
Definition: host.h:36
int classify_num_cp_levels
Definition: intproto.cpp:188
#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 */
double classify_pp_angle_pad
Definition: intproto.cpp:201
uinT16 NumProtos
Definition: intproto.h:108
void cprintf(const char *format,...)
Definition: callcpp.cpp:40
#define PRUNER_ANGLE
Definition: intproto.h:36
#define ANGLE_SHIFT
Definition: intproto.h:39
#define PI
Definition: const.h:19
#define SetForProto(P)
Definition: intproto.h:169
FLOAT32 Angle
Definition: protos.h:49
void FillPPCircularBits(uinT32 ParamTable[NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR], int Bit, FLOAT32 Center, FLOAT32 Spread, bool debug)
Definition: intproto.cpp:1314
FLOAT32 X
Definition: protos.h:47
FLOAT32 Length
Definition: protos.h:50
#define Y_SHIFT
Definition: intproto.h:41
#define PRUNER_X
Definition: intproto.h:34
#define PRUNER_Y
Definition: intproto.h:35
float FLOAT32
Definition: host.h:44
#define IndexForProto(P)
Definition: intproto.h:170
#define MAX(x, y)
Definition: ndminx.h:24
PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS]
Definition: intproto.h:111
double classify_pp_end_pad
Definition: intproto.cpp:202
FLOAT32 Y
Definition: protos.h:48
void FillPPLinearBits(uinT32 ParamTable[NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR], int Bit, FLOAT32 Center, FLOAT32 Spread, bool debug)
Definition: intproto.cpp:1357
double classify_pp_side_pad
Definition: intproto.cpp:203
#define X_SHIFT
Definition: intproto.h:40
PROTO_PRUNER ProtoPruner
Definition: intproto.h:96
#define GetPicoFeatureLength()
Definition: picofeat.h:59

◆ 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 }
int IntCastRounded(double x)
Definition: helpers.h:172
T ClipToRange(const T &x, const T &lower_bound, const T &upper_bound)
Definition: helpers.h:115
unsigned short uinT16
Definition: host.h:34
#define MapParam(P, O, N)
Definition: intproto.cpp:123

◆ 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 }
int IntCastRounded(double x)
Definition: helpers.h:172
T ClipToRange(const T &x, const T &lower_bound, const T &upper_bound)
Definition: helpers.h:115
unsigned char uinT8
Definition: host.h:32
#define MapParam(P, O, N)
Definition: intproto.cpp:123

◆ 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 1225 of file intproto.cpp.

1225  {
1226  return (((FLOAT32) (Bucket + 1) / NumBuckets) - Offset);
1227 } /* BucketEnd */
float FLOAT32
Definition: host.h:44

◆ 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 1207 of file intproto.cpp.

1207  {
1208  return (((FLOAT32) Bucket / NumBuckets) - Offset);
1209 
1210 } /* BucketStart */
float FLOAT32
Definition: host.h:44

◆ 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 */
int IntCastRounded(double x)
Definition: helpers.h:172
unsigned char uinT8
Definition: host.h:32
#define MapParam(P, O, N)
Definition: intproto.cpp:123
int Modulo(int a, int b)
Definition: helpers.h:157

◆ 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
#define ProtoForProtoId(C, P)
Definition: intproto.h:171
CLUSTERCONFIG Config
#define SET_BIT(array, bit)
Definition: bitvec.h:57
uinT32 Configs[WERDS_PER_CONFIG_VEC]
Definition: intproto.h:86
#define test_bit(array, bit)
Definition: bitvec.h:61
uinT16 ConfigLengths[MAX_NUM_CONFIGS]
Definition: intproto.h:113
uinT8 * ProtoLengths
Definition: intproto.h:112

◆ 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 1920 of file intproto.cpp.

1920  {
1921  return new ScrollView(name, xpos, ypos, 520, 520, 260, 260, true);
1922 }

◆ 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 * FeatureDisplayWindow
Definition: intproto.cpp:180
ScrollView::Color GetMatchColorFor(FLOAT32 Evidence)
Definition: intproto.cpp:1512
void RenderIntFeature(ScrollView *window, const INT_FEATURE_STRUCT *Feature, ScrollView::Color color)
Definition: intproto.cpp:1755
ScrollView * IntMatchWindow
Definition: intproto.cpp:179

◆ 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::Color GetMatchColorFor(FLOAT32 Evidence)
Definition: intproto.cpp:1512
void RenderIntProto(ScrollView *window, INT_CLASS Class, PROTO_ID ProtoId, ScrollView::Color color)
Definition: intproto.cpp:1791
ScrollView * ProtoDisplayWindow
Definition: intproto.cpp:181
ScrollView * IntMatchWindow
Definition: intproto.cpp:179

◆ 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 1243 of file intproto.cpp.

1247  {
1248  int X, Y, Angle;
1249  uinT32 OldWord;
1250 
1251  X = FillSpec->X;
1252  if (X < 0)
1253  X = 0;
1254  if (X >= NUM_CP_BUCKETS)
1255  X = NUM_CP_BUCKETS - 1;
1256 
1257  if (FillSpec->YStart < 0)
1258  FillSpec->YStart = 0;
1259  if (FillSpec->YEnd >= NUM_CP_BUCKETS)
1260  FillSpec->YEnd = NUM_CP_BUCKETS - 1;
1261 
1262  for (Y = FillSpec->YStart; Y <= FillSpec->YEnd; Y++)
1263  for (Angle = FillSpec->AngleStart;
1265  OldWord = Pruner->p[X][Y][Angle][WordIndex];
1266  if (ClassCount > (OldWord & ClassMask)) {
1267  OldWord &= ~ClassMask;
1268  OldWord |= ClassCount;
1269  Pruner->p[X][Y][Angle][WordIndex] = OldWord;
1270  }
1271  if (Angle == FillSpec->AngleEnd)
1272  break;
1273  }
1274 } /* DoFill */
#define TRUE
Definition: capi.h:45
inT8 YEnd
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 CircularIncrement(i, r)
Definition: intproto.cpp:120
inT8 YStart
Definition: intproto.cpp:103
unsigned int uinT32
Definition: host.h:36
uinT8 AngleEnd
Definition: intproto.cpp:104
#define NUM_CP_BUCKETS
Definition: intproto.h:52

◆ 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 1285 of file intproto.cpp.

1285  {
1286  FILL_SWITCH *Next;
1287 
1288  Next = &(Filler->Switch[Filler->NextSwitch]);
1289 
1290  if (Filler->X > Next->X && Next->Type == LastSwitch)
1291  return (TRUE);
1292  else
1293  return (FALSE);
1294 
1295 } /* FillerDone */
#define TRUE
Definition: capi.h:45
#define FALSE
Definition: capi.h:46
FILL_SWITCH Switch[MAX_NUM_SWITCHES]
Definition: intproto.cpp:94
uinT8 NextSwitch
Definition: intproto.cpp:89
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 1314 of file intproto.cpp.

1315  {
1316  int i, FirstBucket, LastBucket;
1317 
1318  if (Spread > 0.5)
1319  Spread = 0.5;
1320 
1321  FirstBucket = (int) floor ((Center - Spread) * NUM_PP_BUCKETS);
1322  if (FirstBucket < 0)
1323  FirstBucket += NUM_PP_BUCKETS;
1324 
1325  LastBucket = (int) floor ((Center + Spread) * NUM_PP_BUCKETS);
1326  if (LastBucket >= NUM_PP_BUCKETS)
1327  LastBucket -= NUM_PP_BUCKETS;
1328  if (debug) tprintf("Circular fill from %d to %d", FirstBucket, LastBucket);
1329  for (i = FirstBucket; TRUE; CircularIncrement (i, NUM_PP_BUCKETS)) {
1330  SET_BIT (ParamTable[i], Bit);
1331 
1332  /* exit loop after we have set the bit for the last bucket */
1333  if (i == LastBucket)
1334  break;
1335  }
1336 
1337 } /* FillPPCircularBits */
#define TRUE
Definition: capi.h:45
#define SET_BIT(array, bit)
Definition: bitvec.h:57
#define tprintf(...)
Definition: tprintf.h:31
#define CircularIncrement(i, r)
Definition: intproto.cpp:120
#define NUM_PP_BUCKETS
Definition: intproto.h:51

◆ 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 1357 of file intproto.cpp.

1358  {
1359  int i, FirstBucket, LastBucket;
1360 
1361  FirstBucket = (int) floor ((Center - Spread) * NUM_PP_BUCKETS);
1362  if (FirstBucket < 0)
1363  FirstBucket = 0;
1364 
1365  LastBucket = (int) floor ((Center + Spread) * NUM_PP_BUCKETS);
1366  if (LastBucket >= NUM_PP_BUCKETS)
1367  LastBucket = NUM_PP_BUCKETS - 1;
1368 
1369  if (debug) tprintf("Linear fill from %d to %d", FirstBucket, LastBucket);
1370  for (i = FirstBucket; i <= LastBucket; i++)
1371  SET_BIT (ParamTable[i], Bit);
1372 
1373 } /* FillPPLinearBits */
#define SET_BIT(array, bit)
Definition: bitvec.h:57
#define tprintf(...)
Definition: tprintf.h:31
#define NUM_PP_BUCKETS
Definition: intproto.h:51

◆ 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 }
void Efree(void *ptr)
Definition: emalloc.cpp:79
uinT8 NumProtoSets
Definition: intproto.h:109
PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS]
Definition: intproto.h:111
uinT8 * ProtoLengths
Definition: intproto.h:112

◆ 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 }
void Efree(void *ptr)
Definition: emalloc.cpp:79
void free_int_class(INT_CLASS int_class)
Definition: intproto.cpp:703
CLASS_PRUNER_STRUCT * ClassPruners[MAX_NUM_CLASS_PRUNERS]
Definition: intproto.h:125
INT_CLASS Class[MAX_NUM_CLASSES]
Definition: intproto.h:124

◆ 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 1471 of file intproto.cpp.

1474  {
1475  switch (Level) {
1476  case 0:
1479  *AnglePad = classify_cp_angle_pad_loose / 360.0;
1480  break;
1481 
1482  case 1:
1485  *AnglePad = classify_cp_angle_pad_medium / 360.0;
1486  break;
1487 
1488  case 2:
1491  *AnglePad = classify_cp_angle_pad_tight / 360.0;
1492  break;
1493 
1494  default:
1497  *AnglePad = classify_cp_angle_pad_tight / 360.0;
1498  break;
1499  }
1500  if (*AnglePad > 0.5)
1501  *AnglePad = 0.5;
1502 
1503 } /* GetCPPadsForLevel */
double classify_cp_angle_pad_tight
Definition: intproto.cpp:194
double classify_cp_side_pad_loose
Definition: intproto.cpp:198
double classify_cp_angle_pad_loose
Definition: intproto.cpp:190
double classify_cp_end_pad_medium
Definition: intproto.cpp:196
double classify_cp_side_pad_tight
Definition: intproto.cpp:200
double classify_cp_end_pad_tight
Definition: intproto.cpp:197
double classify_cp_side_pad_medium
Definition: intproto.cpp:199
double classify_cp_end_pad_loose
Definition: intproto.cpp:195
double classify_cp_angle_pad_medium
Definition: intproto.cpp:192
#define GetPicoFeatureLength()
Definition: picofeat.h:59

◆ 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 1512 of file intproto.cpp.

1512  {
1513  assert (Evidence >= 0.0);
1514  assert (Evidence <= 1.0);
1515 
1516  if (Evidence >= 0.90)
1517  return ScrollView::WHITE;
1518  else if (Evidence >= 0.75)
1519  return ScrollView::GREEN;
1520  else if (Evidence >= 0.50)
1521  return ScrollView::RED;
1522  else
1523  return ScrollView::BLUE;
1524 } /* 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 1538 of file intproto.cpp.

1538  {
1539  FILL_SWITCH *Next;
1540 
1541  /* compute the fill assuming no switches will be encountered */
1542  Fill->AngleStart = Filler->AngleStart;
1543  Fill->AngleEnd = Filler->AngleEnd;
1544  Fill->X = Filler->X;
1545  Fill->YStart = Filler->YStart >> 8;
1546  Fill->YEnd = Filler->YEnd >> 8;
1547 
1548  /* update the fill info and the filler for ALL switches at this X value */
1549  Next = &(Filler->Switch[Filler->NextSwitch]);
1550  while (Filler->X >= Next->X) {
1551  Fill->X = Filler->X = Next->X;
1552  if (Next->Type == StartSwitch) {
1553  Fill->YStart = Next->Y;
1554  Filler->StartDelta = Next->Delta;
1555  Filler->YStart = Next->YInit;
1556  }
1557  else if (Next->Type == EndSwitch) {
1558  Fill->YEnd = Next->Y;
1559  Filler->EndDelta = Next->Delta;
1560  Filler->YEnd = Next->YInit;
1561  }
1562  else { /* Type must be LastSwitch */
1563  break;
1564  }
1565  Filler->NextSwitch++;
1566  Next = &(Filler->Switch[Filler->NextSwitch]);
1567  }
1568 
1569  /* prepare the filler for the next call to this routine */
1570  Filler->X++;
1571  Filler->YStart += Filler->StartDelta;
1572  Filler->YEnd += Filler->EndDelta;
1573 
1574 } /* GetNextFill */
inT16 YStart
Definition: intproto.cpp:92
inT8 YEnd
Definition: intproto.cpp:103
uinT8 AngleStart
Definition: intproto.cpp:104
inT16 Delta
Definition: intproto.cpp:81
inT16 YEnd
Definition: intproto.cpp:92
inT16 EndDelta
Definition: intproto.cpp:93
inT16 StartDelta
Definition: intproto.cpp:93
uinT8 AngleEnd
Definition: intproto.cpp:90
FILL_SWITCH Switch[MAX_NUM_SWITCHES]
Definition: intproto.cpp:94
inT8 YStart
Definition: intproto.cpp:103
inT16 YInit
Definition: intproto.cpp:80
uinT8 AngleStart
Definition: intproto.cpp:90
uinT8 NextSwitch
Definition: intproto.cpp:89
uinT8 AngleEnd
Definition: intproto.cpp:104
SWITCH_TYPE Type
Definition: intproto.cpp:78

◆ InitFeatureDisplayWindowIfReqd()

void InitFeatureDisplayWindowIfReqd ( )

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

Definition at line 1911 of file intproto.cpp.

1911  {
1912  if (FeatureDisplayWindow == NULL) {
1913  FeatureDisplayWindow = CreateFeatureSpaceWindow("FeatureDisplayWindow",
1914  50, 700);
1915  }
1916 }
ScrollView * FeatureDisplayWindow
Definition: intproto.cpp:180
ScrollView * CreateFeatureSpaceWindow(const char *name, int xpos, int ypos)
Definition: intproto.cpp:1920

◆ InitIntMatchWindowIfReqd()

void InitIntMatchWindowIfReqd ( )

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

Definition at line 1879 of file intproto.cpp.

1879  {
1880  if (IntMatchWindow == NULL) {
1881  IntMatchWindow = CreateFeatureSpaceWindow("IntMatchWindow", 50, 200);
1882  SVMenuNode* popup_menu = new SVMenuNode();
1883 
1884  popup_menu->AddChild("Debug Adapted classes", IDA_ADAPTIVE,
1885  "x", "Class to debug");
1886  popup_menu->AddChild("Debug Static classes", IDA_STATIC,
1887  "x", "Class to debug");
1888  popup_menu->AddChild("Debug Both", IDA_BOTH,
1889  "x", "Class to debug");
1890  popup_menu->AddChild("Debug Shape Index", IDA_SHAPE_INDEX,
1891  "0", "Index to debug");
1892  popup_menu->BuildMenu(IntMatchWindow, false);
1893  }
1894 }
ScrollView * CreateFeatureSpaceWindow(const char *name, int xpos, int ypos)
Definition: intproto.cpp:1920
ScrollView * IntMatchWindow
Definition: intproto.cpp:179
void BuildMenu(ScrollView *sv, bool menu_bar=true)
Definition: svmnode.cpp:121
SVMenuNode * AddChild(const char *txt)
Definition: svmnode.cpp:59

◆ InitProtoDisplayWindowIfReqd()

void InitProtoDisplayWindowIfReqd ( )

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

Definition at line 1900 of file intproto.cpp.

1900  {
1901  if (ProtoDisplayWindow == NULL) {
1902  ProtoDisplayWindow = CreateFeatureSpaceWindow("ProtoDisplayWindow",
1903  550, 200);
1904  }
1905 }
ScrollView * CreateFeatureSpaceWindow(const char *name, int xpos, int ypos)
Definition: intproto.cpp:1920
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 1590 of file intproto.cpp.

1596 {
1597  FLOAT32 Angle;
1598  FLOAT32 X, Y, HalfLength;
1599  FLOAT32 Cos, Sin;
1600  FLOAT32 XAdjust, YAdjust;
1601  FPOINT Start, Switch1, Switch2, End;
1602  int S1 = 0;
1603  int S2 = 1;
1604 
1605  Angle = Proto->Angle;
1606  X = Proto->X;
1607  Y = Proto->Y;
1608  HalfLength = Proto->Length / 2.0;
1609 
1610  Filler->AngleStart = CircBucketFor(Angle - AnglePad, AS, NB);
1611  Filler->AngleEnd = CircBucketFor(Angle + AnglePad, AS, NB);
1612  Filler->NextSwitch = 0;
1613 
1614  if (fabs (Angle - 0.0) < HV_TOLERANCE || fabs (Angle - 0.5) < HV_TOLERANCE) {
1615  /* horizontal proto - handle as special case */
1616  Filler->X = Bucket8For(X - HalfLength - EndPad, XS, NB);
1617  Filler->YStart = Bucket16For(Y - SidePad, YS, NB * 256);
1618  Filler->YEnd = Bucket16For(Y + SidePad, YS, NB * 256);
1619  Filler->StartDelta = 0;
1620  Filler->EndDelta = 0;
1621  Filler->Switch[0].Type = LastSwitch;
1622  Filler->Switch[0].X = Bucket8For(X + HalfLength + EndPad, XS, NB);
1623  } else if (fabs(Angle - 0.25) < HV_TOLERANCE ||
1624  fabs(Angle - 0.75) < HV_TOLERANCE) {
1625  /* vertical proto - handle as special case */
1626  Filler->X = Bucket8For(X - SidePad, XS, NB);
1627  Filler->YStart = Bucket16For(Y - HalfLength - EndPad, YS, NB * 256);
1628  Filler->YEnd = Bucket16For(Y + HalfLength + EndPad, YS, NB * 256);
1629  Filler->StartDelta = 0;
1630  Filler->EndDelta = 0;
1631  Filler->Switch[0].Type = LastSwitch;
1632  Filler->Switch[0].X = Bucket8For(X + SidePad, XS, NB);
1633  } else {
1634  /* diagonal proto */
1635 
1636  if ((Angle > 0.0 && Angle < 0.25) || (Angle > 0.5 && Angle < 0.75)) {
1637  /* rising diagonal proto */
1638  Angle *= 2.0 * PI;
1639  Cos = fabs(cos(Angle));
1640  Sin = fabs(sin(Angle));
1641 
1642  /* compute the positions of the corners of the acceptance region */
1643  Start.x = X - (HalfLength + EndPad) * Cos - SidePad * Sin;
1644  Start.y = Y - (HalfLength + EndPad) * Sin + SidePad * Cos;
1645  End.x = 2.0 * X - Start.x;
1646  End.y = 2.0 * Y - Start.y;
1647  Switch1.x = X - (HalfLength + EndPad) * Cos + SidePad * Sin;
1648  Switch1.y = Y - (HalfLength + EndPad) * Sin - SidePad * Cos;
1649  Switch2.x = 2.0 * X - Switch1.x;
1650  Switch2.y = 2.0 * Y - Switch1.y;
1651 
1652  if (Switch1.x > Switch2.x) {
1653  S1 = 1;
1654  S2 = 0;
1655  }
1656 
1657  /* translate into bucket positions and deltas */
1658  Filler->X = Bucket8For(Start.x, XS, NB);
1659  Filler->StartDelta = -(inT16) ((Cos / Sin) * 256);
1660  Filler->EndDelta = (inT16) ((Sin / Cos) * 256);
1661 
1662  XAdjust = BucketEnd(Filler->X, XS, NB) - Start.x;
1663  YAdjust = XAdjust * Cos / Sin;
1664  Filler->YStart = Bucket16For(Start.y - YAdjust, YS, NB * 256);
1665  YAdjust = XAdjust * Sin / Cos;
1666  Filler->YEnd = Bucket16For(Start.y + YAdjust, YS, NB * 256);
1667 
1668  Filler->Switch[S1].Type = StartSwitch;
1669  Filler->Switch[S1].X = Bucket8For(Switch1.x, XS, NB);
1670  Filler->Switch[S1].Y = Bucket8For(Switch1.y, YS, NB);
1671  XAdjust = Switch1.x - BucketStart(Filler->Switch[S1].X, XS, NB);
1672  YAdjust = XAdjust * Sin / Cos;
1673  Filler->Switch[S1].YInit = Bucket16For(Switch1.y - YAdjust, YS, NB * 256);
1674  Filler->Switch[S1].Delta = Filler->EndDelta;
1675 
1676  Filler->Switch[S2].Type = EndSwitch;
1677  Filler->Switch[S2].X = Bucket8For(Switch2.x, XS, NB);
1678  Filler->Switch[S2].Y = Bucket8For(Switch2.y, YS, NB);
1679  XAdjust = Switch2.x - BucketStart(Filler->Switch[S2].X, XS, NB);
1680  YAdjust = XAdjust * Cos / Sin;
1681  Filler->Switch[S2].YInit = Bucket16For(Switch2.y + YAdjust, YS, NB * 256);
1682  Filler->Switch[S2].Delta = Filler->StartDelta;
1683 
1684  Filler->Switch[2].Type = LastSwitch;
1685  Filler->Switch[2].X = Bucket8For(End.x, XS, NB);
1686  } else {
1687  /* falling diagonal proto */
1688  Angle *= 2.0 * PI;
1689  Cos = fabs(cos(Angle));
1690  Sin = fabs(sin(Angle));
1691 
1692  /* compute the positions of the corners of the acceptance region */
1693  Start.x = X - (HalfLength + EndPad) * Cos - SidePad * Sin;
1694  Start.y = Y + (HalfLength + EndPad) * Sin - SidePad * Cos;
1695  End.x = 2.0 * X - Start.x;
1696  End.y = 2.0 * Y - Start.y;
1697  Switch1.x = X - (HalfLength + EndPad) * Cos + SidePad * Sin;
1698  Switch1.y = Y + (HalfLength + EndPad) * Sin + SidePad * Cos;
1699  Switch2.x = 2.0 * X - Switch1.x;
1700  Switch2.y = 2.0 * Y - Switch1.y;
1701 
1702  if (Switch1.x > Switch2.x) {
1703  S1 = 1;
1704  S2 = 0;
1705  }
1706 
1707  /* translate into bucket positions and deltas */
1708  Filler->X = Bucket8For(Start.x, XS, NB);
1709  Filler->StartDelta = static_cast<inT16>(ClipToRange<int>(
1710  -IntCastRounded((Sin / Cos) * 256), MIN_INT16, MAX_INT16));
1711  Filler->EndDelta = static_cast<inT16>(ClipToRange<int>(
1712  IntCastRounded((Cos / Sin) * 256), MIN_INT16, MAX_INT16));
1713 
1714  XAdjust = BucketEnd(Filler->X, XS, NB) - Start.x;
1715  YAdjust = XAdjust * Sin / Cos;
1716  Filler->YStart = Bucket16For(Start.y - YAdjust, YS, NB * 256);
1717  YAdjust = XAdjust * Cos / Sin;
1718  Filler->YEnd = Bucket16For(Start.y + YAdjust, YS, NB * 256);
1719 
1720  Filler->Switch[S1].Type = EndSwitch;
1721  Filler->Switch[S1].X = Bucket8For(Switch1.x, XS, NB);
1722  Filler->Switch[S1].Y = Bucket8For(Switch1.y, YS, NB);
1723  XAdjust = Switch1.x - BucketStart(Filler->Switch[S1].X, XS, NB);
1724  YAdjust = XAdjust * Sin / Cos;
1725  Filler->Switch[S1].YInit = Bucket16For(Switch1.y + YAdjust, YS, NB * 256);
1726  Filler->Switch[S1].Delta = Filler->StartDelta;
1727 
1728  Filler->Switch[S2].Type = StartSwitch;
1729  Filler->Switch[S2].X = Bucket8For(Switch2.x, XS, NB);
1730  Filler->Switch[S2].Y = Bucket8For(Switch2.y, YS, NB);
1731  XAdjust = Switch2.x - BucketStart(Filler->Switch[S2].X, XS, NB);
1732  YAdjust = XAdjust * Cos / Sin;
1733  Filler->Switch[S2].YInit = Bucket16For(Switch2.y - YAdjust, YS, NB * 256);
1734  Filler->Switch[S2].Delta = Filler->EndDelta;
1735 
1736  Filler->Switch[2].Type = LastSwitch;
1737  Filler->Switch[2].X = Bucket8For(End.x, XS, NB);
1738  }
1739  }
1740 } /* InitTableFiller */
inT16 YStart
Definition: intproto.cpp:92
int IntCastRounded(double x)
Definition: helpers.h:172
short inT16
Definition: host.h:33
#define HV_TOLERANCE
Definition: intproto.cpp:69
FLOAT32 x
Definition: fpoint.h:31
#define YS
#define PI
Definition: const.h:19
FLOAT32 BucketStart(int Bucket, FLOAT32 Offset, int NumBuckets)
Definition: intproto.cpp:1207
#define XS
FLOAT32 Angle
Definition: protos.h:49
inT16 Delta
Definition: intproto.cpp:81
FLOAT32 y
Definition: fpoint.h:31
FLOAT32 X
Definition: protos.h:47
FLOAT32 Length
Definition: protos.h:50
inT16 YEnd
Definition: intproto.cpp:92
#define MAX_INT16
Definition: host.h:52
uinT8 Bucket8For(FLOAT32 param, FLOAT32 offset, int num_buckets)
Definition: intproto.cpp:435
inT16 EndDelta
Definition: intproto.cpp:93
float FLOAT32
Definition: host.h:44
#define AS
inT16 StartDelta
Definition: intproto.cpp:93
uinT8 AngleEnd
Definition: intproto.cpp:90
FILL_SWITCH Switch[MAX_NUM_SWITCHES]
Definition: intproto.cpp:94
FLOAT32 BucketEnd(int Bucket, FLOAT32 Offset, int NumBuckets)
Definition: intproto.cpp:1225
FLOAT32 Y
Definition: protos.h:48
inT16 YInit
Definition: intproto.cpp:80
#define NB
uinT8 AngleStart
Definition: intproto.cpp:90
uinT8 NextSwitch
Definition: intproto.cpp:89
uinT16 Bucket16For(FLOAT32 param, FLOAT32 offset, int num_buckets)
Definition: intproto.cpp:439
uinT8 CircBucketFor(FLOAT32 param, FLOAT32 offset, int num_buckets)
Definition: intproto.cpp:449
SWITCH_TYPE Type
Definition: intproto.cpp:78
#define MIN_INT16
Definition: host.h:60
Definition: fpoint.h:29

◆ 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 */
uinT16 NumProtos
Definition: intproto.h:108
struct INT_CLASS_STRUCT * INT_CLASS
struct PROTO_SET_STRUCT * PROTO_SET
unsigned char uinT8
Definition: host.h:32
#define MaxNumIntProtosIn(C)
Definition: intproto.h:168
#define PROTOS_PER_PROTO_SET
Definition: intproto.h:48
uinT8 NumProtoSets
Definition: intproto.h:109
#define MAX_NUM_PROTO_SETS
Definition: intproto.h:49
PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS]
Definition: intproto.h:111
void * Emalloc(int Size)
Definition: emalloc.cpp:47
#define MAX_NUM_CONFIGS
Definition: intproto.h:46
uinT16 ConfigLengths[MAX_NUM_CONFIGS]
Definition: intproto.h:113
uinT8 NumConfigs
Definition: intproto.h:110
uinT8 * ProtoLengths
Definition: intproto.h:112

◆ 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 */
struct INT_TEMPLATES_STRUCT * INT_TEMPLATES
#define ClassForClassId(T, c)
Definition: intproto.h:181
#define MAX_NUM_CLASSES
Definition: matchdefs.h:31
void * Emalloc(int Size)
Definition: emalloc.cpp:47

◆ 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 1755 of file intproto.cpp.

1756  {
1757  FLOAT32 X, Y, Dx, Dy, Length;
1758 
1759  window->Pen(color);
1760  assert(Feature != NULL);
1761  assert(color != 0);
1762 
1763  X = Feature->X;
1764  Y = Feature->Y;
1765  Length = GetPicoFeatureLength() * 0.7 * INT_CHAR_NORM_RANGE;
1766  // The -PI has no significant effect here, but the value of Theta is computed
1767  // using BinaryAnglePlusPi in intfx.cpp.
1768  Dx = (Length / 2.0) * cos((Feature->Theta / 256.0) * 2.0 * PI - PI);
1769  Dy = (Length / 2.0) * sin((Feature->Theta / 256.0) * 2.0 * PI - PI);
1770 
1771  window->SetCursor(X, Y);
1772  window->DrawTo(X + Dx, Y + Dy);
1773 } /* RenderIntFeature */
void DrawTo(int x, int y)
Definition: scrollview.cpp:531
void SetCursor(int x, int y)
Definition: scrollview.cpp:525
#define PI
Definition: const.h:19
float FLOAT32
Definition: host.h:44
void Pen(Color color)
Definition: scrollview.cpp:726
#define INT_CHAR_NORM_RANGE
Definition: intproto.h:133
#define GetPicoFeatureLength()
Definition: picofeat.h:59

◆ 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 1791 of file intproto.cpp.

1794  {
1795  PROTO_SET ProtoSet;
1796  INT_PROTO Proto;
1797  int ProtoSetIndex;
1798  int ProtoWordIndex;
1799  FLOAT32 Length;
1800  int Xmin, Xmax, Ymin, Ymax;
1801  FLOAT32 X, Y, Dx, Dy;
1802  uinT32 ProtoMask;
1803  int Bucket;
1804 
1805  assert(ProtoId >= 0);
1806  assert(Class != NULL);
1807  assert(ProtoId < Class->NumProtos);
1808  assert(color != 0);
1809  window->Pen(color);
1810 
1811  ProtoSet = Class->ProtoSets[SetForProto(ProtoId)];
1812  ProtoSetIndex = IndexForProto(ProtoId);
1813  Proto = &(ProtoSet->Protos[ProtoSetIndex]);
1814  Length = (Class->ProtoLengths[ProtoId] *
1816  ProtoMask = PPrunerMaskFor(ProtoId);
1817  ProtoWordIndex = PPrunerWordIndexFor(ProtoId);
1818 
1819  // find the x and y extent of the proto from the proto pruning table
1820  Xmin = Ymin = NUM_PP_BUCKETS;
1821  Xmax = Ymax = 0;
1822  for (Bucket = 0; Bucket < NUM_PP_BUCKETS; Bucket++) {
1823  if (ProtoMask & ProtoSet->ProtoPruner[PRUNER_X][Bucket][ProtoWordIndex]) {
1824  UpdateRange(Bucket, &Xmin, &Xmax);
1825  }
1826 
1827  if (ProtoMask & ProtoSet->ProtoPruner[PRUNER_Y][Bucket][ProtoWordIndex]) {
1828  UpdateRange(Bucket, &Ymin, &Ymax);
1829  }
1830  }
1831  X = (Xmin + Xmax + 1) / 2.0 * PROTO_PRUNER_SCALE;
1832  Y = (Ymin + Ymax + 1) / 2.0 * PROTO_PRUNER_SCALE;
1833  // The -PI has no significant effect here, but the value of Theta is computed
1834  // using BinaryAnglePlusPi in intfx.cpp.
1835  Dx = (Length / 2.0) * cos((Proto->Angle / 256.0) * 2.0 * PI - PI);
1836  Dy = (Length / 2.0) * sin((Proto->Angle / 256.0) * 2.0 * PI - PI);
1837 
1838  window->SetCursor(X - Dx, Y - Dy);
1839  window->DrawTo(X + Dx, Y + Dy);
1840 } /* RenderIntProto */
void DrawTo(int x, int y)
Definition: scrollview.cpp:531
#define PPrunerWordIndexFor(I)
Definition: intproto.h:173
void UpdateRange(const T1 &x, T2 *lower_bound, T2 *upper_bound)
Definition: helpers.h:125
#define PROTO_PRUNER_SCALE
Definition: intproto.cpp:52
void SetCursor(int x, int y)
Definition: scrollview.cpp:525
#define PI
Definition: const.h:19
#define SetForProto(P)
Definition: intproto.h:169
#define PRUNER_X
Definition: intproto.h:34
#define PRUNER_Y
Definition: intproto.h:35
float FLOAT32
Definition: host.h:44
void Pen(Color color)
Definition: scrollview.cpp:726
INT_PROTO_STRUCT Protos[PROTOS_PER_PROTO_SET]
Definition: intproto.h:97
#define IndexForProto(P)
Definition: intproto.h:170
#define PPrunerMaskFor(I)
Definition: intproto.h:176
PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS]
Definition: intproto.h:111
#define INT_CHAR_NORM_RANGE
Definition: intproto.h:133
unsigned int uinT32
Definition: host.h:36
PROTO_PRUNER ProtoPruner
Definition: intproto.h:96
#define NUM_PP_BUCKETS
Definition: intproto.h:51
#define GetPicoFeatureLength()
Definition: picofeat.h:59
uinT8 * ProtoLengths
Definition: intproto.h:112

◆ 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 1858 of file intproto.cpp.

1858  {
1859  if (Param < Min) {
1860  if (Id)
1861  cprintf("Warning: Param %s truncated from %f to %d!\n",
1862  Id, Param, Min);
1863  Param = Min;
1864  } else if (Param > Max) {
1865  if (Id)
1866  cprintf("Warning: Param %s truncated from %f to %d!\n",
1867  Id, Param, Max);
1868  Param = Max;
1869  }
1870  return static_cast<int>(floor(Param));
1871 } /* 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 */
static void Update()
Definition: scrollview.cpp:715
ScrollView * IntMatchWindow
Definition: intproto.cpp:179

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.