void char_clip_word( // WERD *word, //word to be processed IMAGE &bin_image, //whole image PIXROW_LIST *&pixrow_list, //pixrows built IMAGELINE *&imlines, //lines cut from image TBOX &pix_box //box defining imlines ) { TBOX word_box = word->bounding_box (); PBLOB_LIST *blob_list; PBLOB_IT blob_it; PIXROW_IT pixrow_it; inT16 pix_offset; //Y pos of pixrow[0] inT16 row_height; //No of pix rows inT16 imlines_x_offset; PIXROW *prev; PIXROW *next; PIXROW *current; BOOL8 changed; //still improving BOOL8 just_changed; //still improving inT16 iteration_count = 0; inT16 foreground_colour; if (word->flag (W_INVERSE)) foreground_colour = 1; else foreground_colour = 0; /* Define region for max pixrow expansion */ pix_box = word_box; pix_box.move_bottom_edge (-pix_word_margin); pix_box.move_top_edge (pix_word_margin); pix_box.move_left_edge (-pix_word_margin); pix_box.move_right_edge (pix_word_margin); pix_box -= TBOX (ICOORD (0, 0 + BUG_OFFSET), ICOORD (bin_image.get_xsize (), bin_image.get_ysize () - BUG_OFFSET)); /* Generate pixrows list */ pix_offset = pix_box.bottom (); row_height = pix_box.height (); blob_list = word->blob_list (); blob_it.set_to_list (blob_list); pixrow_list = new PIXROW_LIST; pixrow_it.set_to_list (pixrow_list); for (blob_it.mark_cycle_pt (); !blob_it.cycled_list (); blob_it.forward ()) { PIXROW *row = new PIXROW (pix_offset, row_height, blob_it.data ()); ASSERT_HOST (!row-> bad_box (bin_image.get_xsize (), bin_image.get_ysize ())); pixrow_it.add_after_then_move (row); } imlines = generate_imlines (bin_image, pix_box); /* Contract pixrows - shrink min and max back to black pixels */ imlines_x_offset = pix_box.left (); pixrow_it.move_to_first (); for (pixrow_it.mark_cycle_pt (); !pixrow_it.cycled_list (); pixrow_it.forward ()) { ASSERT_HOST (!pixrow_it.data ()-> bad_box (bin_image.get_xsize (), bin_image.get_ysize ())); pixrow_it.data ()->contract (imlines, imlines_x_offset, foreground_colour); ASSERT_HOST (!pixrow_it.data ()-> bad_box (bin_image.get_xsize (), bin_image.get_ysize ())); } /* Expand pixrows iteratively 1 pixel at a time */ do { changed = FALSE; pixrow_it.move_to_first (); prev = NULL; current = NULL; next = pixrow_it.data (); for (pixrow_it.mark_cycle_pt (); !pixrow_it.cycled_list (); pixrow_it.forward ()) { prev = current; current = next; if (pixrow_it.at_last ()) next = NULL; else next = pixrow_it.data_relative (1); just_changed = current->extend (imlines, pix_box, prev, next, foreground_colour); ASSERT_HOST (!current-> bad_box (bin_image.get_xsize (), bin_image.get_ysize ())); changed = changed || just_changed; } iteration_count++; } while (changed); }