diff --git a/src/ccstruct/coutln.h b/src/ccstruct/coutln.h index 165e53e045..6de78283f9 100644 --- a/src/ccstruct/coutln.h +++ b/src/ccstruct/coutln.h @@ -72,10 +72,11 @@ struct Pix; ELISTIZEH (C_OUTLINE) class DLLSYM C_OUTLINE:public ELIST_LINK { public: - C_OUTLINE() { //empty constructor - steps = nullptr; - offsets = nullptr; - } + C_OUTLINE() { + stepcount = 0; + steps = nullptr; + offsets = nullptr; + } C_OUTLINE( //constructor CRACKEDGE *startpt, //from edge detector ICOORD bot_left, //bounding box //length of loop diff --git a/src/classify/adaptmatch.cpp b/src/classify/adaptmatch.cpp index 21bd07a0d1..5c78baf23c 100644 --- a/src/classify/adaptmatch.cpp +++ b/src/classify/adaptmatch.cpp @@ -555,7 +555,6 @@ void Classify::InitAdaptiveClassifier(TessdataManager* mgr) { static_classifier_ = new TessClassifier(false, this); } - im_.Init(&classify_debug_level); InitIntegerFX(); AllProtosOn = NewBitVector(MAX_NUM_PROTOS); diff --git a/src/classify/classify.cpp b/src/classify/classify.cpp index a11ed8b767..5a9a65b008 100644 --- a/src/classify/classify.cpp +++ b/src/classify/classify.cpp @@ -184,6 +184,7 @@ Classify::Classify() this->params()), double_MEMBER(speckle_rating_penalty, 10.0, "Penalty to add to worst rating for noise", this->params()), + im_(&classify_debug_level), shape_table_(nullptr), dict_(this), static_classifier_(nullptr) { diff --git a/src/classify/intmatcher.cpp b/src/classify/intmatcher.cpp index d13a890d2b..7740d269a8 100644 --- a/src/classify/intmatcher.cpp +++ b/src/classify/intmatcher.cpp @@ -667,9 +667,9 @@ int IntegerMatcher::FindBadFeatures( } -void IntegerMatcher::Init(tesseract::IntParam *classify_debug_level) { - classify_debug_level_ = classify_debug_level; - +IntegerMatcher::IntegerMatcher(tesseract::IntParam *classify_debug_level) + : classify_debug_level_(classify_debug_level) +{ /* Initialize table for evidence to similarity lookup */ for (int i = 0; i < SE_TABLE_SIZE; i++) { uint32_t IntSimilarity = i << (27 - SE_TABLE_BITS); diff --git a/src/classify/intmatcher.h b/src/classify/intmatcher.h index af2f211825..47c9248dd1 100644 --- a/src/classify/intmatcher.h +++ b/src/classify/intmatcher.h @@ -93,9 +93,7 @@ class IntegerMatcher { // Center of Similarity Curve. static const float kSimilarityCenter; - IntegerMatcher() : classify_debug_level_(nullptr) {} - - void Init(tesseract::IntParam *classify_debug_level); + IntegerMatcher(tesseract::IntParam *classify_debug_level); void Match(INT_CLASS ClassTemplate, BIT_VECTOR ProtoMask, @@ -173,13 +171,12 @@ class IntegerMatcher { bool SeparateDebugWindows); #endif - private: + tesseract::IntParam *classify_debug_level_; uint8_t similarity_evidence_table_[SE_TABLE_SIZE]; uint32_t evidence_table_mask_; uint32_t mult_trunc_shift_bits_; uint32_t table_trunc_shift_bits_; - tesseract::IntParam *classify_debug_level_; uint32_t evidence_mult_mask_; }; diff --git a/src/textord/cjkpitch.cpp b/src/textord/cjkpitch.cpp index 0703406ef3..1c19c4e11e 100644 --- a/src/textord/cjkpitch.cpp +++ b/src/textord/cjkpitch.cpp @@ -915,11 +915,9 @@ void FPRow::FinalizeLargeChars() { class FPAnalyzer { public: - FPAnalyzer(): page_tr_(), rows_() { } + FPAnalyzer(ICOORD page_tr, TO_BLOCK_LIST *port_blocks); ~FPAnalyzer() { } - void Init(ICOORD page_tr, TO_BLOCK_LIST *port_blocks); - void Pass1Analyze() { for (size_t i = 0; i < rows_.size(); i++) rows_[i].Pass1Analyze(); } @@ -984,11 +982,14 @@ class FPAnalyzer { unsigned max_chars_per_row_; }; -void FPAnalyzer::Init(ICOORD page_tr, TO_BLOCK_LIST *port_blocks) { - page_tr_ = page_tr; - - TO_BLOCK_IT block_it; - block_it.set_to_list (port_blocks); +FPAnalyzer::FPAnalyzer(ICOORD page_tr, TO_BLOCK_LIST *port_blocks) +: page_tr_(page_tr), + num_tall_rows_(0), + num_bad_rows_(0), + num_empty_rows_(0), + max_chars_per_row_(0) +{ + TO_BLOCK_IT block_it(port_blocks); for (block_it.mark_cycle_pt(); !block_it.cycled_list(); block_it.forward()) { @@ -999,8 +1000,6 @@ void FPAnalyzer::Init(ICOORD page_tr, TO_BLOCK_LIST *port_blocks) { } } - num_empty_rows_ = 0; - max_chars_per_row_ = 0; for (block_it.mark_cycle_pt(); !block_it.cycled_list(); block_it.forward()) { TO_ROW_IT row_it = block_it.data()->get_rows(); @@ -1060,8 +1059,7 @@ void FPAnalyzer::EstimatePitch(bool pass1) { void compute_fixed_pitch_cjk(ICOORD page_tr, TO_BLOCK_LIST *port_blocks) { - FPAnalyzer analyzer; - analyzer.Init(page_tr, port_blocks); + FPAnalyzer analyzer(page_tr, port_blocks); if (analyzer.num_rows() == 0) return; analyzer.Pass1Analyze(); diff --git a/src/textord/gap_map.cpp b/src/textord/gap_map.cpp index 719a6118ab..2a7e7e6439 100644 --- a/src/textord/gap_map.cpp +++ b/src/textord/gap_map.cpp @@ -11,13 +11,11 @@ #include "statistc.h" #include "gap_map.h" -#define EXTERN -EXTERN BOOL_VAR (gapmap_debug, FALSE, "Say which blocks have tables"); -EXTERN BOOL_VAR (gapmap_use_ends, FALSE, -"Use large space at start and end of rows"); -EXTERN BOOL_VAR (gapmap_no_isolated_quanta, FALSE, +BOOL_VAR(gapmap_debug, FALSE, "Say which blocks have tables"); +BOOL_VAR(gapmap_use_ends, FALSE, "Use large space at start and end of rows"); +BOOL_VAR(gapmap_no_isolated_quanta, FALSE, "Ensure gaps not less than 2quanta wide"); -EXTERN double_VAR (gapmap_big_gaps, 1.75, "xht multiplier"); +double_VAR(gapmap_big_gaps, 1.75, "xht multiplier"); /************************************************************************* * A block gap map is a quantised histogram of whitespace regions in the @@ -74,6 +72,8 @@ GAPMAP::GAPMAP( //Constructor } } if ((total_rows < 3) || (min_left >= max_right)) { + bucket_size = 0; + map_max = 0; total_rows = 0; min_left = max_right = 0; return; diff --git a/src/textord/pitsync1.cpp b/src/textord/pitsync1.cpp index fc58e24945..870f1d7563 100644 --- a/src/textord/pitsync1.cpp +++ b/src/textord/pitsync1.cpp @@ -22,17 +22,12 @@ #include "pitsync1.h" ELISTIZE (FPSEGPT) CLISTIZE (FPSEGPT_LIST) -#define EXTERN -EXTERN -INT_VAR (pitsync_linear_version, 6, "Use new fast algorithm"); -EXTERN -double_VAR (pitsync_joined_edge, 0.75, -"Dist inside big blob for chopping"); -EXTERN -double_VAR (pitsync_offset_freecut_fraction, 0.25, -"Fraction of cut for free cuts"); -EXTERN -INT_VAR (pitsync_fake_depth, 1, "Max advance fake generation"); + +INT_VAR(pitsync_linear_version, 6, "Use new fast algorithm"); +double_VAR(pitsync_joined_edge, 0.75, "Dist inside big blob for chopping"); +double_VAR(pitsync_offset_freecut_fraction, 0.25, + "Fraction of cut for free cuts"); +INT_VAR(pitsync_fake_depth, 1, "Max advance fake generation"); /********************************************************************** * FPSEGPT::FPSEGPT @@ -63,7 +58,7 @@ FPSEGPT::FPSEGPT( //constructor **********************************************************************/ FPSEGPT::FPSEGPT ( //constructor -int16_t x //position +int16_t x //position ):xpos (x) { pred = nullptr; mean_sum = 0; @@ -83,17 +78,22 @@ int16_t x //position **********************************************************************/ FPSEGPT::FPSEGPT ( //constructor -int16_t x, //position +int16_t x, //position BOOL8 faking, //faking this one -int16_t offset, //dist to gap -int16_t region_index, //segment number -int16_t pitch, //proposed pitch -int16_t pitch_error, //allowed tolerance +int16_t offset, //dist to gap +int16_t region_index, //segment number +int16_t pitch, //proposed pitch +int16_t pitch_error, //allowed tolerance FPSEGPT_LIST * prev_list //previous segment -):xpos (x) { - int16_t best_fake; //on previous +) +: fake_count(0), + xpos(x), + mean_sum(0.0), + sq_sum(0.0) +{ + int16_t best_fake; //on previous FPSEGPT *segpt; //segment point - int32_t dist; //from prev segment + int32_t dist; //from prev segment double sq_dist; //squared distance double mean; //mean pitch double total; //total dists @@ -133,7 +133,6 @@ FPSEGPT_LIST * prev_list //previous segment pred = nullptr; //fail it } - /********************************************************************** * check_pitch_sync * @@ -144,28 +143,28 @@ FPSEGPT_LIST * prev_list //previous segment double check_pitch_sync( //find segmentation BLOBNBOX_IT *blob_it, //blobs to do - int16_t blob_count, //no of blobs - int16_t pitch, //pitch estimate - int16_t pitch_error, //tolerance + int16_t blob_count, //no of blobs + int16_t pitch, //pitch estimate + int16_t pitch_error, //tolerance STATS *projection, //vertical FPSEGPT_LIST *seg_list //output list ) { - int16_t x; //current coord - int16_t min_index; //blob number - int16_t max_index; //blob number - int16_t left_edge; //of word - int16_t right_edge; //of word - int16_t right_max; //max allowed x - int16_t min_x; //in this region + int16_t x; //current coord + int16_t min_index; //blob number + int16_t max_index; //blob number + int16_t left_edge; //of word + int16_t right_edge; //of word + int16_t right_max; //max allowed x + int16_t min_x; //in this region int16_t max_x; int16_t region_index; - int16_t best_region_index = 0; //for best result - int16_t offset; //dist to legal area - int16_t left_best_x; //edge of good region - int16_t right_best_x; //right edge - TBOX min_box; //bounding box - TBOX max_box; //bounding box - TBOX next_box; //box of next blob + int16_t best_region_index = 0; //for best result + int16_t offset; //dist to legal area + int16_t left_best_x; //edge of good region + int16_t right_best_x; //right edge + TBOX min_box; //bounding box + TBOX max_box; //bounding box + TBOX next_box; //box of next blob FPSEGPT *segpt; //segment point FPSEGPT_LIST *segpts; //points in a segment double best_cost; //best path @@ -362,17 +361,17 @@ double check_pitch_sync( //find segmentation void make_illegal_segment( //find segmentation FPSEGPT_LIST *prev_list, //previous segments - TBOX blob_box, //bounding box + TBOX blob_box, //bounding box BLOBNBOX_IT blob_it, //iterator - int16_t region_index, //number of segment - int16_t pitch, //pitch estimate - int16_t pitch_error, //tolerance + int16_t region_index, //number of segment + int16_t pitch, //pitch estimate + int16_t pitch_error, //tolerance FPSEGPT_LIST *seg_list //output list ) { - int16_t x; //current coord - int16_t min_x = 0; //in this region + int16_t x; //current coord + int16_t min_x = 0; //in this region int16_t max_x = 0; - int16_t offset; //dist to edge + int16_t offset; //dist to edge FPSEGPT *segpt; //segment point FPSEGPT *prevpt; //previous point float best_cost; //best path diff --git a/src/wordrec/wordrec.cpp b/src/wordrec/wordrec.cpp index 3093612135..158bc6ce4b 100644 --- a/src/wordrec/wordrec.cpp +++ b/src/wordrec/wordrec.cpp @@ -134,7 +134,8 @@ Wordrec::Wordrec() : BOOL_MEMBER(save_alt_choices, true, "Save alternative paths found during chopping" " and segmentation search", - params()) { + params()), + pass2_ok_split(0.0f) { prev_word_best_choice_ = nullptr; language_model_.reset(new LanguageModel(&get_fontinfo_table(), &(getDict())));