All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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

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

macro for performing circular increments of bucket indices

Definition at line 122 of file intproto.cpp.

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

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

Definition at line 71 of file intproto.cpp.

#define INT_BASELINE   (0.25 * INT_CHAR_NORM_RANGE)

Definition at line 57 of file intproto.cpp.

#define INT_CAPHEIGHT   (1.0 * INT_CHAR_NORM_RANGE)

Definition at line 59 of file intproto.cpp.

#define INT_DESCENDER   (0.0 * INT_CHAR_NORM_RANGE)

Definition at line 56 of file intproto.cpp.

#define INT_MAX_X   INT_CHAR_NORM_RANGE

Definition at line 67 of file intproto.cpp.

#define INT_MAX_Y   INT_CHAR_NORM_RANGE

Definition at line 68 of file intproto.cpp.

#define INT_MIN_X   0

Definition at line 65 of file intproto.cpp.

#define INT_MIN_Y   0

Definition at line 66 of file intproto.cpp.

#define INT_XCENTER   (0.5 * INT_CHAR_NORM_RANGE)

Definition at line 61 of file intproto.cpp.

#define INT_XHEIGHT   (0.75 * INT_CHAR_NORM_RANGE)

Definition at line 58 of file intproto.cpp.

#define INT_XRADIUS   (0.2 * INT_CHAR_NORM_RANGE)

Definition at line 63 of file intproto.cpp.

#define INT_YCENTER   (0.5 * INT_CHAR_NORM_RANGE)

Definition at line 62 of file intproto.cpp.

#define INT_YRADIUS   (0.2 * INT_CHAR_NORM_RANGE)

Definition at line 64 of file intproto.cpp.

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

macro for mapping floats to ints without bounds checking

Definition at line 125 of file intproto.cpp.

#define MAX_LEVEL   2
#define MAX_NUM_SWITCHES   3

Definition at line 76 of file intproto.cpp.

#define NB   NUM_CP_BUCKETS
#define OLD_MAX_NUM_CONFIGS   32

Definition at line 114 of file intproto.cpp.

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

Definition at line 115 of file intproto.cpp.

#define PROTO_PRUNER_SCALE   (4.0)

Definition at line 54 of file intproto.cpp.

#define XS   X_SHIFT
#define YS   Y_SHIFT

Enumeration Type Documentation

Enumerator
StartSwitch 
EndSwitch 
LastSwitch 

Definition at line 73 of file intproto.cpp.

Function Documentation

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

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

272  {
273  int Index;
274 
275  assert(Class->NumConfigs < MAX_NUM_CONFIGS);
276 
277  Index = Class->NumConfigs++;
278  Class->ConfigLengths[Index] = 0;
279  return Index;
280 } /* AddIntConfig */
#define MAX_NUM_CONFIGS
Definition: intproto.h:46
uinT16 ConfigLengths[MAX_NUM_CONFIGS]
Definition: intproto.h:113
uinT8 NumConfigs
Definition: intproto.h:110
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 295 of file intproto.cpp.

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

349 {
350  CLASS_PRUNER_STRUCT* Pruner;
351  uinT32 ClassMask;
352  uinT32 ClassCount;
353  uinT32 WordIndex;
354  int Level;
355  FLOAT32 EndPad, SidePad, AnglePad;
356  TABLE_FILLER TableFiller;
357  FILL_SPEC FillSpec;
358 
359  Pruner = CPrunerFor (Templates, ClassId);
360  WordIndex = CPrunerWordIndexFor (ClassId);
361  ClassMask = CPrunerMaskFor (MAX_LEVEL, ClassId);
362 
363  for (Level = classify_num_cp_levels - 1; Level >= 0; Level--) {
364  GetCPPadsForLevel(Level, &EndPad, &SidePad, &AnglePad);
365  ClassCount = CPrunerMaskFor (Level, ClassId);
366  InitTableFiller(EndPad, SidePad, AnglePad, Proto, &TableFiller);
367 
368  while (!FillerDone (&TableFiller)) {
369  GetNextFill(&TableFiller, &FillSpec);
370  DoFill(&FillSpec, Pruner, ClassMask, ClassCount, WordIndex);
371  }
372  }
373 } /* AddProtoToClassPruner */
#define MAX_LEVEL
float FLOAT32
Definition: host.h:111
int classify_num_cp_levels
Definition: intproto.cpp:190
#define CPrunerWordIndexFor(c)
Definition: intproto.h:185
void DoFill(FILL_SPEC *FillSpec, CLASS_PRUNER_STRUCT *Pruner, register uinT32 ClassMask, register uinT32 ClassCount, register uinT32 WordIndex)
Definition: intproto.cpp:1254
unsigned int uinT32
Definition: host.h:103
#define CPrunerFor(T, c)
Definition: intproto.h:184
void GetCPPadsForLevel(int Level, FLOAT32 *EndPad, FLOAT32 *SidePad, FLOAT32 *AnglePad)
Definition: intproto.cpp:1485
void InitTableFiller(FLOAT32 EndPad, FLOAT32 SidePad, FLOAT32 AnglePad, PROTO Proto, TABLE_FILLER *Filler)
Definition: intproto.cpp:1607
void GetNextFill(TABLE_FILLER *Filler, FILL_SPEC *Fill)
Definition: intproto.cpp:1554
#define CPrunerMaskFor(L, c)
Definition: intproto.h:187
BOOL8 FillerDone(TABLE_FILLER *Filler)
Definition: intproto.cpp:1297
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 389 of file intproto.cpp.

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

Definition at line 445 of file intproto.cpp.

