1334 {
1335 if (words->
empty()) {
1337 return;
1338 }
1340
1342 (*words)[0]->word->set_flag(
W_BOL,
true);
1343 } else {
1344 (*words)[0]->word->set_blanks(input_word->
word->
space());
1345 }
1347
1348
1349
1350
1351
1352
1353
1354 WERD_IT w_it(
row()->
row->word_list());
1356 for (w_it.mark_cycle_pt(); !w_it.cycled_list(); w_it.forward()) {
1359 break;
1360 }
1361
1363 }
1364
1365 WERD_RES_IT wr_it(&
row()->word_res_list);
1366 for (wr_it.mark_cycle_pt(); !wr_it.cycled_list(); wr_it.forward()) {
1368 if (
word == input_word)
1369 break;
1370 }
1372
1373
1379 for (
int w = 0; w < words->
size(); ++w) {
1381 clip_box = ComputeWordBounds(*words, w, clip_box, wr_it_of_current_word);
1382
1384 C_BLOB_LIST* next_word_blobs =
1385 w + 1 < words->
size() ? (*words)[w + 1]->word->cblob_list() :
nullptr;
1386 ComputeBlobEnds(*word_w, clip_box, next_word_blobs, &blob_ends);
1387
1388
1389 C_BLOB_LIST fake_blobs;
1390 C_BLOB_IT fake_b_it(&fake_blobs);
1392 fake_b_it.move_to_first();
1395
1397 for (
int i = 0; i < blob_ends.
size(); ++i, fake_b_it.forward()) {
1398 int end_x = blob_ends[i];
1400
1401 while (!src_b_it.empty() &&
1402 src_b_it.data()->bounding_box().x_middle() < end_x) {
1403 blob_box += MoveAndClipBlob(&src_b_it, &dest_it, clip_box);
1404 src_b_it.forward();
1405 }
1406 while (!rej_b_it.empty() &&
1407 rej_b_it.data()->bounding_box().x_middle() < end_x) {
1408 blob_box += MoveAndClipBlob(&rej_b_it, &dest_it, clip_box);
1409 rej_b_it.forward();
1410 }
1412
1413 blob_box = MoveAndClipBlob(&fake_b_it, &dest_it, clip_box);
1414 }
1415 box_word->InsertBox(i, blob_box);
1416 }
1420
1421
1422 w_it.add_before_stay_put(word_w->
word);
1424 }
1425 (*words)[w] = nullptr;
1426 wr_it.add_before_stay_put(word_w);
1427 }
1428
1430
1431
1432
1434 delete w_it.extract();
1435 delete wr_it.extract();
1437}
tesseract::BoxWord * box_word
static int SortByXMiddle(const void *v1, const void *v2)
C_BLOB_LIST * rej_cblob_list()
C_BLOB_LIST * cblob_list()