46 STATS xht_stats(0, 127);
56 max_right = -INT16_MAX;
62 for (row_it.mark_cycle_pt(); !row_it.cycled_list(); row_it.forward()) {
66 xht_stats.
add(
static_cast<int16_t
>(floor(row->
xheight + 0.5)), 1);
68 start_of_row = blob_it.data()->bounding_box().left();
69 end_of_row = blob_it.data_relative(-1)->bounding_box().right();
70 if (min_left > start_of_row) {
71 min_left = start_of_row;
73 if (max_right < end_of_row) {
74 max_right = end_of_row;
78 if ((total_rows < 3) || (min_left >= max_right)) {
82 min_left = max_right = 0;
85 bucket_size =
static_cast<int16_t
>(floor(xht_stats.
median() + 0.5)) / 2;
86 map_max = (max_right - min_left) / bucket_size;
87 map =
new int16_t[map_max + 1];
88 for (
i = 0;
i <= map_max;
i++) {
92 for (row_it.mark_cycle_pt(); !row_it.cycled_list(); row_it.forward()) {
96 blob_it.mark_cycle_pt();
98 prev_blob_box = blob_box;
101 gap_width = blob_box.
left() - min_left;
103 max_quantum = (blob_box.
left() - min_left) / bucket_size;
104 if (max_quantum > map_max) {
105 max_quantum = map_max;
107 for (
i = 0;
i <= max_quantum;
i++) {
112 while (!blob_it.cycled_list()) {
114 gap_width = blob_box.
left() - prev_blob_box.
right();
116 min_quantum = (prev_blob_box.
right() - min_left) / bucket_size;
117 max_quantum = (blob_box.
left() - min_left) / bucket_size;
118 if (max_quantum > map_max) {
119 max_quantum = map_max;
121 for (
i = min_quantum;
i <= max_quantum;
i++) {
125 prev_blob_box = blob_box;
129 gap_width = max_right - prev_blob_box.
right();
131 min_quantum = (prev_blob_box.
right() - min_left) / bucket_size;
132 if (min_quantum < 0) {
135 for (
i = min_quantum;
i <= map_max;
i++) {
142 for (
i = 0;
i <= map_max;
i++) {
143 if (map[
i] > total_rows / 2) {
145 (((
i == 0) && (map[
i + 1] <= total_rows / 2)) ||
146 ((
i == map_max) && (map[
i - 1] <= total_rows / 2)) ||
147 ((
i > 0) && (
i < map_max) && (map[
i - 1] <= total_rows / 2) &&
148 (map[
i + 1] <= total_rows / 2)))) {
173 bool tab_found =
false;
179 min_quantum = (left - min_left) / bucket_size;
180 max_quantum = (right - min_left) / bucket_size;
184 if (min_quantum < 0) {
187 if (max_quantum > map_max) {
188 max_quantum = map_max;
190 for (
i = min_quantum; (!tab_found && (
i <= max_quantum));
i++) {
191 if (map[
i] > total_rows / 2) {
#define BOOL_VAR(name, val, comment)
#define double_VAR(name, val, comment)
bool gapmap_no_isolated_quanta
void tprintf(const char *format,...)
TBOX box_next(BLOBNBOX_IT *it)
BLOBNBOX_LIST * blob_list()
void add(int32_t value, int32_t count)
bool table_gap(int16_t left, int16_t right)