445  {
446  int bucket = IntCastRounded(MapParam(param, offset, num_buckets));
447  return static_cast<uinT16>(ClipToRange(bucket, 0, num_buckets - 1));
448 }
T ClipToRange(const T &x, const T &lower_bound, const T &upper_bound)
Definition: helpers.h:115
#define MapParam(P, O, N)
Definition: intproto.cpp:125
int IntCastRounded(double x)
Definition: helpers.h:172
unsigned short uinT16
Definition: host.h:101
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 441 of file intproto.cpp.

441  {
442  int bucket = IntCastRounded(MapParam(param, offset, num_buckets));
443  return static_cast<uinT8>(ClipToRange(bucket, 0, num_buckets - 1));
444 }
T ClipToRange(const T &x, const T &lower_bound, const T &upper_bound)
Definition: helpers.h:115
#define MapParam(P, O, N)
Definition: intproto.cpp:125
int IntCastRounded(double x)
Definition: helpers.h:172
unsigned char uinT8
Definition: host.h:99
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 1235 of file intproto.cpp.

1235  {
1236  return (((FLOAT32) (Bucket + 1) / NumBuckets) - Offset);
1237 } /* BucketEnd */
float FLOAT32
Definition: host.h:111
USHORT Offset
Definition: GlyphLessFont.h:26
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 1216 of file intproto.cpp.

1216  {
1217  return (((FLOAT32) Bucket / NumBuckets) - Offset);
1218 
1219 } /* BucketStart */
float FLOAT32
Definition: host.h:111
USHORT Offset
Definition: GlyphLessFont.h:26
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 455 of file intproto.cpp.

455  {
456  int bucket = IntCastRounded(MapParam(param, offset, num_buckets));
457  return static_cast<uinT8>(Modulo(bucket, num_buckets));
458 } /* CircBucketFor */
int Modulo(int a, int b)
Definition: helpers.h:157
#define MapParam(P, O, N)
Definition: intproto.cpp:125
int IntCastRounded(double x)
Definition: helpers.h:172
unsigned char uinT8
Definition: host.h:99
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 493 of file intproto.cpp.

493  {
494  int ProtoId;
495  INT_PROTO Proto;
496  int TotalLength;
497 
498  for (ProtoId = 0, TotalLength = 0;
499  ProtoId < Class->NumProtos; ProtoId++) {
500  if (test_bit(Config, ProtoId)) {
501  Proto = ProtoForProtoId(Class, ProtoId);
502  SET_BIT(Proto->Configs, ConfigId);
503  TotalLength += Class->ProtoLengths[ProtoId];
504  }
505  }
506  Class->ConfigLengths[ConfigId] = TotalLength;
507 } /* ConvertConfig */
#define test_bit(array, bit)
Definition: bitvec.h:61
uinT16 ConfigLengths[MAX_NUM_CONFIGS]
Definition: intproto.h:113
#define ProtoForProtoId(C, P)
Definition: intproto.h:171
#define SET_BIT(array, bit)
Definition: bitvec.h:57
CLUSTERCONFIG Config
uinT8 * ProtoLengths
Definition: intproto.h:112
uinT16 NumProtos
Definition: intproto.h:108
uinT32 Configs[WERDS_PER_CONFIG_VEC]
Definition: intproto.h:86
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 1936 of file intproto.cpp.

1936  {
1937  return new ScrollView(name, xpos, ypos, 520, 520, 260, 260, true);
1938 }
name_table name
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 630 of file intproto.cpp.

630  {
631  ScrollView::Color color = GetMatchColorFor(Evidence);
632  RenderIntFeature(IntMatchWindow, Feature, color);
633  if (FeatureDisplayWindow) {
634  RenderIntFeature(FeatureDisplayWindow, Feature, color);
635  }
636 } /* DisplayIntFeature */
ScrollView * IntMatchWindow
Definition: intproto.cpp:181
void RenderIntFeature(ScrollView *window, const INT_FEATURE_STRUCT *Feature, ScrollView::Color color)
Definition: intproto.cpp:1770
ScrollView::Color GetMatchColorFor(FLOAT32 Evidence)
Definition: intproto.cpp:1527
ScrollView * FeatureDisplayWindow
Definition: intproto.cpp:182
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 652 of file intproto.cpp.

652  {
653  ScrollView::Color color = GetMatchColorFor(Evidence);
654  RenderIntProto(IntMatchWindow, Class, ProtoId, color);
655  if (ProtoDisplayWindow) {
656  RenderIntProto(ProtoDisplayWindow, Class, ProtoId, color);
657  }
658 } /* DisplayIntProto */
ScrollView * ProtoDisplayWindow
Definition: intproto.cpp:183
ScrollView * IntMatchWindow
Definition: intproto.cpp:181
void RenderIntProto(ScrollView *window, INT_CLASS Class, PROTO_ID ProtoId, ScrollView::Color color)
Definition: intproto.cpp:1807
ScrollView::Color GetMatchColorFor(FLOAT32 Evidence)
Definition: intproto.cpp:1527
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 1254 of file intproto.cpp.

1258  {
1259  register int X, Y, Angle;
1260  register uinT32 OldWord;
1261 
1262  X = FillSpec->X;
1263  if (X < 0)
1264  X = 0;
1265  if (X >= NUM_CP_BUCKETS)
1266  X = NUM_CP_BUCKETS - 1;
1267 
1268  if (FillSpec->YStart < 0)
1269  FillSpec->YStart = 0;
1270  if (FillSpec->YEnd >= NUM_CP_BUCKETS)
1271  FillSpec->YEnd = NUM_CP_BUCKETS - 1;
1272 
1273  for (Y = FillSpec->YStart; Y <= FillSpec->YEnd; Y++)
1274  for (Angle = FillSpec->AngleStart;
1276  OldWord = Pruner->p[X][Y][Angle][WordIndex];
1277  if (ClassCount > (OldWord & ClassMask)) {
1278  OldWord &= ~ClassMask;
1279  OldWord |= ClassCount;
1280  Pruner->p[X][Y][Angle][WordIndex] = OldWord;
1281  }
1282  if (Angle == FillSpec->AngleEnd)
1283  break;
1284  }
1285 } /* DoFill */
uinT8 AngleEnd
Definition: intproto.cpp:106
#define NUM_CP_BUCKETS
Definition: intproto.h:52
inT8 YStart
Definition: intproto.cpp:105
uinT8 AngleStart
Definition: intproto.cpp:106
unsigned int uinT32
Definition: host.h:103
inT8 YEnd
Definition: intproto.cpp:105
#define TRUE
Definition: capi.h:28
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:122
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 1297 of file intproto.cpp.

