tesseract  4.1.1
edgloop.h File Reference
#include "scrollview.h"
#include "params.h"
#include "pdblock.h"
#include "coutln.h"
#include "crakedge.h"

Go to the source code of this file.

Macros

#define BUCKETSIZE   16
 

Functions

void complete_edge (CRACKEDGE *start, C_OUTLINE_IT *outline_it)
 
ScrollView::Color check_path_legal (CRACKEDGE *start)
 
int16_t loop_bounding_box (CRACKEDGE *&start, ICOORD &botleft, ICOORD &topright)
 

Macro Definition Documentation

◆ BUCKETSIZE

#define BUCKETSIZE   16

Definition at line 29 of file edgloop.h.

Function Documentation

◆ check_path_legal()

ScrollView::Color check_path_legal ( CRACKEDGE start)

Definition at line 65 of file edgloop.cpp.

67  {
68  int lastchain; //last chain code
69  int chaindiff; //chain code diff
70  int32_t length; //length of loop
71  int32_t chainsum; //sum of chain diffs
72  CRACKEDGE *edgept; //current point
73  constexpr ERRCODE ED_ILLEGAL_SUM("Illegal sum of chain codes");
74 
75  length = 0;
76  chainsum = 0; //sum of chain codes
77  edgept = start;
78  lastchain = edgept->prev->stepdir; //previous chain code
79  do {
80  length++;
81  if (edgept->stepdir != lastchain) {
82  //chain code difference
83  chaindiff = edgept->stepdir - lastchain;
84  if (chaindiff > 2)
85  chaindiff -= 4;
86  else if (chaindiff < -2)
87  chaindiff += 4;
88  chainsum += chaindiff; //sum differences
89  lastchain = edgept->stepdir;
90  }
91  edgept = edgept->next;
92  }
93  while (edgept != start && length < C_OUTLINE::kMaxOutlineLength);
94 
95  if ((chainsum != 4 && chainsum != -4)
96  || edgept != start || length < MINEDGELENGTH) {
97  if (edgept != start) {
98  return ScrollView::YELLOW;
99  } else if (length < MINEDGELENGTH) {
100  return ScrollView::MAGENTA;
101  } else {
102  ED_ILLEGAL_SUM.error ("check_path_legal", TESSLOG, "chainsum=%d",
103  chainsum);
104  return ScrollView::GREEN;
105  }
106  }
107  //colour on inside
108  return chainsum < 0 ? ScrollView::BLUE : ScrollView::RED;
109 }

◆ complete_edge()

void complete_edge ( CRACKEDGE start,
C_OUTLINE_IT *  outline_it 
)

Definition at line 35 of file edgloop.cpp.

36  {
37  ScrollView::Color colour; //colour to draw in
38  int16_t looplength; //steps in loop
39  ICOORD botleft; //bounding box
40  ICOORD topright;
41  C_OUTLINE *outline; //new outline
42 
43  //check length etc.
44  colour = check_path_legal (start);
45 
46  if (colour == ScrollView::RED || colour == ScrollView::BLUE) {
47  looplength = loop_bounding_box (start, botleft, topright);
48  outline = new C_OUTLINE (start, botleft, topright, looplength);
49  //add to list
50  outline_it->add_after_then_move (outline);
51  }
52 }

◆ loop_bounding_box()

int16_t loop_bounding_box ( CRACKEDGE *&  start,
ICOORD botleft,
ICOORD topright 
)

Definition at line 117 of file edgloop.cpp.

120  {
121  int16_t length; //length of loop
122  int16_t leftmost; //on top row
123  CRACKEDGE *edgept; //current point
124  CRACKEDGE *realstart; //topleft start
125 
126  edgept = start;
127  realstart = start;
128  botleft = topright = ICOORD (edgept->pos.x (), edgept->pos.y ());
129  leftmost = edgept->pos.x ();
130  length = 0; //coutn length
131  do {
132  edgept = edgept->next;
133  if (edgept->pos.x () < botleft.x ())
134  //get bounding box
135  botleft.set_x (edgept->pos.x ());
136  else if (edgept->pos.x () > topright.x ())
137  topright.set_x (edgept->pos.x ());
138  if (edgept->pos.y () < botleft.y ())
139  //get bounding box
140  botleft.set_y (edgept->pos.y ());
141  else if (edgept->pos.y () > topright.y ()) {
142  realstart = edgept;
143  leftmost = edgept->pos.x ();
144  topright.set_y (edgept->pos.y ());
145  }
146  else if (edgept->pos.y () == topright.y ()
147  && edgept->pos.x () < leftmost) {
148  //leftmost on line
149  leftmost = edgept->pos.x ();
150  realstart = edgept;
151  }
152  length++; //count elements
153  }
154  while (edgept != start);
155  start = realstart; //shift it to topleft
156  return length;
157 }
ScrollView::MAGENTA
@ MAGENTA
Definition: scrollview.h:110
ERRCODE
Definition: errcode.h:68
CRACKEDGE::pos
ICOORD pos
Definition: crakedge.h:47
CRACKEDGE::prev
CRACKEDGE * prev
Definition: crakedge.h:51
ScrollView::YELLOW
@ YELLOW
Definition: scrollview.h:106
ICOORD::y
int16_t y() const
access_function
Definition: points.h:56
check_path_legal
ScrollView::Color check_path_legal(CRACKEDGE *start)
Definition: edgloop.cpp:65
MINEDGELENGTH
#define MINEDGELENGTH
Definition: edgloop.cpp:27
ICOORD
integer coordinate
Definition: points.h:32
C_OUTLINE
class DLLSYM C_OUTLINE
Definition: coutln.h:68
CRACKEDGE::stepdir
int8_t stepdir
Definition: crakedge.h:50
ScrollView::Color
Color
Definition: scrollview.h:101
ICOORD::set_y
void set_y(int16_t yin)
rewrite function
Definition: points.h:65
TESSLOG
@ TESSLOG
Definition: errcode.h:43
ScrollView::BLUE
@ BLUE
Definition: scrollview.h:109
ICOORD::set_x
void set_x(int16_t xin)
rewrite function
Definition: points.h:61
CRACKEDGE::next
CRACKEDGE * next
Definition: crakedge.h:52
ScrollView::GREEN
@ GREEN
Definition: scrollview.h:107
CRACKEDGE
Definition: crakedge.h:26
loop_bounding_box
int16_t loop_bounding_box(CRACKEDGE *&start, ICOORD &botleft, ICOORD &topright)
Definition: edgloop.cpp:117
C_OUTLINE::kMaxOutlineLength
static const int kMaxOutlineLength
Definition: coutln.h:273
ICOORD::x
int16_t x() const
access function
Definition: points.h:52
ScrollView::RED
@ RED
Definition: scrollview.h:105
C_OUTLINE
Definition: coutln.h:72