27 #define BLOCK_LABEL_HEIGHT 150 //char height of block id 42 :
PDBLK (xmin, ymin, xmax, ymax),
44 re_rotation_(1.0f, 0.0f),
45 classify_rotation_(1.0f, 0.0f),
47 ICOORDELT_IT left_it = &leftside;
48 ICOORDELT_IT right_it = &rightside;
51 right_to_left_ =
false;
55 cell_over_xheight_ = 2.0f;
57 left_it.set_to_list (&leftside);
58 right_it.set_to_list (&rightside);
60 left_it.add_to_end (
new ICOORDELT (xmin, ymin));
61 left_it.add_to_end (
new ICOORDELT (xmin, ymax));
62 right_it.add_to_end (
new ICOORDELT (xmax, ymin));
63 right_it.add_to_end (
new ICOORDELT (xmax, ymax));
75 return (*(
ROW **) row2)->bounding_box ().top () -
76 (*(
ROW **) row1)->bounding_box ().top ();
95 ROW_IT it(const_cast<ROW_LIST*>(&rows));
96 for (it.mark_cycle_pt(); !it.cycled_list(); it.forward()) {
97 box += it.data()->restricted_bounding_box(upper_dots, lower_dots);
120 ROW_IT row_it(&rows);
134 #define ROW_SPACING 5 136 ROW_IT row_it(&rows);
140 ICOORDELT_IT icoordelt_it;
146 for (row_it.mark_cycle_pt (); !row_it.cycled_list (); row_it.forward ()) {
147 row = row_it.data ();
154 icoordelt_it.set_to_list (&
leftside);
204 tprintf (
"Proportional= %s\n", proportional ?
"TRUE" :
"FALSE");
205 tprintf (
"Kerning= %d\n", kerning);
206 tprintf (
"Spacing= %d\n", spacing);
207 tprintf (
"Fixed_pitch=%d\n", pitch);
211 tprintf (
"Left side coords are:\n");
212 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ())
213 tprintf (
"(%d,%d) ", it.data ()->x (), it.data ()->y ());
215 tprintf (
"Right side coords are:\n");
217 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ())
218 tprintf (
"(%d,%d) ", it.data ()->x (), it.data ()->y ());
234 proportional = source.proportional;
235 kerning = source.kerning;
236 spacing = source.spacing;
240 re_rotation_ = source.re_rotation_;
241 classify_rotation_ = source.classify_rotation_;
242 skew_ = source.skew_;
256 bool LeftMargin(ICOORDELT_LIST *segments,
int x,
int *margin) {
259 if (segments->empty())
261 ICOORDELT_IT seg_it(segments);
262 for (seg_it.mark_cycle_pt(); !seg_it.cycled_list(); seg_it.forward()) {
263 int cur_margin = x - seg_it.data()->x();
264 if (cur_margin >= 0) {
266 *margin = cur_margin;
267 }
else if (cur_margin < *margin) {
268 *margin = cur_margin;
289 if (segments->empty())
291 ICOORDELT_IT seg_it(segments);
292 for (seg_it.mark_cycle_pt(); !seg_it.cycled_list(); seg_it.forward()) {
293 int cur_margin = seg_it.data()->x() + seg_it.data()->y() - x;
294 if (cur_margin >= 0) {
296 *margin = cur_margin;
297 }
else if (cur_margin < *margin) {
298 *margin = cur_margin;
349 ROW *first_row = r_it.data();
350 ROW *second_row = r_it.data_relative(1);
358 WERD_IT werd_it(r_it.data()->word_list());
359 if (!werd_it.empty()) {
360 C_BLOB_IT cblob_it(werd_it.data()->cblob_list());
361 for (cblob_it.mark_cycle_pt(); !cblob_it.cycled_list();
362 cblob_it.forward()) {
363 TBOX bbox = cblob_it.data()->bounding_box();
364 if (bbox.
bottom() <= mid_second_line) {
367 if (drop_cap_bottom > bbox.
bottom())
368 drop_cap_bottom = bbox.
bottom();
369 if (drop_cap_right < bbox.
right())
370 drop_cap_right = bbox.
right();
379 for (r_it.mark_cycle_pt(); !r_it.cycled_list(); r_it.forward()) {
380 ROW *row = r_it.data();
384 const std::unique_ptr< ICOORDELT_LIST> segments_left(lines.
get_line(left_y));
387 if (row_box.
top() >= drop_cap_bottom) {
388 int drop_cap_distance = row_box.
left() - row->
space() - drop_cap_right;
389 if (drop_cap_distance < 0)
390 drop_cap_distance = 0;
391 if (drop_cap_distance < left_margin)
392 left_margin = drop_cap_distance;
397 const std::unique_ptr< ICOORDELT_LIST> segments_right(lines.
get_line(right_y));
415 BLOCK_IT block_it(block_list);
416 for (block_it.mark_cycle_pt(); !block_it.cycled_list(); block_it.forward()) {
417 BLOCK* block = block_it.data();
420 for (row_it.mark_cycle_pt(); !row_it.cycled_list(); row_it.forward()) {
422 ROW* row = row_it.data();
425 for (werd_it.mark_cycle_pt(); !werd_it.cycled_list(); werd_it.forward()) {
426 WERD* werd = werd_it.data();
432 tprintf(
"Block list stats:\nBlocks = %d\nRows = %d\nWords = %d\nBlobs = %d\n",
433 num_blocks, num_rows, num_words, num_blobs);
444 C_BLOB_LIST* output_blob_list) {
445 C_BLOB_IT return_list_it(output_blob_list);
446 BLOCK_IT block_it(blocks);
447 for (block_it.mark_cycle_pt(); !block_it.cycled_list(); block_it.forward()) {
448 BLOCK* block = block_it.data();
450 for (row_it.mark_cycle_pt(); !row_it.cycled_list(); row_it.forward()) {
451 ROW* row = row_it.data();
454 for (werd_it.mark_cycle_pt(); !werd_it.cycled_list(); werd_it.forward()) {
455 WERD* werd = werd_it.data();
456 return_list_it.move_to_last();
457 return_list_it.add_list_after(werd->
cblob_list());
458 return_list_it.move_to_last();
479 C_BLOB_LIST* new_blobs,
480 C_BLOB_LIST* not_found_blobs) {
483 BLOCK_IT block_it(block_list);
484 for (block_it.mark_cycle_pt(); !block_it.cycled_list(); block_it.forward()) {
485 BLOCK* block = block_it.data();
490 for (row_it.mark_cycle_pt(); !row_it.cycled_list(); row_it.forward()) {
491 ROW* row = row_it.data();
495 WERD_IT new_words_it(&new_words);
496 for (werd_it.mark_cycle_pt(); !werd_it.cycled_list(); werd_it.forward()) {
497 WERD* werd = werd_it.extract();
503 new_words_it.add_after_then_move(new_werd);
509 new_words_it.add_after_then_move(werd);
514 werd_it.move_to_first();
515 werd_it.add_list_after(&new_words);
void sort_rows()
decreasing y order
void rotate(const FCOORD &rotation)
int decreasing_top_order(const void *row1, const void *row2)
PDBLK & operator=(const PDBLK &source)
WERD * ConstructWerdWithNewBlobs(C_BLOB_LIST *all_blobs, C_BLOB_LIST *orphan_blobs)
void RefreshWordBlobsFromNewBlobs(BLOCK_LIST *block_list, C_BLOB_LIST *new_blobs, C_BLOB_LIST *not_found_blobs)
void rotate(FCOORD rotation)
void check_pitch()
check proportional
void move(const ICOORD vec)
void set_has_drop_cap(bool has)
ICOORDELT_LIST * get_line(inT16 y)
void set_rmargin(inT16 rmargin)
bool LeftMargin(ICOORDELT_LIST *segments, int x, int *margin)
void ExtractBlobsFromSegmentation(BLOCK_LIST *blocks, C_BLOB_LIST *output_blob_list)
TBOX bounding_box() const
void print(FILE *fp, BOOL8 dump)
dump whole table
void PrintSegmentationStats(BLOCK_LIST *block_list)
void compress()
shrink white space
POLY_BLOCK * poly_block() const
void reflect_polygon_in_y_axis()
C_BLOB_LIST * cblob_list()
C_BLOB_LIST * rej_cblob_list()
void move_bottom_edge(const inT16 y)
void operator=(const ELIST_LINK &)
#define ELISTIZE(CLASSNAME)
void set_lmargin(inT16 lmargin)
void move(const ICOORD vec)
const ICOORD & botleft() const
float base_line(float xpos) const
const TBOX & bounding_box() const
get real box
ROW_LIST * row_list()
get rows
void compute_row_margins()
bool RightMargin(ICOORDELT_LIST *segments, int x, int *margin)
BLOCK & operator=(const BLOCK &source)
TBOX restricted_bounding_box(bool upper_dots, bool lower_dots) const