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