32 TBOX box(location_.
x, location_.
y, location_.
x, location_.
y);
33 for (
int s = 0; s < num_splits_; ++s) {
41 float max_total_priority)
const {
42 int dist = location_.
x - other.location_.
x;
43 if (-max_x_dist < dist && dist < max_x_dist &&
44 num_splits_ + other.num_splits_ <= kMaxNumSplits &&
45 priority_ + other.priority_ < max_total_priority &&
55 priority_ += other.priority_;
56 location_ += other.location_;
59 for (uint8_t s = 0; s < other.num_splits_ && num_splits_ < kMaxNumSplits; ++s)
60 splits_[num_splits_++] = other.splits_[s];
69 return num_splits_ == 0 || splits_[0].
IsHealthy(blob, min_points, min_area);
78 int insert_index,
bool modify) {
79 for (
int s = 0; s < insert_index; ++s) {
82 if (!
FindBlobWidth(blobs, insert_index, modify))
return false;
83 for (
int s = insert_index; s < seams.
size(); ++s) {
84 if (!seams[s]->
FindBlobWidth(blobs, s + 1, modify))
return false;
98 for (
int s = 0; s < num_splits_; ++s) {
99 const SPLIT& split = splits_[s];
102 for (
int b = index + 1; !found_split && b < blobs.
size(); ++b) {
104 if (found_split && b - index > widthp_ && modify) widthp_ = b - index;
107 for (
int b = index - 1; !found_split && b >= 0; --b) {
109 if (found_split && index - b > widthn_ && modify) widthn_ = index - b;
111 if (found_split) ++num_found;
113 return num_found == num_splits_;
119 for (
int s = 0; s < num_splits_; ++s) {
141 while (outline->
next) outline = outline->
next;
146 for (
int s = 0; s < num_splits_; ++s) {
156 tprintf(
" %6.2f @ (%d,%d), p=%d, n=%d ", priority_, location_.
x, location_.
y,
158 for (
int s = 0; s < num_splits_; ++s) {
160 if (s + 1 < num_splits_)
tprintf(
", ");
168 if (!seams.
empty()) {
170 for (
int x = 0; x < seams.
size(); ++x) {
178 #ifndef GRAPHICS_DISABLED 181 for (
int s = 0; s < num_splits_; ++s) splits_[s].
Mark(window);
191 for (
int x = first; x <
last; ++x) seams[x]->
Reveal();
193 TESSLINE* outline = blobs[first]->outlines;
194 int next_blob = first + 1;
196 while (outline !=
nullptr && next_blob <=
last) {
197 if (outline->
next == blobs[next_blob]->outlines) {
198 outline->
next =
nullptr;
199 outline = blobs[next_blob]->outlines;
202 outline = outline->
next;
212 TESSLINE* outline = blobs[first]->outlines;
216 for (
int x = first; x <
last; ++x) {
217 SEAM *seam = seams[x];
218 if (x - seam->widthn_ >= first && x + seam->widthp_ <
last) seam->
Hide();
219 while (outline->
next) outline = outline->
next;
220 outline->
next = blobs[x + 1]->outlines;
226 for (
int s = 0; s < num_splits_; ++s) {
233 for (
int s = 0; s < num_splits_; ++s) {
240 int centered_maxwidth,
double center_knob,
241 double width_change_knob)
const {
242 if (num_splits_ == 0)
return 0.0f;
243 for (
int s = 1; s < num_splits_; ++s) {
246 float full_priority =
248 splits_[0].
FullPriority(xmin, xmax, overlap_knob, centered_maxwidth,
249 center_knob, width_change_knob);
250 for (
int s = num_splits_ - 1; s >= 1; --s) {
253 return full_priority;
267 for (
int b = 1; b < word->
NumBlobs(); ++b) {
268 TBOX bbox = word->
blobs[b - 1]->bounding_box();
269 TBOX nbox = word->
blobs[b]->bounding_box();
270 location.
x = (bbox.
right() + nbox.
left()) / 2;
void EliminateDuplicateOutlines()
DLLSYM void tprintf(const char *format,...)
void Mark(ScrollView *window) const
bool FindBlobWidth(const GenericVector< TBLOB *> &blobs, int index, bool modify)
bool OverlappingSplits(const SEAM &other) const
GenericVector< TBLOB * > blobs
void Print(const char *label) const
void start_seam_list(TWERD *word, GenericVector< SEAM *> *seam_array)
float FullPriority(int xmin, int xmax, double overlap_knob, int centered_maxwidth, double center_knob, double width_change_knob) const
void UndoSeam(TBLOB *blob, TBLOB *other_blob) const
static void JoinPieces(const GenericVector< SEAM *> &seams, const GenericVector< TBLOB *> &blobs, int first, int last)
TBOX bounding_box() const
static void PrintSeams(const char *label, const GenericVector< SEAM *> &seams)
bool ContainedByBlob(const TBLOB &blob) const
float FullPriority(int xmin, int xmax, double overlap_knob, int centered_maxwidth, double center_knob, double width_change_knob) const
void divide_blobs(TBLOB *blob, TBLOB *other_blob, bool italic_blob, const TPOINT &location)
void UnsplitOutlineList(TBLOB *blob) const
bool SharesPosition(const SEAM &other) const
void SplitOutline() const
bool CombineableWith(const SEAM &other, int max_x_dist, float max_total_priority) const
bool IsHealthy(const TBLOB &blob, int min_points, int min_area) const
void UnsplitOutlines() const
void CorrectBlobOrder(TBLOB *next)
bool IsHealthy(const TBLOB &blob, int min_points, int min_area) const
void ApplySeam(bool italic_blob, TBLOB *blob, TBLOB *other_blob) const
void SplitOutlineList(TESSLINE *outlines) const
TBOX bounding_box() const
bool PrepareToInsertSeam(const GenericVector< SEAM *> &seams, const GenericVector< TBLOB *> &blobs, int insert_index, bool modify)
static void BreakPieces(const GenericVector< SEAM *> &seams, const GenericVector< TBLOB *> &blobs, int first, int last)
void ComputeBoundingBoxes()
void CombineWith(const SEAM &other)