1297  {
1298  FILL_SWITCH *Next;
1299 
1300  Next = &(Filler->Switch[Filler->NextSwitch]);
1301 
1302  if (Filler->X > Next->X && Next->Type == LastSwitch)
1303  return (TRUE);
1304  else
1305  return (FALSE);
1306 
1307 } /* FillerDone */
uinT8 NextSwitch
Definition: intproto.cpp:91
SWITCH_TYPE Type
Definition: intproto.cpp:80
#define FALSE
Definition: capi.h:29
#define TRUE
Definition: capi.h:28
FILL_SWITCH Switch[MAX_NUM_SWITCHES]
Definition: intproto.cpp:96
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 1327 of file intproto.cpp.

1328  {
1329  int i, FirstBucket, LastBucket;
1330 
1331  if (Spread > 0.5)
1332  Spread = 0.5;
1333 
1334  FirstBucket = (int) floor ((Center - Spread) * NUM_PP_BUCKETS);
1335  if (FirstBucket < 0)
1336  FirstBucket += NUM_PP_BUCKETS;
1337 
1338  LastBucket = (int) floor ((Center + Spread) * NUM_PP_BUCKETS);
1339  if (LastBucket >= NUM_PP_BUCKETS)
1340  LastBucket -= NUM_PP_BUCKETS;
1341  if (debug) tprintf("Circular fill from %d to %d", FirstBucket, LastBucket);
1342  for (i = FirstBucket; TRUE; CircularIncrement (i, NUM_PP_BUCKETS)) {
1343  SET_BIT (ParamTable[i], Bit);
1344 
1345  /* exit loop after we have set the bit for the last bucket */
1346  if (i == LastBucket)
1347  break;
1348  }
1349 
1350 } /* FillPPCircularBits */
#define tprintf(...)
Definition: tprintf.h:31
#define SET_BIT(array, bit)
Definition: bitvec.h:57
#define NUM_PP_BUCKETS
Definition: intproto.h:51
#define TRUE
Definition: capi.h:28
#define CircularIncrement(i, r)
Definition: intproto.cpp:122
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 1371 of file intproto.cpp.

1372  {
1373  int i, FirstBucket, LastBucket;
1374 
1375  FirstBucket = (int) floor ((Center - Spread) * NUM_PP_BUCKETS);
1376  if (FirstBucket < 0)
1377  FirstBucket = 0;
1378 
1379  LastBucket = (int) floor ((Center + Spread) * NUM_PP_BUCKETS);
1380  if (LastBucket >= NUM_PP_BUCKETS)
1381  LastBucket = NUM_PP_BUCKETS - 1;
1382 
1383  if (debug) tprintf("Linear fill from %d to %d", FirstBucket, LastBucket);
1384  for (i = FirstBucket; i <= LastBucket; i++)
1385  SET_BIT (ParamTable[i], Bit);
1386 
1387 } /* FillPPLinearBits */
#define tprintf(...)
Definition: tprintf.h:31
#define SET_BIT(array, bit)
Definition: bitvec.h:57
#define NUM_PP_BUCKETS
Definition: intproto.h:51
void free_int_class ( INT_CLASS  int_class)

Definition at line 711 of file intproto.cpp.

711  {
712  int i;
713 
714  for (i = 0; i < int_class->NumProtoSets; i++) {
715  Efree (int_class->ProtoSets[i]);
716  }
717  if (int_class->ProtoLengths != NULL) {
718  Efree (int_class->ProtoLengths);
719  }
720  Efree(int_class);
721 }
PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS]
Definition: intproto.h:111
uinT8 NumProtoSets
Definition: intproto.h:109
void Efree(void *ptr)
Definition: emalloc.cpp:79
#define NULL
Definition: host.h:144
uinT8 * ProtoLengths
Definition: intproto.h:112
void free_int_templates ( INT_TEMPLATES  templates)

Definition at line 748 of file intproto.cpp.

748  {
749  int i;
750 
751  for (i = 0; i < templates->NumClasses; i++)
752  free_int_class(templates->Class[i]);
753  for (i = 0; i < templates->NumClassPruners; i++)
754  delete templates->ClassPruners[i];
755  Efree(templates);
756 }
CLASS_PRUNER_STRUCT * ClassPruners[MAX_NUM_CLASS_PRUNERS]
Definition: intproto.h:125
INT_CLASS Class[MAX_NUM_CLASSES]
Definition: intproto.h:124
void free_int_class(INT_CLASS int_class)
Definition: intproto.cpp:711
void Efree(void *ptr)
Definition: emalloc.cpp:79
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 1485 of file intproto.cpp.

