{
int ext_start_y, ext_end_y;
BLOBNBOX_CLIST good_points;
int pt_count = AlignTabs(align_params, false, bbox, &good_points, &ext_end_y);
pt_count += AlignTabs(align_params, true, bbox, &good_points, &ext_start_y);
BLOBNBOX_C_IT it(&good_points);
it.move_to_last();
box = it.data()->bounding_box();
int end_x = align_params.right_tab ? box.
right() : box.
left();
it.move_to_first();
box = it.data()->bounding_box();
int start_x = align_params.right_tab ? box.
right() : box.
left();
bool at_least_2_crossings = AtLeast2LineCrossings(&good_points);
if ((pt_count >= align_params.min_points &&
end_y - start_y >= align_params.min_length &&
(align_params.ragged ||
at_least_2_crossings) {
int confirmed_points = 0;
for (it.mark_cycle_pt(); !it.cycled_list(); it.forward()) {
bbox = it.data();
if (align_params.right_tab) {
++confirmed_points;
} else {
++confirmed_points;
}
}
if (!align_params.ragged ||
confirmed_points + confirmed_points < pt_count) {
if (debug) {
tprintf(
"Confirming tab vector of %d pts starting at %d,%d\n",
}
for (it.mark_cycle_pt(); !it.cycled_list(); it.forward()) {
bbox = it.data();
if (align_params.right_tab) {
} else {
}
if (debug) {
}
}
align_params.vertical,
ext_start_y, ext_end_y,
&good_points,
vertical_x, vertical_y);
result->set_intersects_other_lines(at_least_2_crossings);
if (debug) {
result->Print("After fitting");
}
return result;
} else if (debug) {
tprintf(
"Ragged tab used too many used points: %d out of %d\n",
confirmed_points, pt_count);
}
} else if (debug) {
tprintf(
"Tab vector failed basic tests: pt count %d vs min %d, "
"length %d vs min %d, min grad %g\n",
pt_count, align_params.min_points, end_y - start_y,
align_params.min_length, abs(end_x - start_x) * kMinTabGradient);
}
}