00001
00020 #ifndef WERD_H
00021 #define WERD_H
00022
00023 #include "varable.h"
00024 #include "bits16.h"
00025 #include "strngs.h"
00026 #include "blckerr.h"
00027 #include "stepblob.h"
00028 #include "polyblob.h"
00029
00030
00035 enum WERD_FLAGS
00036 {
00037 W_SEGMENTED,
00038 W_ITALIC,
00039 W_BOLD,
00040 W_BOL,
00041 W_EOL,
00042 W_NORMALIZED,
00043 W_POLYGON,
00044 W_LINEARC,
00045 W_DONT_CHOP,
00046 W_REP_CHAR,
00047 W_FUZZY_SP,
00048 W_FUZZY_NON,
00049 W_INVERSE
00050 };
00051
00056 enum DISPLAY_FLAGS
00057 {
00058 DF_BOX,
00059 DF_TEXT,
00060 DF_POLYGONAL,
00061 DF_EDGE_STEP,
00062 DF_BN_POLYGONAL
00063 };
00064
00065 class ROW;
00066
00071 class WERD:public ELIST_LINK
00072 {
00073 public:
00074 WERD() {
00075 }
00076 WERD(
00077 C_BLOB_LIST *blob_list,
00078 UINT8 blanks,
00079 const char *text);
00080 WERD(
00081 PBLOB_LIST *blob_list,
00082 UINT8 blanks,
00083 const char *text);
00084 WERD(
00085 PBLOB_LIST *blob_list,
00086 WERD *clone);
00087 WERD(
00088 C_BLOB_LIST *blob_list,
00089 WERD *clone);
00090 ~WERD () {
00091 if (flags.bit (W_POLYGON)) {
00092
00093 ((PBLOB_LIST *) & cblobs)->clear ();
00094
00095 ((PBLOB_LIST *) & rej_cblobs)->clear ();
00096 }
00097
00098
00099 }
00100
00101 WERD *poly_copy(
00102 float xheight);
00103 WERD *larc_copy(
00104 float xheight);
00105
00106
00107 C_BLOB_LIST *rej_cblob_list() {
00108 if (flags.bit (W_POLYGON))
00109 WRONG_WORD.error ("WERD::rej_cblob_list", ABORT, NULL);
00110 return &rej_cblobs;
00111 }
00112
00113
00114 PBLOB_LIST *rej_blob_list() {
00115 if (!flags.bit (W_POLYGON))
00116 WRONG_WORD.error ("WERD::rej_blob_list", ABORT, NULL);
00117 return (PBLOB_LIST *) (&rej_cblobs);
00118 }
00119
00120 C_BLOB_LIST *cblob_list() {
00121 if (flags.bit (W_POLYGON) || flags.bit (W_LINEARC))
00122 WRONG_WORD.error ("WERD::cblob_list", ABORT, NULL);
00123 return &cblobs;
00124 }
00125 PBLOB_LIST *blob_list() {
00126 if (!flags.bit (W_POLYGON))
00127 WRONG_WORD.error ("WERD::blob_list", ABORT, NULL);
00128
00129 return (PBLOB_LIST *) (&cblobs);
00130 }
00131
00132
00133
00134
00135
00136
00137 PBLOB_LIST *gblob_list() {
00138
00139 return (PBLOB_LIST *) (&cblobs);
00140 }
00141
00142 const char *text() const {
00143 return correct.string ();
00144 }
00145 UINT8 space() {
00146 return blanks;
00147 }
00148 void set_blanks(
00149 UINT8 new_blanks) {
00150 blanks = new_blanks;
00151 }
00152
00153 void set_text(
00154 const char *new_text) {
00155 correct = new_text;
00156 }
00157
00158 BOX bounding_box();
00159
00160 BOOL8 flag(
00161 WERD_FLAGS mask) const {
00162 return flags.bit (mask);
00163 }
00164 void set_flag(
00165 WERD_FLAGS mask,
00166 BOOL8 value) {
00167 flags.set_bit (mask, value);
00168 }
00169
00170 BOOL8 display_flag(
00171 UINT8 flag) const {
00172 return disp_flags.bit (flag);
00173 }
00174
00175 void set_display_flag(
00176 UINT8 flag,
00177 BOOL8 value) {
00178 disp_flags.set_bit (flag, value);
00179 }
00180
00181 WERD *shallow_copy();
00182
00183 void move(
00184 const ICOORD vec);
00185
00186 void scale(
00187 const float vec);
00188
00189 void join_on(
00190 WERD *&other);
00191
00192 void copy_on(
00193 WERD *&other);
00194
00195 void baseline_normalise (
00196
00197 ROW * row, DENORM * denorm = NULL);
00198
00199 void baseline_normalise_x (
00200 ROW * row, float x_height,
00201 DENORM * denorm = NULL);
00202
00203 void baseline_denormalise(
00204 const DENORM *denorm);
00205
00206 void print(
00207 FILE *fp);
00208
00209 void plot (
00210 WINDOW window,
00211
00212 COLOUR colour, BOOL8 solid = FALSE);
00213
00214 void plot (
00215
00216 WINDOW window, BOOL8 solid = FALSE);
00217
00218 void plot_rej_blobs (
00219
00220 WINDOW window, BOOL8 solid = FALSE);
00221
00222 WERD & operator= (
00223 const WERD & source);
00224
00225 void prep_serialise() {
00226 correct.prep_serialise ();
00227 if (flags.bit (W_POLYGON))
00228 ((PBLOB_LIST *) (&cblobs))->prep_serialise ();
00229
00230
00231 else
00232 cblobs.prep_serialise ();
00233 rej_cblobs.prep_serialise ();
00234 }
00235
00236 void dump(
00237 FILE *f) {
00238 correct.dump (f);
00239 if (flags.bit (W_POLYGON))
00240 ((PBLOB_LIST *) (&cblobs))->dump (f);
00241
00242
00243 else
00244 cblobs.dump (f);
00245 rej_cblobs.dump (f);
00246 }
00247
00248 void de_dump(
00249 FILE *f) {
00250 correct.de_dump (f);
00251 if (flags.bit (W_POLYGON))
00252 ((PBLOB_LIST *) (&cblobs))->de_dump (f);
00253
00254
00255 else
00256 cblobs.de_dump (f);
00257 rej_cblobs.de_dump (f);
00258 }
00259
00260 make_serialise (WERD) private:
00261 UINT8 blanks;
00262 UINT8 dummy;
00263 BITS16 flags;
00264 BITS16 disp_flags;
00265 INT16 dummy2;
00266 STRING correct;
00267 C_BLOB_LIST cblobs;
00268 C_BLOB_LIST rej_cblobs;
00269 };
00270
00271 ELISTIZEH_S (WERD)
00272 #include "ocrrow.h" //placed here due to
00273
00275 extern BOOL_VAR_H (bln_numericmode, 0, "Optimize for numbers");
00276 extern INT_VAR_H (bln_x_height, 128, "Baseline Normalisation X-height");
00277 extern INT_VAR_H (bln_baseline_offset, 64,
00278 "Baseline Norm. offset of baseline");
00280
00281
00282
00283
00284
00285
00286
00287 int word_comparator(
00288 const void *word1p,
00289 const void *word2p
00290 );
00291 #endif