1488  {
1489  switch (Level) {
1490  case 0:
1493  *AnglePad = classify_cp_angle_pad_loose / 360.0;
1494  break;
1495 
1496  case 1:
1499  *AnglePad = classify_cp_angle_pad_medium / 360.0;
1500  break;
1501 
1502  case 2:
1505  *AnglePad = classify_cp_angle_pad_tight / 360.0;
1506  break;
1507 
1508  default:
1511  *AnglePad = classify_cp_angle_pad_tight / 360.0;
1512  break;
1513  }
1514  if (*AnglePad > 0.5)
1515  *AnglePad = 0.5;
1516 
1517 } /* GetCPPadsForLevel */
double classify_cp_angle_pad_tight
Definition: intproto.cpp:196
double classify_cp_side_pad_loose
Definition: intproto.cpp:200
double classify_cp_end_pad_tight
Definition: intproto.cpp:199
double classify_cp_side_pad_tight
Definition: intproto.cpp:202
double classify_cp_end_pad_medium
Definition: intproto.cpp:198
double classify_cp_angle_pad_medium
Definition: intproto.cpp:194
#define GetPicoFeatureLength()
Definition: picofeat.h:59
double classify_cp_end_pad_loose
Definition: intproto.cpp:197
double classify_cp_side_pad_medium
Definition: intproto.cpp:201
double classify_cp_angle_pad_loose
Definition: intproto.cpp:192
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 1527 of file intproto.cpp.

1527  {
1528  assert (Evidence >= 0.0);
1529  assert (Evidence <= 1.0);
1530 
1531  if (Evidence >= 0.90)
1532  return ScrollView::WHITE;
1533  else if (Evidence >= 0.75)
1534  return ScrollView::GREEN;
1535  else if (Evidence >= 0.50)
1536  return ScrollView::RED;
1537  else
1538  return ScrollView::BLUE;
1539 } /* GetMatchColorFor */
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 1554 of file intproto.cpp.

1554  {
1555  FILL_SWITCH *Next;
1556 
1557  /* compute the fill assuming no switches will be encountered */
1558  Fill->AngleStart = Filler->AngleStart;
1559  Fill->AngleEnd = Filler->AngleEnd;
1560  Fill->X = Filler->X;
1561  Fill->YStart = Filler->YStart >> 8;
1562  Fill->YEnd = Filler->YEnd >> 8;
1563 
1564  /* update the fill info and the filler for ALL switches at this X value */
1565  Next = &(Filler->Switch[Filler->NextSwitch]);
1566  while (Filler->X >= Next->X) {
1567  Fill->X = Filler->X = Next->X;
1568  if (Next->Type == StartSwitch) {
1569  Fill->YStart = Next->Y;
1570  Filler->StartDelta = Next->Delta;
1571  Filler->YStart = Next->YInit;
1572  }
1573  else if (Next->Type == EndSwitch) {
1574  Fill->YEnd = Next->Y;
1575  Filler->EndDelta = Next->Delta;
1576  Filler->YEnd = Next->YInit;
1577  }
1578  else { /* Type must be LastSwitch */
1579  break;
1580  }
1581  Filler->NextSwitch++;
1582  Next = &(Filler->Switch[Filler->NextSwitch]);
1583  }
1584 
1585  /* prepare the filler for the next call to this routine */
1586  Filler->X++;
1587  Filler->YStart += Filler->StartDelta;
1588  Filler->YEnd += Filler->EndDelta;
1589 
1590 } /* GetNextFill */
uinT8 AngleEnd
Definition: intproto.cpp:106
inT8 YStart
Definition: intproto.cpp:105
inT16 YStart
Definition: intproto.cpp:94
inT16 YEnd
Definition: intproto.cpp:94
uinT8 AngleEnd
Definition: intproto.cpp:92
inT16 YInit
Definition: intproto.cpp:82
uinT8 AngleStart
Definition: intproto.cpp:106
inT16 StartDelta
Definition: intproto.cpp:95
uinT8 AngleStart
Definition: intproto.cpp:92
inT8 YEnd
Definition: intproto.cpp:105
inT16 EndDelta
Definition: intproto.cpp:95
uinT8 NextSwitch
Definition: intproto.cpp:91
SWITCH_TYPE Type
Definition: intproto.cpp:80
inT16 Delta
Definition: intproto.cpp:83
FILL_SWITCH Switch[MAX_NUM_SWITCHES]
Definition: intproto.cpp:96
void InitFeatureDisplayWindowIfReqd ( )

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

Definition at line 1927 of file intproto.cpp.

1927  {
1928  if (FeatureDisplayWindow == NULL) {
1929  FeatureDisplayWindow = CreateFeatureSpaceWindow("FeatureDisplayWindow",
1930  50, 700);
1931  }
1932 }
#define NULL
Definition: host.h:144
ScrollView * CreateFeatureSpaceWindow(const char *name, int xpos, int ypos)
Definition: intproto.cpp:1936
ScrollView * FeatureDisplayWindow
Definition: intproto.cpp:182
void InitIntMatchWindowIfReqd ( )

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

Definition at line 1895 of file intproto.cpp.

1895  {
1896  if (IntMatchWindow == NULL) {
1897  IntMatchWindow = CreateFeatureSpaceWindow("IntMatchWindow", 50, 200);
1898  SVMenuNode* popup_menu = new SVMenuNode();
1899 
1900  popup_menu->AddChild("Debug Adapted classes", IDA_ADAPTIVE,
1901  "x", "Class to debug");
1902  popup_menu->AddChild("Debug Static classes", IDA_STATIC,
1903  "x", "Class to debug");
1904  popup_menu->AddChild("Debug Both", IDA_BOTH,
1905  "x", "Class to debug");
1906  popup_menu->AddChild("Debug Shape Index", IDA_SHAPE_INDEX,
1907  "0", "Index to debug");
1908  popup_menu->BuildMenu(IntMatchWindow, false);
1909  }
1910 }
void BuildMenu(ScrollView *sv, bool menu_bar=true)
Definition: svmnode.cpp:121
ScrollView * IntMatchWindow
Definition: intproto.cpp:181
#define NULL
Definition: host.h:144
ScrollView * CreateFeatureSpaceWindow(const char *name, int xpos, int ypos)
Definition: intproto.cpp:1936
SVMenuNode * AddChild(const char *txt)
Definition: svmnode.cpp:59
void InitProtoDisplayWindowIfReqd ( )

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

