27 #define BLOCK_LABEL_HEIGHT 150 //char height of block id
42 :
PDBLK (xmin, ymin, xmax, ymax),
44 re_rotation_(1.0
f, 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 ();
108 ROW_IT row_it(&rows);
122 #define ROW_SPACING 5
124 ROW_IT row_it(&rows);
128 ICOORDELT_IT icoordelt_it;
134 for (row_it.mark_cycle_pt (); !row_it.cycled_list (); row_it.forward ()) {
135 row = row_it.data ();
142 icoordelt_it.set_to_list (&
leftside);
192 tprintf (
"Proportional= %s\n", proportional ?
"TRUE" :
"FALSE");
193 tprintf (
"Kerning= %d\n", kerning);
194 tprintf (
"Spacing= %d\n", spacing);
195 tprintf (
"Fixed_pitch=%d\n", pitch);
199 tprintf (
"Left side coords are:\n");
200 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ())
201 tprintf (
"(%d,%d) ", it.data ()->x (), it.data ()->y ());
203 tprintf (
"Right side coords are:\n");
205 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ())
206 tprintf (
"(%d,%d) ", it.data ()->x (), it.data ()->y ());
222 proportional = source.proportional;
223 kerning = source.kerning;
224 spacing = source.spacing;
225 filename = source.filename;
228 re_rotation_ = source.re_rotation_;
229 classify_rotation_ = source.classify_rotation_;
230 skew_ = source.skew_;
244 bool LeftMargin(ICOORDELT_LIST *segments,
int x,
int *margin) {
247 if (segments->empty())
249 ICOORDELT_IT seg_it(segments);
250 for (seg_it.mark_cycle_pt(); !seg_it.cycled_list(); seg_it.forward()) {
251 int cur_margin = x - seg_it.data()->x();
252 if (cur_margin >= 0) {
254 *margin = cur_margin;
255 }
else if (cur_margin < *margin) {
256 *margin = cur_margin;
277 if (segments->empty())
279 ICOORDELT_IT seg_it(segments);
280 for (seg_it.mark_cycle_pt(); !seg_it.cycled_list(); seg_it.forward()) {
281 int cur_margin = seg_it.data()->x() + seg_it.data()->y() - x;
282 if (cur_margin >= 0) {
284 *margin = cur_margin;
285 }
else if (cur_margin < *margin) {
286 *margin = cur_margin;
337 ROW *first_row = r_it.data();
338 ROW *second_row = r_it.data_relative(1);
346 WERD_IT werd_it(r_it.data()->word_list());
347 if (!werd_it.empty()) {
348 C_BLOB_IT cblob_it(werd_it.data()->cblob_list());
349 for (cblob_it.mark_cycle_pt(); !cblob_it.cycled_list();
350 cblob_it.forward()) {
351 TBOX bbox = cblob_it.data()->bounding_box();
352 if (bbox.
bottom() <= mid_second_line) {
355 if (drop_cap_bottom > bbox.
bottom())
356 drop_cap_bottom = bbox.
bottom();
357 if (drop_cap_right < bbox.
right())
358 drop_cap_right = bbox.
right();
367 for (r_it.mark_cycle_pt(); !r_it.cycled_list(); r_it.forward()) {
368 ROW *row = r_it.data();
372 ICOORDELT_LIST *segments = lines.
get_line(left_y);
376 if (row_box.
top() >= drop_cap_bottom) {
377 int drop_cap_distance = row_box.
left() - row->
space() - drop_cap_right;
378 if (drop_cap_distance < 0)
379 drop_cap_distance = 0;
380 if (drop_cap_distance < left_margin)
381 left_margin = drop_cap_distance;
405 BLOCK_IT block_it(block_list);
406 for (block_it.mark_cycle_pt(); !block_it.cycled_list(); block_it.forward()) {
407 BLOCK* block = block_it.data();
410 for (row_it.mark_cycle_pt(); !row_it.cycled_list(); row_it.forward()) {
412 ROW* row = row_it.data();
415 for (werd_it.mark_cycle_pt(); !werd_it.cycled_list(); werd_it.forward()) {
416 WERD* werd = werd_it.data();
422 tprintf(
"Block list stats:\nBlocks = %d\nRows = %d\nWords = %d\nBlobs = %d\n",
423 num_blocks, num_rows, num_words, num_blobs);
434 C_BLOB_LIST* output_blob_list) {
435 C_BLOB_IT return_list_it(output_blob_list);
436 BLOCK_IT block_it(blocks);
437 for (block_it.mark_cycle_pt(); !block_it.cycled_list(); block_it.forward()) {
438 BLOCK* block = block_it.data();
440 for (row_it.mark_cycle_pt(); !row_it.cycled_list(); row_it.forward()) {
441 ROW* row = row_it.data();
444 for (werd_it.mark_cycle_pt(); !werd_it.cycled_list(); werd_it.forward()) {
445 WERD* werd = werd_it.data();
446 return_list_it.move_to_last();
447 return_list_it.add_list_after(werd->
cblob_list());
448 return_list_it.move_to_last();
469 C_BLOB_LIST* new_blobs,
470 C_BLOB_LIST* not_found_blobs) {
473 BLOCK_IT block_it(block_list);
474 for (block_it.mark_cycle_pt(); !block_it.cycled_list(); block_it.forward()) {
475 BLOCK* block = block_it.data();
478 for (row_it.mark_cycle_pt(); !row_it.cycled_list(); row_it.forward()) {
479 ROW* row = row_it.data();
483 WERD_IT new_words_it(&new_words);
484 for (werd_it.mark_cycle_pt(); !werd_it.cycled_list(); werd_it.forward()) {
485 WERD* werd = werd_it.extract();
491 new_words_it.add_after_then_move(new_werd);
497 new_words_it.add_after_then_move(werd);
502 werd_it.move_to_first();
503 werd_it.add_list_after(&new_words);