1379 {
1380 if (words->
empty()) {
1382 return;
1383 }
1384 WERD_RES *input_word =
word();
1385
1386 if (input_word->word->flag(
W_BOL)) {
1387 (*words)[0]->word->set_flag(
W_BOL,
true);
1388 } else {
1389 (*words)[0]->word->set_blanks(input_word->word->space());
1390 }
1391 words->
back()->word->set_flag(
W_EOL, input_word->word->flag(
W_EOL));
1392
1393
1394
1395
1396
1397
1398
1399 WERD_IT w_it(
row()->
row->word_list());
1400 if (!input_word->combination) {
1401 for (w_it.mark_cycle_pt(); !w_it.cycled_list(); w_it.forward()) {
1402 WERD *
word = w_it.data();
1404 break;
1405 }
1406 }
1407
1409 }
1410
1411 WERD_RES_IT wr_it(&
row()->word_res_list);
1412 for (wr_it.mark_cycle_pt(); !wr_it.cycled_list(); wr_it.forward()) {
1413 WERD_RES *
word = wr_it.data();
1414 if (
word == input_word) {
1415 break;
1416 }
1417 }
1419
1420
1421 C_BLOB_IT src_b_it(input_word->word->cblob_list());
1423 C_BLOB_IT rej_b_it(input_word->word->rej_cblob_list());
1426 for (
size_t w = 0; w < words->
size(); ++w) {
1427 WERD_RES *word_w = (*words)[w];
1428 clip_box = ComputeWordBounds(*words, w, clip_box, wr_it_of_current_word);
1429
1430 std::vector<int> blob_ends;
1431 C_BLOB_LIST *next_word_blobs =
1432 w + 1 < words->
size() ? (*words)[w + 1]->word->cblob_list() :
nullptr;
1433 ComputeBlobEnds(*word_w, clip_box, next_word_blobs, &blob_ends);
1434
1435
1436 C_BLOB_LIST fake_blobs;
1437 C_BLOB_IT fake_b_it(&fake_blobs);
1438 fake_b_it.add_list_after(word_w->word->cblob_list());
1439 fake_b_it.move_to_first();
1440 word_w->word->cblob_list()->clear();
1441 C_BLOB_IT dest_it(word_w->word->cblob_list());
1442
1444 for (
size_t i = 0;
i < blob_ends.size(); ++
i, fake_b_it.forward()) {
1445 int end_x = blob_ends[
i];
1447
1448 while (!src_b_it.empty() &&
1449 src_b_it.data()->bounding_box().x_middle() < end_x) {
1450 blob_box += MoveAndClipBlob(&src_b_it, &dest_it, clip_box);
1451 src_b_it.forward();
1452 }
1453 while (!rej_b_it.empty() &&
1454 rej_b_it.data()->bounding_box().x_middle() < end_x) {
1455 blob_box += MoveAndClipBlob(&rej_b_it, &dest_it, clip_box);
1456 rej_b_it.forward();
1457 }
1458 if (blob_box.null_box()) {
1459
1460 blob_box = MoveAndClipBlob(&fake_b_it, &dest_it, clip_box);
1461 }
1462 box_word->InsertBox(
i, blob_box);
1463 }
1464 delete word_w->box_word;
1465 word_w->box_word = box_word;
1466 if (!input_word->combination) {
1467
1468
1469 w_it.add_before_stay_put(word_w->word);
1470 word_w->combination = false;
1471 }
1472 (*words)[w] = nullptr;
1473 wr_it.add_before_stay_put(word_w);
1474 }
1475
1477
1478
1479
1480 if (!input_word->combination) {
1481 delete w_it.extract();
1482 }
1483 delete wr_it.extract();
1485}
static int SortByXMiddle(const void *v1, const void *v2)