Definition at line 1916 of file intproto.cpp.

1916  {
1917  if (ProtoDisplayWindow == NULL) {
1918  ProtoDisplayWindow = CreateFeatureSpaceWindow("ProtoDisplayWindow",
1919  550, 200);
1920  }
1921 }
ScrollView * ProtoDisplayWindow
Definition: intproto.cpp:183
#define NULL
Definition: host.h:144
ScrollView * CreateFeatureSpaceWindow(const char *name, int xpos, int ypos)
Definition: intproto.cpp:1936
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 1607 of file intproto.cpp.

1613 {
1614  FLOAT32 Angle;
1615  FLOAT32 X, Y, HalfLength;
1616  FLOAT32 Cos, Sin;
1617  FLOAT32 XAdjust, YAdjust;
1618  FPOINT Start, Switch1, Switch2, End;
1619  int S1 = 0;
1620  int S2 = 1;
1621 
1622  Angle = Proto->Angle;
1623  X = Proto->X;
1624  Y = Proto->Y;
1625  HalfLength = Proto->Length / 2.0;
1626 
1627  Filler->AngleStart = CircBucketFor(Angle - AnglePad, AS, NB);
1628  Filler->AngleEnd = CircBucketFor(Angle + AnglePad, AS, NB);
1629  Filler->NextSwitch = 0;
1630 
1631  if (fabs (Angle - 0.0) < HV_TOLERANCE || fabs (Angle - 0.5) < HV_TOLERANCE) {
1632  /* horizontal proto - handle as special case */
1633  Filler->X = Bucket8For(X - HalfLength - EndPad, XS, NB);
1634  Filler->YStart = Bucket16For(Y - SidePad, YS, NB * 256);
1635  Filler->YEnd = Bucket16For(Y + SidePad, YS, NB * 256);
1636  Filler->StartDelta = 0;
1637  Filler->EndDelta = 0;
1638  Filler->Switch[0].Type = LastSwitch;
1639  Filler->Switch[0].X = Bucket8For(X + HalfLength + EndPad, XS, NB);
1640  } else if (fabs(Angle - 0.25) < HV_TOLERANCE ||
1641  fabs(Angle - 0.75) < HV_TOLERANCE) {
1642  /* vertical proto - handle as special case */
1643  Filler->X = Bucket8For(X - SidePad, XS, NB);
1644  Filler->YStart = Bucket16For(Y - HalfLength - EndPad, YS, NB * 256);
1645  Filler->YEnd = Bucket16For(Y + HalfLength + EndPad, YS, NB * 256);
1646  Filler->StartDelta = 0;
1647  Filler->EndDelta = 0;
1648  Filler->Switch[0].Type = LastSwitch;
1649  Filler->Switch[0].X = Bucket8For(X + SidePad, XS, NB);
1650  } else {
1651  /* diagonal proto */
1652 
1653  if ((Angle > 0.0 && Angle < 0.25) || (Angle > 0.5 && Angle < 0.75)) {
1654  /* rising diagonal proto */
1655  Angle *= 2.0 * PI;
1656  Cos = fabs(cos(Angle));
1657  Sin = fabs(sin(Angle));
1658 
1659  /* compute the positions of the corners of the acceptance region */
1660  Start.x = X - (HalfLength + EndPad) * Cos - SidePad * Sin;
1661  Start.y = Y - (HalfLength + EndPad) * Sin + SidePad * Cos;
1662  End.x = 2.0 * X - Start.x;
1663  End.y = 2.0 * Y - Start.y;
1664  Switch1.x = X - (HalfLength + EndPad) * Cos + SidePad * Sin;
1665  Switch1.y = Y - (HalfLength + EndPad) * Sin - SidePad * Cos;
1666  Switch2.x = 2.0 * X - Switch1.x;
1667  Switch2.y = 2.0 * Y - Switch1.y;
1668 
1669  if (Switch1.x > Switch2.x) {
1670  S1 = 1;
1671  S2 = 0;
1672  }
1673 
1674  /* translate into bucket positions and deltas */
1675  Filler->X = Bucket8For(Start.x, XS, NB);
1676  Filler->StartDelta = -(inT16) ((Cos / Sin) * 256);
1677  Filler->EndDelta = (inT16) ((Sin / Cos) * 256);
1678 
1679  XAdjust = BucketEnd(Filler->X, XS, NB) - Start.x;
1680  YAdjust = XAdjust * Cos / Sin;
1681  Filler->YStart = Bucket16For(Start.y - YAdjust, YS, NB * 256);
1682  YAdjust = XAdjust * Sin / Cos;
1683  Filler->YEnd = Bucket16For(Start.y + YAdjust, YS, NB * 256);
1684 
1685  Filler->Switch[S1].Type = StartSwitch;
1686  Filler->Switch[S1].X = Bucket8For(Switch1.x, XS, NB);
1687  Filler->Switch[S1].Y = Bucket8For(Switch1.y, YS, NB);
1688  XAdjust = Switch1.x - BucketStart(Filler->Switch[S1].X, XS, NB);
1689  YAdjust = XAdjust * Sin / Cos;
1690  Filler->Switch[S1].YInit = Bucket16For(Switch1.y - YAdjust, YS, NB * 256);
1691  Filler->Switch[S1].Delta = Filler->EndDelta;
1692 
1693  Filler->Switch[S2].Type = EndSwitch;
1694  Filler->Switch[S2].X = Bucket8For(Switch2.x, XS, NB);
1695  Filler->Switch[S2].Y = Bucket8For(Switch2.y, YS, NB);
1696  XAdjust = Switch2.x - BucketStart(Filler->Switch[S2].X, XS, NB);
1697  YAdjust = XAdjust * Cos / Sin;
1698  Filler->Switch[S2].YInit = Bucket16For(Switch2.y + YAdjust, YS, NB * 256);
1699  Filler->Switch[S2].Delta = Filler->StartDelta;
1700 
1701  Filler->Switch[2].Type = LastSwitch;
1702  Filler->Switch[2].X = Bucket8For(End.x, XS, NB);
1703  } else {
1704  /* falling diagonal proto */
1705  Angle *= 2.0 * PI;
1706  Cos = fabs(cos(Angle));
1707  Sin = fabs(sin(Angle));
1708 
1709  /* compute the positions of the corners of the acceptance region */
1710  Start.x = X - (HalfLength + EndPad) * Cos - SidePad * Sin;
1711  Start.y = Y + (HalfLength + EndPad) * Sin - SidePad * Cos;
1712  End.x = 2.0 * X - Start.x;
1713  End.y = 2.0 * Y - Start.y;
1714  Switch1.x = X - (HalfLength + EndPad) * Cos + SidePad * Sin;
1715  Switch1.y = Y + (HalfLength + EndPad) * Sin + SidePad * Cos;
1716  Switch2.x = 2.0 * X - Switch1.x;
1717  Switch2.y = 2.0 * Y - Switch1.y;
1718 
1719  if (Switch1.x > Switch2.x) {
1720  S1 = 1;
1721  S2 = 0;
1722  }
1723 
1724  /* translate into bucket positions and deltas */
1725  Filler->X = Bucket8For(Start.x, XS, NB);
1726  Filler->StartDelta = -(inT16) ((Sin / Cos) * 256);
1727  Filler->EndDelta = (inT16) ((Cos / Sin) * 256);
1728 
1729  XAdjust = BucketEnd(Filler->X, XS, NB) - Start.x;
1730  YAdjust = XAdjust * Sin / Cos;
1731  Filler->YStart = Bucket16For(Start.y - YAdjust, YS, NB * 256);
1732  YAdjust = XAdjust * Cos / Sin;
1733  Filler->YEnd = Bucket16For(Start.y + YAdjust, YS, NB * 256);
1734 
1735  Filler->Switch[S1].Type = EndSwitch;
1736  Filler->Switch[S1].X = Bucket8For(Switch1.x, XS, NB);
1737  Filler->Switch[S1].Y = Bucket8For(Switch1.y, YS, NB);
1738  XAdjust = Switch1.x - BucketStart(Filler->Switch[S1].X, XS, NB);
1739  YAdjust = XAdjust * Sin / Cos;
1740  Filler->Switch[S1].YInit = Bucket16For(Switch1.y + YAdjust, YS, NB * 256);
1741  Filler->Switch[S1].Delta = Filler->StartDelta;
1742 
1743  Filler->Switch[S2].Type = StartSwitch;
1744  Filler->Switch[S2].X = Bucket8For(Switch2.x, XS, NB);
1745  Filler->Switch[S2].Y = Bucket8For(Switch2.y, YS, NB);
1746  XAdjust = Switch2.x - BucketStart(Filler->Switch[S2].X, XS, NB);
1747  YAdjust = XAdjust * Cos / Sin;
1748  Filler->Switch[S2].YInit = Bucket16For(Switch2.y - YAdjust, YS, NB * 256);
1749  Filler->Switch[S2].Delta = Filler->EndDelta;
1750 
1751  Filler->Switch[2].Type = LastSwitch;
1752  Filler->Switch[2].X = Bucket8For(End.x, XS, NB);
1753  }
1754  }
1755 } /* InitTableFiller */
uinT16 Bucket16For(FLOAT32 param, FLOAT32 offset, int num_buckets)
Definition: intproto.cpp:445
#define XS
FLOAT32 BucketEnd(int Bucket, FLOAT32 Offset, int NumBuckets)
Definition: intproto.cpp:1235
float FLOAT32
Definition: host.h:111
uinT8 Bucket8For(FLOAT32 param, FLOAT32 offset, int num_buckets)
Definition: intproto.cpp:441
inT16 YStart
Definition: intproto.cpp:94
inT16 YEnd
Definition: intproto.cpp:94
FLOAT32 BucketStart(int Bucket, FLOAT32 Offset, int NumBuckets)
Definition: intproto.cpp:1216
#define HV_TOLERANCE
Definition: intproto.cpp:71
Definition: fpoint.h:29
uinT8 AngleEnd
Definition: intproto.cpp:92
inT16 YInit
Definition: intproto.cpp:82
FLOAT32 X
Definition: protos.h:47
FLOAT32 Angle
Definition: protos.h:49
inT16 StartDelta
Definition: intproto.cpp:95
#define YS
#define AS
uinT8 CircBucketFor(FLOAT32 param, FLOAT32 offset, int num_buckets)
Definition: intproto.cpp:455
uinT8 AngleStart
Definition: intproto.cpp:92
inT16 EndDelta
Definition: intproto.cpp:95
FLOAT32 y
Definition: fpoint.h:31
uinT8 NextSwitch
Definition: intproto.cpp:91
SWITCH_TYPE Type
Definition: intproto.cpp:80
FLOAT32 Length
Definition: protos.h:50
inT16 Delta
Definition: intproto.cpp:83
#define PI
Definition: const.h:19
FILL_SWITCH Switch[MAX_NUM_SWITCHES]
Definition: intproto.cpp:96
#define NB
FLOAT32 x
Definition: fpoint.h:31
short inT16
Definition: host.h:100
FLOAT32 Y
Definition: protos.h:48
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 672 of file intproto.cpp.

