00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef INTPROTO_H
00019 #define INTPROTO_H
00020
00024 #include "matchdefs.h"
00025 #include "protos.h"
00026 #include "callcpp.h"
00027 #include "unicharset.h"
00028
00029
00030 #define PRUNER_X 0
00031 #define PRUNER_Y 1
00032 #define PRUNER_ANGLE 2
00033
00034
00035 #define ANGLE_SHIFT (0.0)
00036 #define X_SHIFT (0.5)
00037 #define Y_SHIFT (0.5)
00038
00039 #define MAX_PROTO_INDEX 24
00040 #define BITS_PER_WERD (8 * sizeof (uinT32))
00041
00042 #define MAX_NUM_CONFIGS 64
00043 #define MAX_NUM_PROTOS 512
00044 #define PROTOS_PER_PROTO_SET 64
00045 #define MAX_NUM_PROTO_SETS (MAX_NUM_PROTOS / PROTOS_PER_PROTO_SET)
00046 #define NUM_PP_PARAMS 3
00047 #define NUM_PP_BUCKETS 64
00048 #define NUM_CP_BUCKETS 24
00049 #define CLASSES_PER_CP 32
00050 #define NUM_BITS_PER_CLASS 2
00051 #define CLASSES_PER_CP_WERD (CLASSES_PER_CP / NUM_BITS_PER_CLASS)
00052 #define PROTOS_PER_PP_WERD BITS_PER_WERD
00053 #define BITS_PER_CP_VECTOR (CLASSES_PER_CP * NUM_BITS_PER_CLASS)
00054 #define MAX_NUM_CLASS_PRUNERS ((MAX_NUM_CLASSES + CLASSES_PER_CP - 1) / \
00055 CLASSES_PER_CP)
00056 #define WERDS_PER_CP_VECTOR (BITS_PER_CP_VECTOR / BITS_PER_WERD)
00057 #define WERDS_PER_PP_VECTOR ((PROTOS_PER_PROTO_SET+BITS_PER_WERD-1)/ \
00058 BITS_PER_WERD)
00059 #define WERDS_PER_PP (NUM_PP_PARAMS * NUM_PP_BUCKETS * \
00060 WERDS_PER_PP_VECTOR)
00061 #define WERDS_PER_CP (NUM_CP_BUCKETS * NUM_CP_BUCKETS * \
00062 NUM_CP_BUCKETS * WERDS_PER_CP_VECTOR)
00063 #define WERDS_PER_CONFIG_VEC ((MAX_NUM_CONFIGS + BITS_PER_WERD - 1) / \
00064 BITS_PER_WERD)
00065
00066
00067
00068
00069
00070
00071 typedef uinT32 CLASS_PRUNER_STRUCT
00072 [NUM_CP_BUCKETS][NUM_CP_BUCKETS][NUM_CP_BUCKETS][WERDS_PER_CP_VECTOR];
00073
00074 typedef
00075 uinT32 (*CLASS_PRUNER)[NUM_CP_BUCKETS][NUM_CP_BUCKETS][WERDS_PER_CP_VECTOR];
00076
00077 typedef struct
00078 {
00079 inT8 A;
00080 uinT8 B;
00081 inT8 C;
00082 uinT8 Angle;
00083 uinT32 Configs[WERDS_PER_CONFIG_VEC];
00084 }
00085
00086
00087 INT_PROTO_STRUCT, *INT_PROTO;
00088
00089 typedef uinT32 PROTO_PRUNER[NUM_PP_PARAMS][NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR];
00090
00091 typedef struct
00092 {
00093 PROTO_PRUNER ProtoPruner;
00094 INT_PROTO_STRUCT Protos[PROTOS_PER_PROTO_SET];
00095 }
00096
00097
00098 PROTO_SET_STRUCT, *PROTO_SET;
00099
00100 typedef uinT32 CONFIG_PRUNER[NUM_PP_PARAMS][NUM_PP_BUCKETS][4];
00101
00102
00103
00104
00105
00106 struct FontInfo {
00107 char* name;
00108 uinT32 properties;
00109 bool is_italic() { return properties & 1; }
00110 bool is_bold() { return (properties & 2) != 0; }
00111 bool is_fixed_pitch() { return (properties & 4) != 0; }
00112 bool is_serif() { return (properties & 8) != 0; }
00113 bool is_fraktur() { return (properties & 16) != 0; }
00114 };
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 struct FontSet {
00126 int size;
00127 int* configs;
00128 };
00129
00130
00131 typedef struct
00132 {
00133 uinT16 NumProtos;
00134 uinT8 NumProtoSets;
00135 uinT8 NumConfigs;
00136 PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS];
00137 uinT8 *ProtoLengths;
00138 uinT16 ConfigLengths[MAX_NUM_CONFIGS];
00139 int font_set_id;
00140 }
00141
00142
00143 INT_CLASS_STRUCT, *INT_CLASS;
00144
00145 typedef struct
00146 {
00147 int NumClasses;
00148 int NumClassPruners;
00149 INT_CLASS Class[MAX_NUM_CLASSES];
00150 CLASS_PRUNER ClassPruner[MAX_NUM_CLASS_PRUNERS];
00151 }
00152
00153
00154 INT_TEMPLATES_STRUCT, *INT_TEMPLATES;
00155
00156
00157 #define MAX_NUM_INT_FEATURES 512
00158 #define INT_CHAR_NORM_RANGE 256
00159
00160 struct INT_FEATURE_STRUCT
00161 {
00162 uinT8 X;
00163 uinT8 Y;
00164 uinT8 Theta;
00165 inT8 CP_misses;
00166 };
00167
00168 typedef INT_FEATURE_STRUCT *INT_FEATURE;
00169
00170 typedef INT_FEATURE_STRUCT INT_FEATURE_ARRAY[MAX_NUM_INT_FEATURES];
00171
00172 enum IntmatcherDebugAction {
00173 IDA_ADAPTIVE,
00174 IDA_STATIC,
00175 IDA_BOTH
00176 };
00177
00182 #define MaxNumIntProtosIn(C) (C->NumProtoSets * PROTOS_PER_PROTO_SET)
00183 #define SetForProto(P) (P / PROTOS_PER_PROTO_SET)
00184 #define IndexForProto(P) (P % PROTOS_PER_PROTO_SET)
00185 #define ProtoForProtoId(C,P) (&((C->ProtoSets[SetForProto (P)])-> \
00186 Protos [IndexForProto (P)]))
00187 #define PPrunerWordIndexFor(I) (((I) % PROTOS_PER_PROTO_SET) / \
00188 PROTOS_PER_PP_WERD)
00189 #define PPrunerBitIndexFor(I) ((I) % PROTOS_PER_PP_WERD)
00190 #define PPrunerMaskFor(I) (1 << PPrunerBitIndexFor (I))
00191
00192 #define MaxNumClassesIn(T) (T->NumClassPruners * CLASSES_PER_CP)
00193 #define LegalClassId(c) ((c) >= 0 && (c) <= MAX_CLASS_ID)
00194 #define UnusedClassIdIn(T,c) ((T)->Class[c] == NULL)
00195 #define ClassForClassId(T,c) ((T)->Class[c])
00196 #define ClassPrunersFor(T) ((T)->ClassPruner)
00197 #define CPrunerIdFor(c) ((c) / CLASSES_PER_CP)
00198 #define CPrunerFor(T,c) ((T)->ClassPruner [CPrunerIdFor (c)])
00199 #define CPrunerWordIndexFor(c) (((c) % CLASSES_PER_CP) / CLASSES_PER_CP_WERD)
00200 #define CPrunerBitIndexFor(c) (((c) % CLASSES_PER_CP) % CLASSES_PER_CP_WERD)
00201 #define CPrunerMaskFor(L,c) (((L)+1) << CPrunerBitIndexFor (c) * NUM_BITS_PER_CLASS)
00202
00203
00204 #define PRINT_MATCH_SUMMARY 0x001
00205 #define DISPLAY_FEATURE_MATCHES 0x002
00206 #define DISPLAY_PROTO_MATCHES 0x004
00207 #define PRINT_FEATURE_MATCHES 0x008
00208 #define PRINT_PROTO_MATCHES 0x010
00209 #define CLIP_MATCH_EVIDENCE 0x020
00210
00211 #define MatchDebuggingOn(D) (D)
00212 #define PrintMatchSummaryOn(D) ((D) & PRINT_MATCH_SUMMARY)
00213 #define DisplayFeatureMatchesOn(D) ((D) & DISPLAY_FEATURE_MATCHES)
00214 #define DisplayProtoMatchesOn(D) ((D) & DISPLAY_PROTO_MATCHES)
00215 #define PrintFeatureMatchesOn(D) ((D) & PRINT_FEATURE_MATCHES)
00216 #define PrintProtoMatchesOn(D) ((D) & PRINT_PROTO_MATCHES)
00217 #define ClipMatchEvidenceOn(D) ((D) & CLIP_MATCH_EVIDENCE)
00218
00222 void AddIntClass(INT_TEMPLATES Templates, CLASS_ID ClassId, INT_CLASS Class);
00223
00224 int AddIntConfig(INT_CLASS Class);
00225
00226 int AddIntProto(INT_CLASS Class);
00227
00228 void AddProtoToClassPruner(PROTO Proto,
00229 CLASS_ID ClassId,
00230 INT_TEMPLATES Templates);
00231
00232 void AddProtoToProtoPruner(PROTO Proto, int ProtoId, INT_CLASS Class);
00233
00234 int BucketFor(FLOAT32 Param, FLOAT32 Offset, int NumBuckets);
00235
00236 int CircBucketFor(FLOAT32 Param, FLOAT32 Offset, int NumBuckets);
00237
00238 void UpdateMatchDisplay();
00239
00240 void ConvertConfig(BIT_VECTOR Config, int ConfigId, INT_CLASS Class);
00241
00242 void ConvertProto(PROTO Proto, int ProtoId, INT_CLASS Class);
00243
00244 void DisplayIntFeature(INT_FEATURE Feature, FLOAT32 Evidence);
00245
00246 void DisplayIntProto(INT_CLASS Class, PROTO_ID ProtoId, FLOAT32 Evidence);
00247
00248 INT_CLASS NewIntClass(int MaxNumProtos, int MaxNumConfigs);
00249
00250 INT_TEMPLATES NewIntTemplates();
00251
00252 void free_int_templates(INT_TEMPLATES templates);
00253
00254 void ShowMatchDisplay();
00255
00256
00257
00258 void InitIntMatchWindowIfReqd();
00259
00260 void InitProtoDisplayWindowIfReqd();
00261
00262 void InitFeatureDisplayWindowIfReqd();
00263
00264 #endif