34 TBOX box(location_.
x, location_.
y, location_.
x, location_.
y);
35 for (
int s = 0; s < num_splits_; ++s) {
47 return num_splits_ == 0 || splits_[0].
IsHealthy(blob, min_points, min_area);
55 const std::vector<TBLOB *> &blobs,
int insert_index,
bool modify) {
56 for (
int s = 0; s < insert_index; ++s) {
64 for (
unsigned s = insert_index; s < seams.size(); ++s) {
80 for (
int s = 0; s < num_splits_; ++s) {
82 bool found_split =
split.ContainedByBlob(*blobs[index]);
84 for (
unsigned b = index + 1; !found_split && b < blobs.size(); ++b) {
85 found_split =
split.ContainedByBlob(*blobs[b]);
86 if (found_split && b - index > widthp_ && modify) {
91 for (
int b = index - 1; !found_split && b >= 0; --b) {
92 found_split =
split.ContainedByBlob(*blobs[b]);
93 if (found_split && index - b > widthn_ && modify) {
101 return num_found == num_splits_;
107 for (
int s = 0; s < num_splits_; ++s) {
129 while (outline->
next) {
130 outline = outline->
next;
136 for (
int s = 0; s < num_splits_; ++s) {
146 tprintf(
" %6.2f @ (%d,%d), p=%u, n=%u ", priority_, location_.
x, location_.
y, widthp_, widthn_);
147 for (
int s = 0; s < num_splits_; ++s) {
149 if (s + 1 < num_splits_) {
159 if (!seams.empty()) {
161 for (
unsigned x = 0;
x < seams.size(); ++
x) {
169#ifndef GRAPHICS_DISABLED
172 for (
int s = 0; s < num_splits_; ++s) {
173 splits_[s].
Mark(window);
182 int first,
int last) {
183 for (
int x = first;
x <
last; ++
x) {
187 TESSLINE *outline = blobs[first]->outlines;
188 int next_blob = first + 1;
190 while (outline !=
nullptr && next_blob <=
last) {
191 if (outline->
next == blobs[next_blob]->outlines) {
192 outline->
next =
nullptr;
193 outline = blobs[next_blob]->outlines;
196 outline = outline->
next;
205 int first,
int last) {
206 TESSLINE *outline = blobs[first]->outlines;
211 for (
int x = first;
x <
last; ++
x) {
212 SEAM *seam = seams[
x];
213 if (
x - seam->widthn_ >= first &&
x + seam->widthp_ <
last) {
216 while (outline->
next) {
217 outline = outline->
next;
219 outline->
next = blobs[
x + 1]->outlines;
225 for (
int s = 0; s < num_splits_; ++s) {
232 for (
int s = 0; s < num_splits_; ++s) {
239 double center_knob,
double width_change_knob)
const {
240 if (num_splits_ == 0) {
243 for (
int s = 1; s < num_splits_; ++s) {
246 float full_priority =
247 priority_ + splits_[0].
FullPriority(xmin, xmax, overlap_knob, centered_maxwidth, center_knob,
249 for (
int s = num_splits_ - 1; s >= 1; --s) {
252 return full_priority;
266 for (
unsigned b = 1; b < word->
NumBlobs(); ++b) {
267 TBOX bbox = word->
blobs[b - 1]->bounding_box();
268 TBOX nbox = word->
blobs[b]->bounding_box();
269 location.
x = (bbox.
right() + nbox.
left()) / 2;
271 seam_array->push_back(
new SEAM(0.0f, location));
void tprintf(const char *format,...)
void divide_blobs(TBLOB *blob, TBLOB *other_blob, bool italic_blob, const TPOINT &location)
void start_seam_list(TWERD *word, std::vector< SEAM * > *seam_array)
const std::vector< std::string > split(const std::string &s, char c)
void ComputeBoundingBoxes()
void EliminateDuplicateOutlines()
void CorrectBlobOrder(TBLOB *next)
std::vector< TBLOB * > blobs
unsigned NumBlobs() const
TDimension bottom() const
void ApplySeam(bool italic_blob, TBLOB *blob, TBLOB *other_blob) const
float FullPriority(int xmin, int xmax, double overlap_knob, int centered_maxwidth, double center_knob, double width_change_knob) const
TBOX bounding_box() const
void UndoSeam(TBLOB *blob, TBLOB *other_blob) const
static void JoinPieces(const std::vector< SEAM * > &seams, const std::vector< TBLOB * > &blobs, int first, int last)
static void PrintSeams(const char *label, const std::vector< SEAM * > &seams)
bool FindBlobWidth(const std::vector< TBLOB * > &blobs, int index, bool modify)
bool PrepareToInsertSeam(const std::vector< SEAM * > &seams, const std::vector< TBLOB * > &blobs, int insert_index, bool modify)
void Mark(ScrollView *window) const
bool IsHealthy(const TBLOB &blob, int min_points, int min_area) const
static void BreakPieces(const std::vector< SEAM * > &seams, const std::vector< TBLOB * > &blobs, int first, int last)
void Print(const char *label) const
TBOX bounding_box() const
void SplitOutline() const
void UnsplitOutlines() const
void Mark(ScrollView *window) const
void UnsplitOutlineList(TBLOB *blob) const
float FullPriority(int xmin, int xmax, double overlap_knob, int centered_maxwidth, double center_knob, double width_change_knob) const
bool IsHealthy(const TBLOB &blob, int min_points, int min_area) const
void SplitOutlineList(TESSLINE *outlines) const