672  {
673  INT_CLASS Class;
674  PROTO_SET ProtoSet;
675  int i;
676 
677  assert(MaxNumConfigs <= MAX_NUM_CONFIGS);
678 
679  Class = (INT_CLASS) Emalloc(sizeof(INT_CLASS_STRUCT));
680  Class->NumProtoSets = ((MaxNumProtos + PROTOS_PER_PROTO_SET - 1) /
682 
683  assert(Class->NumProtoSets <= MAX_NUM_PROTO_SETS);
684 
685  Class->NumProtos = 0;
686  Class->NumConfigs = 0;
687 
688  for (i = 0; i < Class->NumProtoSets; i++) {
689  /* allocate space for a proto set, install in class, and initialize */
690  ProtoSet = (PROTO_SET) Emalloc(sizeof(PROTO_SET_STRUCT));
691  memset(ProtoSet, 0, sizeof(*ProtoSet));
692  Class->ProtoSets[i] = ProtoSet;
693 
694  /* allocate space for the proto lengths and install in class */
695  }
696  if (MaxNumIntProtosIn (Class) > 0) {
697  Class->ProtoLengths =
698  (uinT8 *)Emalloc(MaxNumIntProtosIn (Class) * sizeof (uinT8));
699  memset(Class->ProtoLengths, 0,
700  MaxNumIntProtosIn(Class) * sizeof(*Class->ProtoLengths));
701  } else {
702  Class->ProtoLengths = NULL;
703  }
704  memset(Class->ConfigLengths, 0, sizeof(Class->ConfigLengths));
705 
706  return (Class);
707 
708 } /* NewIntClass */
#define MaxNumIntProtosIn(C)
Definition: intproto.h:168
#define MAX_NUM_CONFIGS
Definition: intproto.h:46
struct INT_CLASS_STRUCT * INT_CLASS
uinT16 ConfigLengths[MAX_NUM_CONFIGS]
Definition: intproto.h:113
PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS]
Definition: intproto.h:111
#define MAX_NUM_PROTO_SETS
Definition: intproto.h:49
void * Emalloc(int Size)
Definition: emalloc.cpp:47
uinT8 NumProtoSets
Definition: intproto.h:109
#define PROTOS_PER_PROTO_SET
Definition: intproto.h:48
uinT8 NumConfigs
Definition: intproto.h:110
#define NULL
Definition: host.h:144
uinT8 * ProtoLengths
Definition: intproto.h:112
uinT16 NumProtos
Definition: intproto.h:108
struct PROTO_SET_STRUCT * PROTO_SET
unsigned char uinT8
Definition: host.h:99
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 732 of file intproto.cpp.

