Tesseract 3.02

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
adaptions.cpp
Go to the documentation of this file.
1 /**********************************************************************
2 * File: adaptions.cpp (Formerly adaptions.c)
3 * Description: Functions used to adapt to blobs already confidently
4 * identified
5 * Author: Chris Newton
6 * Created: Thu Oct 7 10:17:28 BST 1993
7 *
8 * (C) Copyright 1992, Hewlett-Packard Ltd.
9 ** Licensed under the Apache License, Version 2.0 (the "License");
10 ** you may not use this file except in compliance with the License.
11 ** You may obtain a copy of the License at
12 ** http://www.apache.org/licenses/LICENSE-2.0
13 ** Unless required by applicable law or agreed to in writing, software
14 ** distributed under the License is distributed on an "AS IS" BASIS,
15 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 ** See the License for the specific language governing permissions and
17 ** limitations under the License.
18 *
19 **********************************************************************/
20
21 #ifdef _MSC_VER
22 #pragma warning(disable:4244) // Conversion warnings
23 #pragma warning(disable:4305) // int/float warnings
24 #endif
25
26 #include "mfcpch.h"
27
28 #ifdef __UNIX__
29 #include <assert.h>
30 #endif
31 #include <ctype.h>
32 #include <string.h>
33 #include "tessbox.h"
34 #include "tessvars.h"
35 #include "memry.h"
36 #include "imgs.h"
37 #include "scaleimg.h"
38 #include "reject.h"
39 #include "control.h"
40 #include "stopper.h"
41 #include "secname.h"
42 #include "tesseractclass.h"
43
44 // Include automatically generated configuration file if running autoconf.
45 #ifdef HAVE_CONFIG_H
46 #include "config_auto.h"
47 #endif
48
49 namespace tesseract {
50 BOOL8 Tesseract::word_adaptable( //should we adapt?
51 WERD_RES *word,
52 uinT16 mode) {
53 if (tessedit_adaption_debug) {
54 tprintf("Running word_adaptable() for %s rating %.4f certainty %.4f\n",
55 word->best_choice == NULL ? "" :
56 word->best_choice->unichar_string().string(),
57 word->best_choice->rating(), word->best_choice->certainty());
58 }
59
60 BOOL8 status = FALSE;
61 BITS16 flags(mode);
62
63 enum MODES
64 {
65 ADAPTABLE_WERD,
66 ACCEPTABLE_WERD,
67 CHECK_DAWGS,
68 CHECK_SPACES,
69 CHECK_ONE_ELL_CONFLICT,
70 CHECK_AMBIG_WERD
71 };
72
73 /*
74 0: NO adaption
75 */
76 if (mode == 0) {
77 if (tessedit_adaption_debug) tprintf("adaption disabled\n");
78 return FALSE;
79 }
80
81 if (flags.bit (ADAPTABLE_WERD)) {
82 status |= word->tess_would_adapt; // result of Classify::AdaptableWord()
83 if (tessedit_adaption_debug && !status) {
84 tprintf("tess_would_adapt bit is false\n");
85 }
86 }
87
88 if (flags.bit (ACCEPTABLE_WERD)) {
89 status |= word->tess_accepted;
90 if (tessedit_adaption_debug && !status) {
91 tprintf("tess_accepted bit is false\n");
92 }
93 }
94
95 if (!status) { // If not set then
96 return FALSE; // ignore other checks
97 }
98
99 if (flags.bit (CHECK_DAWGS) &&
100 (word->best_choice->permuter () != SYSTEM_DAWG_PERM) &&
101 (word->best_choice->permuter () != FREQ_DAWG_PERM) &&
102 (word->best_choice->permuter () != USER_DAWG_PERM) &&
103 (word->best_choice->permuter () != NUMBER_PERM)) {
104 if (tessedit_adaption_debug) tprintf("word not in dawgs\n");
105 return FALSE;
106 }
107
108 if (flags.bit (CHECK_ONE_ELL_CONFLICT) && one_ell_conflict (word, FALSE)) {
109 if (tessedit_adaption_debug) tprintf("word has ell conflict\n");
110 return FALSE;
111 }
112
113 if (flags.bit (CHECK_SPACES) &&
114 (strchr(word->best_choice->unichar_string().string(), ' ') != NULL)) {
115 if (tessedit_adaption_debug) tprintf("word contains spaces\n");
116 return FALSE;
117 }
118
119 // if (flags.bit (CHECK_AMBIG_WERD) && test_ambig_word (word))
120 if (flags.bit (CHECK_AMBIG_WERD) &&
121 !getDict().NoDangerousAmbig(word->best_choice, NULL, false, NULL, NULL)) {
122 if (tessedit_adaption_debug) tprintf("word is ambiguous\n");
123 return FALSE;
124 }
125
126 // Do not adapt to words that are composed from fragments if
127 // tessedit_adapt_to_char_fragments is false.
128 if (!tessedit_adapt_to_char_fragments) {
129 const char *fragment_lengths = word->best_choice->fragment_lengths();
130 if (fragment_lengths != NULL && *fragment_lengths != '\0') {
131 for (int i = 0; i < word->best_choice->length(); ++i) {
132 if (fragment_lengths[i] > 1) {
133 if (tessedit_adaption_debug) tprintf("won't adapt to fragments\n");
134 return false; // found a character composed from fragments
135 }
136 }
137 }
138 }
139
140 if (tessedit_adaption_debug) {
141 tprintf("returning status %d\n", status);
142 }
143 return status;
144 }
145
146 } // namespace tesseract