00001
00020
00021
00022
00023 #include "matchtab.h"
00024 #include "freelist.h"
00025 #include "callcpp.h"
00026 #include "blobs.h"
00027
00028
00029
00030
00036 typedef struct _MATCH_
00037 {
00038 int topleft;
00039 int botright;
00040 LIST rating;
00041 } MATCH;
00042
00043
00044
00045
00049 MATCH *match_table;
00050
00051
00052
00053
00054
00058 #define NUM_MATCH_ENTRIES 500
00059
00060
00066 #define blank_entry(match_table,x) \
00067 (! (match_table[x].topleft | match_table[x].botright))
00068
00069
00070
00071
00072
00076 static int been_initialized = 0;
00077 void init_match_table() {
00078 int x;
00079
00080 if (been_initialized) {
00081
00082 for (x = 0; x < NUM_MATCH_ENTRIES; x++) {
00083 if ((!blank_entry (match_table, x)) && match_table[x].rating)
00084 destroy_nodes (match_table[x].rating, free_choice);
00085 }
00086 }
00087 else {
00088
00089 been_initialized = 1;
00090 match_table = (MATCH *) memalloc (sizeof (MATCH) * NUM_MATCH_ENTRIES);
00091 }
00092
00093 for (x = 0; x < NUM_MATCH_ENTRIES; x++) {
00094 match_table[x].topleft = 0;
00095 match_table[x].botright = 0;
00096 match_table[x].rating = NULL;
00097 }
00098 }
00099
00100 void end_match_table() {
00101 if (been_initialized) {
00102 init_match_table();
00103 memfree(match_table);
00104 match_table = NULL;
00105 been_initialized = 0;
00106 }
00107 }
00108
00109
00110
00114 void put_match(TBLOB *blob, CHOICES ratings) {
00115 unsigned int topleft;
00116 unsigned int botright;
00117 unsigned int start;
00118 TPOINT tp_topleft;
00119 TPOINT tp_botright;
00120 int x;
00121
00122 blob_bounding_box(blob, &tp_topleft, &tp_botright);
00123 topleft = *(unsigned int *) &tp_topleft;
00124 botright = *(unsigned int *) &tp_botright;
00125 start = (topleft * botright) % NUM_MATCH_ENTRIES;
00126
00127
00128 x = start;
00129 do {
00130 if (blank_entry (match_table, x)) {
00131
00132 match_table[x].topleft = topleft;
00133 match_table[x].botright = botright;
00134 match_table[x].rating = copy_choices (ratings);
00135 return;
00136 }
00137 if (++x >= NUM_MATCH_ENTRIES)
00138 x = 0;
00139 }
00140 while (x != start);
00141
00142 cprintf ("error: Match table is full\n");
00143 }
00144
00145
00146
00153 CHOICES get_match(TBLOB *blob) {
00154 unsigned int topleft;
00155 unsigned int botright;
00156 TPOINT tp_topleft;
00157 TPOINT tp_botright;
00158
00159 blob_bounding_box(blob, &tp_topleft, &tp_botright);
00160 topleft = *(unsigned int *) &tp_topleft;
00161 botright = *(unsigned int *) &tp_botright;
00162 return (get_match_by_bounds (topleft, botright));
00163 }
00164
00165
00166
00173 CHOICES get_match_by_bounds(unsigned int topleft, unsigned int botright) {
00174 unsigned int start;
00175 int x;
00176
00177 start = (topleft * botright) % NUM_MATCH_ENTRIES;
00178
00179 x = start;
00180 do {
00181
00182 if (blank_entry (match_table, x))
00183 break;
00184
00185 if (match_table[x].topleft == topleft &&
00186 match_table[x].botright == botright) {
00187 return (copy_choices (match_table[x].rating));
00188 }
00189 if (++x >= NUM_MATCH_ENTRIES)
00190 x = 0;
00191 }
00192 while (x != start);
00193
00194 return (NIL);
00195 }