38 {
39 TO_ROW *row;
40 BLOBNBOX_IT blob_it;
43 int16_t gap_width;
44 int16_t start_of_row;
45 int16_t end_of_row;
46 STATS xht_stats(0, 127);
47 int16_t min_quantum;
48 int16_t max_quantum;
50
51
52
53
54 map = nullptr;
55 min_left = INT16_MAX;
56 max_right = -INT16_MAX;
57 total_rows = 0;
58 any_tabs = false;
59
60
61 TO_ROW_IT row_it(block->get_rows());
62 for (row_it.mark_cycle_pt(); !row_it.cycled_list(); row_it.forward()) {
63 row = row_it.data();
64 if (!row->blob_list()->empty()) {
65 total_rows++;
66 xht_stats.add(static_cast<int16_t>(floor(row->xheight + 0.5)), 1);
67 blob_it.set_to_list(row->blob_list());
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;
72 }
73 if (max_right < end_of_row) {
74 max_right = end_of_row;
75 }
76 }
77 }
78 if ((total_rows < 3) || (min_left >= max_right)) {
79 bucket_size = 0;
80 map_max = 0;
81 total_rows = 0;
82 min_left = max_right = 0;
83 return;
84 }
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++) {
90 }
91
92 for (row_it.mark_cycle_pt(); !row_it.cycled_list(); row_it.forward()) {
93 row = row_it.data();
94 if (!row->blob_list()->empty()) {
95 blob_it.set_to_list(row->blob_list());
96 blob_it.mark_cycle_pt();
98 prev_blob_box = blob_box;
100
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;
106 }
107 for (
i = 0;
i <= max_quantum;
i++) {
109 }
110 }
111 }
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;
120 }
121 for (
i = min_quantum;
i <= max_quantum;
i++) {
123 }
124 }
125 prev_blob_box = blob_box;
126 }
128
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) {
133 min_quantum = 0;
134 }
135 for (
i = min_quantum;
i <= map_max;
i++) {
137 }
138 }
139 }
140 }
141 }
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)))) {
150 } else {
151 any_tabs = true;
152 }
153 }
154 }
157 }
158}
bool gapmap_no_isolated_quanta
void tprintf(const char *format,...)
TBOX box_next(BLOBNBOX_IT *it)