void WERD::copy_on(WERD* other) { bool reversed = other->bounding_box().left() < bounding_box().left(); C_BLOB_IT c_blob_it(&cblobs); C_BLOB_LIST c_blobs; c_blobs.deep_copy(&other->cblobs, &C_BLOB::deep_copy); if (reversed) { c_blob_it.add_list_before(&c_blobs); } else { c_blob_it.move_to_last(); c_blob_it.add_list_after(&c_blobs); } if (!other->rej_cblobs.empty()) { C_BLOB_IT rej_c_blob_it(&rej_cblobs); C_BLOB_LIST new_rej_c_blobs; new_rej_c_blobs.deep_copy(&other->rej_cblobs, &C_BLOB::deep_copy); if (reversed) { rej_c_blob_it.add_list_before(&new_rej_c_blobs); } else { rej_c_blob_it.move_to_last(); rej_c_blob_it.add_list_after(&new_rej_c_blobs); } } }
/// Return a TBLOB * from the whole page_image. /// To be freed later with free_blob(). TBLOB *make_tesseract_blob(float baseline, float xheight, float descender, float ascender) { BLOCK *block = new BLOCK ("a character", TRUE, 0, 0, 0, 0, page_image.get_xsize(), page_image.get_ysize()); // Create C_BLOBs from the page extract_edges( #ifndef GRAPHICS_DISABLED NULL, #endif &page_image, &page_image, ICOORD(page_image.get_xsize(), page_image.get_ysize()), block); // Create one PBLOB from all C_BLOBs C_BLOB_LIST *list = block->blob_list(); C_BLOB_IT c_blob_it(list); PBLOB *pblob = new PBLOB; // will be (hopefully) deleted by the pblob_list for (c_blob_it.mark_cycle_pt(); !c_blob_it.cycled_list(); c_blob_it.forward()) { C_BLOB *c_blob = c_blob_it.data(); PBLOB c_as_p(c_blob, baseline + xheight); merge_blobs(pblob, &c_as_p); } PBLOB_LIST *pblob_list = new PBLOB_LIST; // will be deleted by the word PBLOB_IT pblob_it(pblob_list); pblob_it.add_after_then_move(pblob); // Normalize PBLOB WERD word(pblob_list, 0, " "); ROW *row = make_tess_ocrrow(baseline, xheight, descender, ascender); word.baseline_normalise(row); delete row; // Create a TBLOB from PBLOB return make_tess_blob(pblob, /* flatten: */ TRUE); }