732  {
733  INT_TEMPLATES T;
734  int i;
735 
736  T = (INT_TEMPLATES) Emalloc (sizeof (INT_TEMPLATES_STRUCT));
737  T->NumClasses = 0;
738  T->NumClassPruners = 0;
739 
740  for (i = 0; i < MAX_NUM_CLASSES; i++)
741  ClassForClassId (T, i) = NULL;
742 
743  return (T);
744 } /* NewIntTemplates */
#define MAX_NUM_CLASSES
Definition: matchdefs.h:31
void * Emalloc(int Size)
Definition: emalloc.cpp:47
struct INT_TEMPLATES_STRUCT * INT_TEMPLATES
#define ClassForClassId(T, c)
Definition: intproto.h:181
#define NULL
Definition: host.h:144
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 1770 of file intproto.cpp.

1771  {
1772  FLOAT32 X, Y, Dx, Dy, Length;
1773 
1774  window->Pen(color);
1775  assert(Feature != NULL);
1776  assert(color != 0);
1777 
1778  X = Feature->X;
1779  Y = Feature->Y;
1780  Length = GetPicoFeatureLength() * 0.7 * INT_CHAR_NORM_RANGE;
1781  // The -PI has no significant effect here, but the value of Theta is computed
1782  // using BinaryAnglePlusPi in intfx.cpp.
1783  Dx = (Length / 2.0) * cos((Feature->Theta / 256.0) * 2.0 * PI - PI);
1784  Dy = (Length / 2.0) * sin((Feature->Theta / 256.0) * 2.0 * PI - PI);
1785 
1786  window->SetCursor(X, Y);
1787  window->DrawTo(X + Dx, Y + Dy);
1788 } /* RenderIntFeature */
void Pen(Color color)
Definition: scrollview.cpp:726
#define INT_CHAR_NORM_RANGE
Definition: intproto.h:133
float FLOAT32
Definition: host.h:111
void DrawTo(int x, int y)
Definition: scrollview.cpp:531
void SetCursor(int x, int y)
Definition: scrollview.cpp:525
#define GetPicoFeatureLength()
Definition: picofeat.h:59
#define PI
Definition: const.h:19
#define NULL
Definition: host.h:144
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 1807 of file intproto.cpp.

