44 if (outline ==
nullptr || outline->
loop ==
nullptr) {
48 auto StartPoint = outline->
loop;
49 auto EdgePoint = StartPoint;
51 auto NextPoint = EdgePoint->
next;
54 if (EdgePoint->pos.x != NextPoint->pos.x || EdgePoint->pos.y != NextPoint->pos.y) {
57 NewPoint->Hidden = EdgePoint->IsHidden();
58 NewPoint->Point.x = EdgePoint->pos.x;
59 NewPoint->Point.y = EdgePoint->pos.y;
60 MFOutline =
push(MFOutline, NewPoint);
62 EdgePoint = NextPoint;
63 }
while (EdgePoint != StartPoint);
65 if (MFOutline !=
nullptr) {
66 MakeOutlineCircular(MFOutline);
82 while (outline !=
nullptr) {
84 if (mf_outline !=
nullptr) {
85 mf_outlines =
push(mf_outlines, mf_outline);
87 outline = outline->
next;
109 if (DegenerateOutline(Outline)) {
113 Last = PointAt(Outline);
114 Outline = NextPointAfter(Outline);
117 Current = PointAt(EdgePoint);
121 EdgePoint = NextPointAfter(EdgePoint);
122 }
while (EdgePoint != Outline);
133 auto Outline =
static_cast<MFOUTLINE>(arg);
138 while (Start !=
nullptr) {
171 if (DegenerateOutline(Outline)) {
179 PointAt(Current)->MarkPoint();
181 }
while (Last != First);
197 EdgePoint = NextPointAfter(EdgePoint);
198 while (!PointAt(EdgePoint)->ExtremityMark) {
199 EdgePoint = NextPointAfter(EdgePoint);
225 MFEDGEPT *Current = PointAt(EdgePoint);
228 EdgePoint = NextPointAfter(EdgePoint);
229 }
while (EdgePoint != Outline);
252 switch (classify_norm_method) {
254 ASSERT_HOST(!
"How did NormalizeOutlines get called in character mode?");
283 for (Current = Start; Current != End; Current = NextPointAfter(Current)) {
284 PointAt(Current)->Direction = Direction;
287 PointAt(End)->PreviousDirection = Direction;
309 CurrentPoint = PointAt(Current);
315 Current = NextPointAfter(Current);
316 }
while (Current != First);
342 Start->
Slope = -FLT_MAX;
345 Start->
Slope = FLT_MAX;
349 Start->
Slope = Delta.
y / Delta.
x;
352 if (Start->
Slope > MinSlope) {
353 if (Start->
Slope < MaxSlope) {
361 }
else if (Start->
Slope < -MinSlope) {
362 if (Start->
Slope > -MaxSlope) {
370 }
else if (Delta.
y > 0) {
371 if (Start->
Slope < -MinSlope) {
372 if (Start->
Slope > -MaxSlope) {
380 }
else if (Start->
Slope > MinSlope) {
381 if (Start->
Slope < MaxSlope) {
405 InitialDirection = PointAt(EdgePoint)->Direction;
409 EdgePoint = NextPointAfter(EdgePoint);
410 next_pt = NextPointAfter(EdgePoint);
411 }
while (PointAt(EdgePoint)->Direction == InitialDirection && !PointAt(EdgePoint)->Hidden &&
412 next_pt !=
nullptr && !PointAt(next_pt)->Hidden);
#define set_rest(l, cell)
void FreeOutlines(LIST Outlines)
void MarkDirectionChanges(MFOUTLINE Outline)
LIST ConvertBlob(TBLOB *blob)
void CharNormalizeOutline(MFOUTLINE Outline, const DENORM &cn_denorm)
const float MF_SCALE_FACTOR
MFOUTLINE ConvertOutline(TESSLINE *outline)
void ChangeDirection(MFOUTLINE Start, MFOUTLINE End, DIRECTION Direction)
void FreeMFOutline(void *arg)
LIST ConvertOutlines(TESSLINE *outline, LIST mf_outlines, OUTLINETYPE outline_type)
MFOUTLINE NextExtremity(MFOUTLINE EdgePoint)
void ComputeDirection(MFEDGEPT *Start, MFEDGEPT *Finish, float MinSlope, float MaxSlope)
LIST push(LIST list, void *element)
void destroy_nodes(LIST list, void_dest destructor)
void FindDirectionChanges(MFOUTLINE Outline, float MinSlope, float MaxSlope)
void NormalizeOutline(MFOUTLINE Outline, float XOrigin)
const int kBlnBaselineOffset
MFOUTLINE NextDirectionChange(MFOUTLINE EdgePoint)
void LocalNormTransform(const TPOINT &pt, TPOINT *transformed) const
void NormalizeOutlines(LIST Outlines, float *XScale, float *YScale)
DIRECTION PreviousDirection