1380 if (words->
empty()) {
1384 WERD_RES *input_word =
word();
1386 if (input_word->word->flag(
W_BOL)) {
1387 (*words)[0]->word->set_flag(
W_BOL,
true);
1389 (*words)[0]->word->set_blanks(input_word->word->space());
1391 words->
back()->word->set_flag(
W_EOL, input_word->word->flag(
W_EOL));
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();
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) {
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);
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);
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());
1444 for (
size_t i = 0; i < blob_ends.size(); ++i, fake_b_it.forward()) {
1445 int end_x = blob_ends[i];
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);
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);
1458 if (blob_box.null_box()) {
1460 blob_box = MoveAndClipBlob(&fake_b_it, &dest_it, clip_box);
1462 box_word->InsertBox(i, blob_box);
1464 delete word_w->box_word;
1465 word_w->box_word = box_word;
1466 if (!input_word->combination) {
1469 w_it.add_before_stay_put(word_w->word);
1470 word_w->combination =
false;
1472 (*words)[w] =
nullptr;
1473 wr_it.add_before_stay_put(word_w);
1480 if (!input_word->combination) {
1481 delete w_it.extract();
1483 delete wr_it.extract();
static int SortByXMiddle(const void *v1, const void *v2)