1810  {
1811  PROTO_SET ProtoSet;
1812  INT_PROTO Proto;
1813  int ProtoSetIndex;
1814  int ProtoWordIndex;
1815  FLOAT32 Length;
1816  int Xmin, Xmax, Ymin, Ymax;
1817  FLOAT32 X, Y, Dx, Dy;
1818  uinT32 ProtoMask;
1819  int Bucket;
1820 
1821  assert(ProtoId >= 0);
1822  assert(Class != NULL);
1823  assert(ProtoId < Class->NumProtos);
1824  assert(color != 0);
1825  window->Pen(color);
1826 
1827  ProtoSet = Class->ProtoSets[SetForProto(ProtoId)];
1828  ProtoSetIndex = IndexForProto(ProtoId);
1829  Proto = &(ProtoSet->Protos[ProtoSetIndex]);
1830  Length = (Class->ProtoLengths[ProtoId] *
1832  ProtoMask = PPrunerMaskFor(ProtoId);
1833  ProtoWordIndex = PPrunerWordIndexFor(ProtoId);
1834 
1835  // find the x and y extent of the proto from the proto pruning table
1836  Xmin = Ymin = NUM_PP_BUCKETS;
1837  Xmax = Ymax = 0;
1838  for (Bucket = 0; Bucket < NUM_PP_BUCKETS; Bucket++) {
1839  if (ProtoMask & ProtoSet->ProtoPruner[PRUNER_X][Bucket][ProtoWordIndex]) {
1840  UpdateRange(Bucket, &Xmin, &Xmax);
1841  }
1842 
1843  if (ProtoMask & ProtoSet->ProtoPruner[PRUNER_Y][Bucket][ProtoWordIndex]) {
1844  UpdateRange(Bucket, &Ymin, &Ymax);
1845  }
1846  }
1847  X = (Xmin + Xmax + 1) / 2.0 * PROTO_PRUNER_SCALE;
1848  Y = (Ymin + Ymax + 1) / 2.0 * PROTO_PRUNER_SCALE;
1849  // The -PI has no significant effect here, but the value of Theta is computed
1850  // using BinaryAnglePlusPi in intfx.cpp.
1851  Dx = (Length / 2.0) * cos((Proto->Angle / 256.0) * 2.0 * PI - PI);
1852  Dy = (Length / 2.0) * sin((Proto->Angle / 256.0) * 2.0 * PI - PI);
1853 
1854  window->SetCursor(X - Dx, Y - Dy);
1855  window->DrawTo(X + Dx, Y + Dy);
1856 } /* RenderIntProto */
#define PPrunerMaskFor(I)
Definition: intproto.h:176
void Pen(Color color)
Definition: scrollview.cpp:726
#define INT_CHAR_NORM_RANGE
Definition: intproto.h:133
float FLOAT32
Definition: host.h:111
INT_PROTO_STRUCT Protos[PROTOS_PER_PROTO_SET]
Definition: intproto.h:97
#define IndexForProto(P)
Definition: intproto.h:170
void DrawTo(int x, int y)
Definition: scrollview.cpp:531
void UpdateRange(const T1 &x, T2 *lower_bound, T2 *upper_bound)
Definition: helpers.h:125
#define PRUNER_Y
Definition: intproto.h:35
PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS]
Definition: intproto.h:111
unsigned int uinT32
Definition: host.h:103
void SetCursor(int x, int y)
Definition: scrollview.cpp:525
#define SetForProto(P)
Definition: intproto.h:169
#define GetPicoFeatureLength()
Definition: picofeat.h:59
#define PRUNER_X
Definition: intproto.h:34
#define PPrunerWordIndexFor(I)
Definition: intproto.h:173
#define NUM_PP_BUCKETS
Definition: intproto.h:51
#define PROTO_PRUNER_SCALE
Definition: intproto.cpp:54
PROTO_PRUNER ProtoPruner
Definition: intproto.h:96
#define PI
Definition: const.h:19
#define NULL
Definition: host.h:144
uinT8 * ProtoLengths
Definition: intproto.h:112
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 1874 of file intproto.cpp.

1874  {
1875  if (Param < Min) {
1876  if (Id)
1877  cprintf("Warning: Param %s truncated from %f to %d!\n",
1878  Id, Param, Min);
1879  Param = Min;
1880  } else if (Param > Max) {
1881  if (Id)
1882  cprintf("Warning: Param %s truncated from %f to %d!\n",
1883  Id, Param, Max);
1884  Param = Max;
1885  }
1886  return static_cast<int>(floor(Param));
1887 } /* TruncateParam */
void cprintf(const char *format,...)
Definition: callcpp.cpp:40
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 473 of file intproto.cpp.

473  {
474  if (IntMatchWindow != NULL)
476 } /* ClearMatchDisplay */
static void Update()
Definition: scrollview.cpp:715
ScrollView * IntMatchWindow
Definition: intproto.cpp:181
#define NULL
Definition: host.h:144

Variable Documentation

double classify_cp_angle_pad_loose = 45.0

"Class Pruner Angle Pad Loose"

Definition at line 192 of file intproto.cpp.

double classify_cp_angle_pad_medium = 20.0

"Class Pruner Angle Pad Medium"

Definition at line 194 of file intproto.cpp.

double classify_cp_angle_pad_tight = 10.0

"CLass Pruner Angle Pad Tight"

Definition at line 196 of file intproto.cpp.

double classify_cp_end_pad_loose = 0.5

"Class Pruner End Pad Loose"

Definition at line 197 of file intproto.cpp.

double classify_cp_end_pad_medium = 0.5

"Class Pruner End Pad Medium"

Definition at line 198 of file intproto.cpp.

double classify_cp_end_pad_tight = 0.5

"Class Pruner End Pad Tight"

Definition at line 199 of file intproto.cpp.

double classify_cp_side_pad_loose = 2.5

"Class Pruner Side Pad Loose"

Definition at line 200 of file intproto.cpp.

double classify_cp_side_pad_medium = 1.2

"Class Pruner Side Pad Medium"

Definition at line 201 of file intproto.cpp.

double classify_cp_side_pad_tight = 0.6

"Class Pruner Side Pad Tight"

Definition at line 202 of file intproto.cpp.

int classify_num_cp_levels = 3

"Number of Class Pruner Levels"

Definition at line 190 of file intproto.cpp.

double classify_pp_angle_pad = 45.0

"Proto Pruner Angle Pad"

Definition at line 203 of file intproto.cpp.

double classify_pp_end_pad = 0.5

"Proto Prune End Pad"

Definition at line 204 of file intproto.cpp.

double classify_pp_side_pad = 2.5

"Proto Pruner Side Pad"

Definition at line 205 of file intproto.cpp.

ScrollView* FeatureDisplayWindow = NULL

Definition at line 182 of file intproto.cpp.

ScrollView* IntMatchWindow = NULL

Definition at line 181 of file intproto.cpp.

ScrollView* ProtoDisplayWindow = NULL

Definition at line 183 of file intproto.cpp.