All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
blobs.h File Reference
#include "clst.h"
#include "normalis.h"
#include "publictypes.h"
#include "rect.h"
#include "vecfuncs.h"

Go to the source code of this file.

Classes

struct  TPOINT
 
struct  EDGEPT
 
struct  TESSLINE
 
struct  TBLOB
 
struct  TWERD
 

Macros

#define EDGEPTFLAGS   4 /*concavity,length etc. */
 
#define free_widths(w)   if (w) memfree (w)
 

Typedefs

typedef TPOINT VECTOR
 

Functions

 CLISTIZEH (EDGEPT)
 
bool divisible_blob (TBLOB *blob, bool italic_blob, TPOINT *location)
 
void divide_blobs (TBLOB *blob, TBLOB *other_blob, bool italic_blob, const TPOINT &location)
 

Macro Definition Documentation

#define EDGEPTFLAGS   4 /*concavity,length etc. */

Definition at line 48 of file blobs.h.

#define free_widths (   w)    if (w) memfree (w)

Definition at line 448 of file blobs.h.

Typedef Documentation

typedef TPOINT VECTOR

Definition at line 74 of file blobs.h.

Function Documentation

CLISTIZEH ( EDGEPT  )
void divide_blobs ( TBLOB blob,
TBLOB other_blob,
bool  italic_blob,
const TPOINT location 
)

Definition at line 983 of file blobs.cpp.

984  {
985  TPOINT vertical = italic_blob ? kDivisibleVerticalItalic
987  TESSLINE *outline1 = NULL;
988  TESSLINE *outline2 = NULL;
989 
990  TESSLINE *outline = blob->outlines;
991  blob->outlines = NULL;
992  int location_prod = CROSS(location, vertical);
993 
994  while (outline != NULL) {
995  TPOINT mid_pt(
996  static_cast<inT16>((outline->topleft.x + outline->botright.x) / 2),
997  static_cast<inT16>((outline->topleft.y + outline->botright.y) / 2));
998  int mid_prod = CROSS(mid_pt, vertical);
999  if (mid_prod < location_prod) {
1000  // Outline is in left blob.
1001  if (outline1)
1002  outline1->next = outline;
1003  else
1004  blob->outlines = outline;
1005  outline1 = outline;
1006  } else {
1007  // Outline is in right blob.
1008  if (outline2)
1009  outline2->next = outline;
1010  else
1011  other_blob->outlines = outline;
1012  outline2 = outline;
1013  }
1014  outline = outline->next;
1015  }
1016 
1017  if (outline1)
1018  outline1->next = NULL;
1019  if (outline2)
1020  outline2->next = NULL;
1021 }
const TPOINT kDivisibleVerticalItalic(1, 5)
inT16 y
Definition: blobs.h:72
TESSLINE * next
Definition: blobs.h:258
const TPOINT kDivisibleVerticalUpright(0, 1)
TPOINT topleft
Definition: blobs.h:253
#define CROSS(a, b)
Definition: vecfuncs.h:52
Definition: blobs.h:50
TPOINT botright
Definition: blobs.h:254
inT16 x
Definition: blobs.h:71
#define NULL
Definition: host.h:144
TESSLINE * outlines
Definition: blobs.h:377
bool divisible_blob ( TBLOB blob,
bool  italic_blob,
TPOINT location 
)

Definition at line 934 of file blobs.cpp.

934  {
935  if (blob->outlines == NULL || blob->outlines->next == NULL)
936  return false; // Need at least 2 outlines for it to be possible.
937  int max_gap = 0;
938  TPOINT vertical = italic_blob ? kDivisibleVerticalItalic
940  for (TESSLINE* outline1 = blob->outlines; outline1 != NULL;
941  outline1 = outline1->next) {
942  if (outline1->is_hole)
943  continue; // Holes do not count as separable.
944  TPOINT mid_pt1(
945  static_cast<inT16>((outline1->topleft.x + outline1->botright.x) / 2),
946  static_cast<inT16>((outline1->topleft.y + outline1->botright.y) / 2));
947  int mid_prod1 = CROSS(mid_pt1, vertical);
948  int min_prod1, max_prod1;
949  outline1->MinMaxCrossProduct(vertical, &min_prod1, &max_prod1);
950  for (TESSLINE* outline2 = outline1->next; outline2 != NULL;
951  outline2 = outline2->next) {
952  if (outline2->is_hole)
953  continue; // Holes do not count as separable.
954  TPOINT mid_pt2(
955  static_cast<inT16>((outline2->topleft.x + outline2->botright.x) / 2),
956  static_cast<inT16>((outline2->topleft.y + outline2->botright.y) / 2));
957  int mid_prod2 = CROSS(mid_pt2, vertical);
958  int min_prod2, max_prod2;
959  outline2->MinMaxCrossProduct(vertical, &min_prod2, &max_prod2);
960  int mid_gap = abs(mid_prod2 - mid_prod1);
961  int overlap = MIN(max_prod1, max_prod2) - MAX(min_prod1, min_prod2);
962  if (mid_gap - overlap / 4 > max_gap) {
963  max_gap = mid_gap - overlap / 4;
964  *location = mid_pt1;
965  *location += mid_pt2;
966  *location /= 2;
967  }
968  }
969  }
970  // Use the y component of the vertical vector as an approximation to its
971  // length.
972  return max_gap > vertical.y;
973 }
const TPOINT kDivisibleVerticalItalic(1, 5)
#define MAX(x, y)
Definition: ndminx.h:24
#define MIN(x, y)
Definition: ndminx.h:28
inT16 y
Definition: blobs.h:72
TESSLINE * next
Definition: blobs.h:258
const TPOINT kDivisibleVerticalUpright(0, 1)
#define CROSS(a, b)
Definition: vecfuncs.h:52
Definition: blobs.h:50
#define NULL
Definition: host.h:144
TESSLINE * outlines
Definition: blobs.h:377