All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
blkocc.cpp
Go to the documentation of this file.
1 /*****************************************************************************
2  *
3  * File: blkocc.cpp (Formerly blockocc.c)
4  * Description: Block Occupancy routines
5  * Author: Chris Newton
6  * Created: Fri Nov 8
7  * Modified:
8  * Language: C++
9  * Package: N/A
10  * Status: Experimental (Do Not Distribute)
11  *
12  * (c) Copyright 1991, Hewlett-Packard Company.
13  ** Licensed under the Apache License, Version 2.0 (the "License");
14  ** you may not use this file except in compliance with the License.
15  ** You may obtain a copy of the License at
16  ** http://www.apache.org/licenses/LICENSE-2.0
17  ** Unless required by applicable law or agreed to in writing, software
18  ** distributed under the License is distributed on an "AS IS" BASIS,
19  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20  ** See the License for the specific language governing permissions and
21  ** limitations under the License.
22  *
23  ******************************************************************************/
24 
25 /*
26 ----------------------------------------------------------------------
27  I n c l u d e s
28 ----------------------------------------------------------------------
29 */
30 
31 #include <ctype.h>
32 #include <math.h>
33 #include "errcode.h"
34 #include "drawtord.h"
35 #include "blkocc.h"
36 #include "helpers.h"
37 
38 double_VAR(textord_underline_threshold, 0.5, "Fraction of width occupied");
39 
40 // Forward declarations of static functions
41 static void horizontal_cblob_projection(C_BLOB *blob, // blob to project
42  STATS *stats); // output
43 static void horizontal_coutline_projection(C_OUTLINE *outline,
44  STATS *stats); // output
45 
53 BOOL8 test_underline( //look for underlines
54  BOOL8 testing_on, //< drawing blob
55  C_BLOB *blob, //< blob to test
56  inT16 baseline, //< coords of baseline
57  inT16 xheight //< height of line
58  ) {
59  inT16 occ;
60  inT16 blob_width; //width of blob
61  TBOX blob_box; //bounding box
62  inT32 desc_occ;
63  inT32 x_occ;
64  inT32 asc_occ;
65  STATS projection;
66 
67  blob_box = blob->bounding_box ();
68  blob_width = blob->bounding_box ().width ();
69  projection.set_range (blob_box.bottom (), blob_box.top () + 1);
70  if (testing_on) {
71  // blob->plot(to_win,GOLDENROD,GOLDENROD);
72  // line_color_index(to_win,GOLDENROD);
73  // move2d(to_win,blob_box.left(),baseline);
74  // draw2d(to_win,blob_box.right(),baseline);
75  // move2d(to_win,blob_box.left(),baseline+xheight);
76  // draw2d(to_win,blob_box.right(),baseline+xheight);
77  tprintf
78  ("Testing underline on blob at (%d,%d)->(%d,%d), base=%d\nOccs:",
79  blob->bounding_box ().left (), blob->bounding_box ().bottom (),
80  blob->bounding_box ().right (), blob->bounding_box ().top (),
81  baseline);
82  }
83  horizontal_cblob_projection(blob, &projection);
84  desc_occ = 0;
85  for (occ = blob_box.bottom (); occ < baseline; occ++)
86  if (occ <= blob_box.top () && projection.pile_count (occ) > desc_occ)
87  //max in region
88  desc_occ = projection.pile_count (occ);
89  x_occ = 0;
90  for (occ = baseline; occ <= baseline + xheight; occ++)
91  if (occ >= blob_box.bottom () && occ <= blob_box.top ()
92  && projection.pile_count (occ) > x_occ)
93  //max in region
94  x_occ = projection.pile_count (occ);
95  asc_occ = 0;
96  for (occ = baseline + xheight + 1; occ <= blob_box.top (); occ++)
97  if (occ >= blob_box.bottom () && projection.pile_count (occ) > asc_occ)
98  asc_occ = projection.pile_count (occ);
99  if (testing_on) {
100  tprintf ("%d %d %d\n", desc_occ, x_occ, asc_occ);
101  }
102  if (desc_occ == 0 && x_occ == 0 && asc_occ == 0) {
103  tprintf ("Bottom=%d, top=%d, base=%d, x=%d\n",
104  blob_box.bottom (), blob_box.top (), baseline, xheight);
105  projection.print();
106  }
107  if (desc_occ > x_occ + x_occ
108  && desc_occ > blob_width * textord_underline_threshold)
109  return TRUE; //real underline
110  if (asc_occ > x_occ + x_occ
111  && asc_occ > blob_width * textord_underline_threshold)
112  return TRUE; //overline
113  return FALSE; //neither
114 }
115 
116 
124 static void horizontal_cblob_projection( //project outlines
125  C_BLOB *blob, //< blob to project
126  STATS *stats //< output
127  ) {
128  //outlines of blob
129  C_OUTLINE_IT out_it = blob->out_list ();
130 
131  for (out_it.mark_cycle_pt (); !out_it.cycled_list (); out_it.forward ()) {
132  horizontal_coutline_projection (out_it.data (), stats);
133  }
134 }
135 
136 
144 static void horizontal_coutline_projection( //project outlines
145  C_OUTLINE *outline, //< outline to project
146  STATS *stats //< output
147  ) {
148  ICOORD pos; //current point
149  ICOORD step; //edge step
150  inT32 length; //of outline
151  inT16 stepindex; //current step
152  C_OUTLINE_IT out_it = outline->child ();
153 
154  pos = outline->start_pos ();
155  length = outline->pathlength ();
156  for (stepindex = 0; stepindex < length; stepindex++) {
157  step = outline->step (stepindex);
158  if (step.y () > 0) {
159  stats->add (pos.y (), pos.x ());
160  }
161  else if (step.y () < 0) {
162  stats->add (pos.y () - 1, -pos.x ());
163  }
164  pos += step;
165  }
166 
167  for (out_it.mark_cycle_pt (); !out_it.cycled_list (); out_it.forward ()) {
168  horizontal_coutline_projection (out_it.data (), stats);
169  }
170 }
#define double_VAR(name, val, comment)
Definition: params.h:286
#define tprintf(...)
Definition: tprintf.h:31
Definition: statistc.h:33
const ICOORD & start_pos() const
Definition: coutln.h:146
void add(inT32 value, inT32 count)
Definition: statistc.cpp:104
unsigned char BOOL8
Definition: host.h:113
inT32 pathlength() const
Definition: coutln.h:133
double textord_underline_threshold
Definition: blkocc.cpp:38
inT16 right() const
Definition: rect.h:75
C_OUTLINE_LIST * out_list()
Definition: stepblob.h:64
inT16 y() const
access_function
Definition: points.h:56
inT16 left() const
Definition: rect.h:68
integer coordinate
Definition: points.h:30
inT16 bottom() const
Definition: rect.h:61
inT16 width() const
Definition: rect.h:111
#define FALSE
Definition: capi.h:29
inT16 x() const
access function
Definition: points.h:52
Definition: rect.h:30
#define TRUE
Definition: capi.h:28
bool set_range(inT32 min_bucket_value, inT32 max_bucket_value_plus_1)
Definition: statistc.cpp:62
TBOX bounding_box() const
Definition: stepblob.cpp:250
inT32 pile_count(inT32 value) const
Definition: statistc.h:78
ICOORD step(int index) const
Definition: coutln.h:142
void print() const
Definition: statistc.cpp:538
C_OUTLINE_LIST * child()
Definition: coutln.h:106
inT16 top() const
Definition: rect.h:54
BOOL8 test_underline(BOOL8 testing_on, C_BLOB *blob, inT16 baseline, inT16 xheight)
Definition: blkocc.cpp:53
short inT16
Definition: host.h:100
int inT32
Definition: host.h:102