tesseract  4.0.0-1-g2a2b
PAGE_RES_IT Class Reference

#include <pageres.h>

Public Member Functions

 PAGE_RES_IT ()=default
 
 PAGE_RES_IT (PAGE_RES *the_page_res)
 
bool operator== (const PAGE_RES_IT &other) const
 
bool operator!= (const PAGE_RES_IT &other) const
 
int cmp (const PAGE_RES_IT &other) const
 
WERD_RESrestart_page ()
 
WERD_RESrestart_page_with_empties ()
 
WERD_RESstart_page (bool empty_ok)
 
WERD_RESrestart_row ()
 
WERD_RESInsertSimpleCloneWord (const WERD_RES &clone_res, WERD *new_word)
 
void ReplaceCurrentWord (tesseract::PointerVector< WERD_RES > *words)
 
void DeleteCurrentWord ()
 
void MakeCurrentWordFuzzy ()
 
WERD_RESforward ()
 
WERD_RESforward_with_empties ()
 
WERD_RESforward_paragraph ()
 
WERD_RESforward_block ()
 
WERD_RESprev_word () const
 
ROW_RESprev_row () const
 
BLOCK_RESprev_block () const
 
WERD_RESword () const
 
ROW_RESrow () const
 
BLOCK_RESblock () const
 
WERD_RESnext_word () const
 
ROW_RESnext_row () const
 
BLOCK_RESnext_block () const
 
void rej_stat_word ()
 
void ResetWordIterator ()
 

Public Attributes

PAGE_RESpage_res
 

Detailed Description

Definition at line 675 of file pageres.h.

Constructor & Destructor Documentation

◆ PAGE_RES_IT() [1/2]

PAGE_RES_IT::PAGE_RES_IT ( )
default

◆ PAGE_RES_IT() [2/2]

PAGE_RES_IT::PAGE_RES_IT ( PAGE_RES the_page_res)
inline

Definition at line 681 of file pageres.h.

681  { // page result
682  page_res = the_page_res;
683  restart_page(); // ready to scan
684  }
WERD_RES * restart_page()
Definition: pageres.h:698
PAGE_RES * page_res
Definition: pageres.h:677

Member Function Documentation

◆ block()

BLOCK_RES* PAGE_RES_IT::block ( ) const
inline

Definition at line 757 of file pageres.h.

757  { // block of cur. word
758  return block_res;
759  }

◆ cmp()

int PAGE_RES_IT::cmp ( const PAGE_RES_IT other) const

Definition at line 1201 of file pageres.cpp.

1201  {
1202  ASSERT_HOST(page_res == other.page_res);
1203  if (other.block_res == nullptr) {
1204  // other points to the end of the page.
1205  if (block_res == nullptr)
1206  return 0;
1207  return -1;
1208  }
1209  if (block_res == nullptr) {
1210  return 1; // we point to the end of the page.
1211  }
1212  if (block_res == other.block_res) {
1213  if (other.row_res == nullptr || row_res == nullptr) {
1214  // this should only happen if we hit an image block.
1215  return 0;
1216  }
1217  if (row_res == other.row_res) {
1218  // we point to the same block and row.
1219  ASSERT_HOST(other.word_res != nullptr && word_res != nullptr);
1220  if (word_res == other.word_res) {
1221  // we point to the same word!
1222  return 0;
1223  }
1224 
1225  WERD_RES_IT word_res_it(&row_res->word_res_list);
1226  for (word_res_it.mark_cycle_pt(); !word_res_it.cycled_list();
1227  word_res_it.forward()) {
1228  if (word_res_it.data() == word_res) {
1229  return -1;
1230  } else if (word_res_it.data() == other.word_res) {
1231  return 1;
1232  }
1233  }
1234  ASSERT_HOST("Error: Incomparable PAGE_RES_ITs" == nullptr);
1235  }
1236 
1237  // we both point to the same block, but different rows.
1238  ROW_RES_IT row_res_it(&block_res->row_res_list);
1239  for (row_res_it.mark_cycle_pt(); !row_res_it.cycled_list();
1240  row_res_it.forward()) {
1241  if (row_res_it.data() == row_res) {
1242  return -1;
1243  } else if (row_res_it.data() == other.row_res) {
1244  return 1;
1245  }
1246  }
1247  ASSERT_HOST("Error: Incomparable PAGE_RES_ITs" == nullptr);
1248  }
1249 
1250  // We point to different blocks.
1251  BLOCK_RES_IT block_res_it(&page_res->block_res_list);
1252  for (block_res_it.mark_cycle_pt();
1253  !block_res_it.cycled_list(); block_res_it.forward()) {
1254  if (block_res_it.data() == block_res) {
1255  return -1;
1256  } else if (block_res_it.data() == other.block_res) {
1257  return 1;
1258  }
1259  }
1260  // Shouldn't happen...
1261  ASSERT_HOST("Error: Incomparable PAGE_RES_ITs" == nullptr);
1262  return 0;
1263 }
WERD_RES_LIST word_res_list
Definition: pageres.h:147
ROW_RES_LIST row_res_list
Definition: pageres.h:128
BLOCK_RES_LIST block_res_list
Definition: pageres.h:81
PAGE_RES * page_res
Definition: pageres.h:677
#define ASSERT_HOST(x)
Definition: errcode.h:84

◆ DeleteCurrentWord()

void PAGE_RES_IT::DeleteCurrentWord ( )

Definition at line 1450 of file pageres.cpp.

1450  {
1451  // Check that this word is as we expect. part_of_combos are NEVER iterated
1452  // by the normal iterator, so we should never be trying to delete them.
1453  ASSERT_HOST(!word_res->part_of_combo);
1454  if (!word_res->combination) {
1455  // Combinations own their own word, so we won't find the word on the
1456  // row's word_list, but it is legitimate to try to delete them.
1457  // Delete word from the ROW when not a combination.
1458  WERD_IT w_it(row()->row->word_list());
1459  for (w_it.mark_cycle_pt(); !w_it.cycled_list(); w_it.forward()) {
1460  if (w_it.data() == word_res->word) {
1461  break;
1462  }
1463  }
1464  ASSERT_HOST(!w_it.cycled_list());
1465  delete w_it.extract();
1466  }
1467  // Remove the WERD_RES for the new_word.
1468  // Remove the WORD_RES from the ROW_RES.
1469  WERD_RES_IT wr_it(&row()->word_res_list);
1470  for (wr_it.mark_cycle_pt(); !wr_it.cycled_list(); wr_it.forward()) {
1471  if (wr_it.data() == word_res) {
1472  word_res = nullptr;
1473  break;
1474  }
1475  }
1476  ASSERT_HOST(!wr_it.cycled_list());
1477  delete wr_it.extract();
1479 }
ROW_RES * row() const
Definition: pageres.h:754
void ResetWordIterator()
Definition: pageres.cpp:1533
bool combination
Definition: pageres.h:334
bool part_of_combo
Definition: pageres.h:335
#define ASSERT_HOST(x)
Definition: errcode.h:84
WERD * word
Definition: pageres.h:189

◆ forward()

WERD_RES* PAGE_RES_IT::forward ( )
inline

Definition at line 731 of file pageres.h.

731  { // Get next word.
732  return internal_forward(false, false);
733  }

◆ forward_block()

WERD_RES * PAGE_RES_IT::forward_block ( )

Definition at line 1667 of file pageres.cpp.

1667  {
1668  while (block_res == next_block_res) {
1669  internal_forward(false, true);
1670  }
1671  return internal_forward(false, true);
1672 }

◆ forward_paragraph()

WERD_RES * PAGE_RES_IT::forward_paragraph ( )

Definition at line 1652 of file pageres.cpp.

1652  {
1653  while (block_res == next_block_res &&
1654  (next_row_res != nullptr && next_row_res->row != nullptr &&
1655  row_res->row->para() == next_row_res->row->para())) {
1656  internal_forward(false, true);
1657  }
1658  return internal_forward(false, true);
1659 }
ROW * row
Definition: pageres.h:143
PARA * para() const
Definition: ocrrow.h:118

◆ forward_with_empties()

WERD_RES* PAGE_RES_IT::forward_with_empties ( )
inline

Definition at line 735 of file pageres.h.

735  {
736  return internal_forward(false, true);
737  }

◆ InsertSimpleCloneWord()

WERD_RES * PAGE_RES_IT::InsertSimpleCloneWord ( const WERD_RES clone_res,
WERD new_word 
)

Definition at line 1269 of file pageres.cpp.

1270  {
1271  // Make a WERD_RES for the new_word.
1272  WERD_RES* new_res = new WERD_RES(new_word);
1273  new_res->CopySimpleFields(clone_res);
1274  new_res->combination = true;
1275  // Insert into the appropriate place in the ROW_RES.
1276  WERD_RES_IT wr_it(&row()->word_res_list);
1277  for (wr_it.mark_cycle_pt(); !wr_it.cycled_list(); wr_it.forward()) {
1278  WERD_RES* word = wr_it.data();
1279  if (word == word_res)
1280  break;
1281  }
1282  ASSERT_HOST(!wr_it.cycled_list());
1283  wr_it.add_before_then_move(new_res);
1284  if (wr_it.at_first()) {
1285  // This is the new first word, so reset the member iterator so it
1286  // detects the cycled_list state correctly.
1288  }
1289  return new_res;
1290 }
ROW_RES * row() const
Definition: pageres.h:754
void CopySimpleFields(const WERD_RES &source)
Definition: pageres.cpp:255
void ResetWordIterator()
Definition: pageres.cpp:1533
WERD_RES * word() const
Definition: pageres.h:751
bool combination
Definition: pageres.h:334
#define ASSERT_HOST(x)
Definition: errcode.h:84

◆ MakeCurrentWordFuzzy()

void PAGE_RES_IT::MakeCurrentWordFuzzy ( )

Definition at line 1483 of file pageres.cpp.

1483  {
1484  WERD* real_word = word_res->word;
1485  if (!real_word->flag(W_FUZZY_SP) && !real_word->flag(W_FUZZY_NON)) {
1486  real_word->set_flag(W_FUZZY_SP, true);
1487  if (word_res->combination) {
1488  // The next word should be the corresponding part of combo, but we have
1489  // already stepped past it, so find it by search.
1490  WERD_RES_IT wr_it(&row()->word_res_list);
1491  for (wr_it.mark_cycle_pt();
1492  !wr_it.cycled_list() && wr_it.data() != word_res; wr_it.forward()) {
1493  }
1494  wr_it.forward();
1495  ASSERT_HOST(wr_it.data()->part_of_combo);
1496  real_word = wr_it.data()->word;
1497  ASSERT_HOST(!real_word->flag(W_FUZZY_SP) &&
1498  !real_word->flag(W_FUZZY_NON));
1499  real_word->set_flag(W_FUZZY_SP, true);
1500  }
1501  }
1502 }
ROW_RES * row() const
Definition: pageres.h:754
void set_flag(WERD_FLAGS mask, bool value)
Definition: werd.h:127
bool flag(WERD_FLAGS mask) const
Definition: werd.h:126
Definition: werd.h:59
bool combination
Definition: pageres.h:334
#define ASSERT_HOST(x)
Definition: errcode.h:84
WERD * word
Definition: pageres.h:189

◆ next_block()

BLOCK_RES* PAGE_RES_IT::next_block ( ) const
inline

Definition at line 766 of file pageres.h.

766  { // block of next word
767  return next_block_res;
768  }

◆ next_row()

ROW_RES* PAGE_RES_IT::next_row ( ) const
inline

Definition at line 763 of file pageres.h.

763  { // row of next word
764  return next_row_res;
765  }

◆ next_word()

WERD_RES* PAGE_RES_IT::next_word ( ) const
inline

Definition at line 760 of file pageres.h.

760  { // next word
761  return next_word_res;
762  }

◆ operator!=()

bool PAGE_RES_IT::operator!= ( const PAGE_RES_IT other) const
inline

Definition at line 690 of file pageres.h.

690 {return !(*this == other); }

◆ operator==()

bool PAGE_RES_IT::operator== ( const PAGE_RES_IT other) const

Definition at line 1195 of file pageres.cpp.

1195  {
1196  return word_res == other.word_res &&
1197  row_res == other.row_res &&
1198  block_res == other.block_res;
1199 }

◆ prev_block()

BLOCK_RES* PAGE_RES_IT::prev_block ( ) const
inline

Definition at line 748 of file pageres.h.

748  { // block of prev word
749  return prev_block_res;
750  }

◆ prev_row()

ROW_RES* PAGE_RES_IT::prev_row ( ) const
inline

Definition at line 745 of file pageres.h.

745  { // row of prev word
746  return prev_row_res;
747  }

◆ prev_word()

WERD_RES* PAGE_RES_IT::prev_word ( ) const
inline

Definition at line 742 of file pageres.h.

742  { // previous word
743  return prev_word_res;
744  }

◆ rej_stat_word()

void PAGE_RES_IT::rej_stat_word ( )

Definition at line 1674 of file pageres.cpp.

1674  {
1675  int16_t chars_in_word;
1676  int16_t rejects_in_word = 0;
1677 
1678  chars_in_word = word_res->reject_map.length ();
1679  page_res->char_count += chars_in_word;
1680  block_res->char_count += chars_in_word;
1681  row_res->char_count += chars_in_word;
1682 
1683  rejects_in_word = word_res->reject_map.reject_count ();
1684 
1685  page_res->rej_count += rejects_in_word;
1686  block_res->rej_count += rejects_in_word;
1687  row_res->rej_count += rejects_in_word;
1688  if (chars_in_word == rejects_in_word)
1689  row_res->whole_word_rej_count += rejects_in_word;
1690 }
int32_t rej_count
Definition: pageres.h:80
int32_t whole_word_rej_count
Definition: pageres.h:146
REJMAP reject_map
Definition: pageres.h:287
int32_t char_count
Definition: pageres.h:118
int32_t length() const
Definition: rejctmap.h:223
int16_t reject_count()
Definition: rejctmap.h:229
int32_t char_count
Definition: pageres.h:79
PAGE_RES * page_res
Definition: pageres.h:677
int32_t rej_count
Definition: pageres.h:119
int32_t char_count
Definition: pageres.h:144
int32_t rej_count
Definition: pageres.h:145

◆ ReplaceCurrentWord()

void PAGE_RES_IT::ReplaceCurrentWord ( tesseract::PointerVector< WERD_RES > *  words)

Definition at line 1322 of file pageres.cpp.

1323  {
1324  if (words->empty()) {
1326  return;
1327  }
1328  WERD_RES* input_word = word();
1329  // Set the BOL/EOL flags on the words from the input word.
1330  if (input_word->word->flag(W_BOL)) {
1331  (*words)[0]->word->set_flag(W_BOL, true);
1332  } else {
1333  (*words)[0]->word->set_blanks(input_word->word->space());
1334  }
1335  words->back()->word->set_flag(W_EOL, input_word->word->flag(W_EOL));
1336 
1337  // Move the blobs from the input word to the new set of words.
1338  // If the input word_res is a combination, then the replacements will also be
1339  // combinations, and will own their own words. If the input word_res is not a
1340  // combination, then the final replacements will not be either, (although it
1341  // is allowed for the input words to be combinations) and their words
1342  // will get put on the row list. This maintains the ownership rules.
1343  WERD_IT w_it(row()->row->word_list());
1344  if (!input_word->combination) {
1345  for (w_it.mark_cycle_pt(); !w_it.cycled_list(); w_it.forward()) {
1346  WERD* word = w_it.data();
1347  if (word == input_word->word)
1348  break;
1349  }
1350  // w_it is now set to the input_word's word.
1351  ASSERT_HOST(!w_it.cycled_list());
1352  }
1353  // Insert into the appropriate place in the ROW_RES.
1354  WERD_RES_IT wr_it(&row()->word_res_list);
1355  for (wr_it.mark_cycle_pt(); !wr_it.cycled_list(); wr_it.forward()) {
1356  WERD_RES* word = wr_it.data();
1357  if (word == input_word)
1358  break;
1359  }
1360  ASSERT_HOST(!wr_it.cycled_list());
1361  // Since we only have an estimate of the bounds between blobs, use the blob
1362  // x-middle as the determiner of where to put the blobs
1363  C_BLOB_IT src_b_it(input_word->word->cblob_list());
1364  src_b_it.sort(&C_BLOB::SortByXMiddle);
1365  C_BLOB_IT rej_b_it(input_word->word->rej_cblob_list());
1366  rej_b_it.sort(&C_BLOB::SortByXMiddle);
1367  for (int w = 0; w < words->size(); ++w) {
1368  WERD_RES* word_w = (*words)[w];
1369  // Compute blob boundaries.
1370  GenericVector<int> blob_ends;
1371  C_BLOB_LIST* next_word_blobs =
1372  w + 1 < words->size() ? (*words)[w + 1]->word->cblob_list() : nullptr;
1373  ComputeBlobEnds(*word_w, next_word_blobs, &blob_ends);
1374  // Delete the fake blobs on the current word.
1375  word_w->word->cblob_list()->clear();
1376  C_BLOB_IT dest_it(word_w->word->cblob_list());
1377  // Build the box word as we move the blobs.
1378  tesseract::BoxWord* box_word = new tesseract::BoxWord;
1379  for (int i = 0; i < blob_ends.size(); ++i) {
1380  int end_x = blob_ends[i];
1381  TBOX blob_box;
1382  // Add the blobs up to end_x.
1383  while (!src_b_it.empty() &&
1384  src_b_it.data()->bounding_box().x_middle() < end_x) {
1385  blob_box += src_b_it.data()->bounding_box();
1386  dest_it.add_after_then_move(src_b_it.extract());
1387  src_b_it.forward();
1388  }
1389  while (!rej_b_it.empty() &&
1390  rej_b_it.data()->bounding_box().x_middle() < end_x) {
1391  blob_box += rej_b_it.data()->bounding_box();
1392  dest_it.add_after_then_move(rej_b_it.extract());
1393  rej_b_it.forward();
1394  }
1395  // Clip to the previously computed bounds. Although imperfectly accurate,
1396  // it is good enough, and much more complicated to determine where else
1397  // to clip.
1398  if (i > 0 && blob_box.left() < blob_ends[i - 1])
1399  blob_box.set_left(blob_ends[i - 1]);
1400  if (blob_box.right() > end_x)
1401  blob_box.set_right(end_x);
1402  box_word->InsertBox(i, blob_box);
1403  }
1404  // Fix empty boxes. If a very joined blob sits over multiple characters,
1405  // then we will have some empty boxes from using the middle, so look for
1406  // overlaps.
1407  for (int i = 0; i < box_word->length(); ++i) {
1408  TBOX box = box_word->BlobBox(i);
1409  if (box.null_box()) {
1410  // Nothing has its middle in the bounds of this blob, so use anything
1411  // that overlaps.
1412  for (dest_it.mark_cycle_pt(); !dest_it.cycled_list();
1413  dest_it.forward()) {
1414  TBOX blob_box = dest_it.data()->bounding_box();
1415  if (blob_box.left() < blob_ends[i] &&
1416  (i == 0 || blob_box.right() >= blob_ends[i - 1])) {
1417  if (i > 0 && blob_box.left() < blob_ends[i - 1])
1418  blob_box.set_left(blob_ends[i - 1]);
1419  if (blob_box.right() > blob_ends[i])
1420  blob_box.set_right(blob_ends[i]);
1421  box_word->ChangeBox(i, blob_box);
1422  break;
1423  }
1424  }
1425  }
1426  }
1427  delete word_w->box_word;
1428  word_w->box_word = box_word;
1429  if (!input_word->combination) {
1430  // Insert word_w->word into the ROW. It doesn't own its word, so the
1431  // ROW needs to own it.
1432  w_it.add_before_stay_put(word_w->word);
1433  word_w->combination = false;
1434  }
1435  (*words)[w] = nullptr; // We are taking ownership.
1436  wr_it.add_before_stay_put(word_w);
1437  }
1438  // We have taken ownership of the words.
1439  words->clear();
1440  // Delete the current word, which has been replaced. We could just call
1441  // DeleteCurrentWord, but that would iterate both lists again, and we know
1442  // we are already in the right place.
1443  if (!input_word->combination)
1444  delete w_it.extract();
1445  delete wr_it.extract();
1447 }
int size() const
Definition: genericvector.h:71
ROW_RES * row() const
Definition: pageres.h:754
bool null_box() const
Definition: rect.h:50
Definition: rect.h:34
Definition: werd.h:35
C_BLOB_LIST * rej_cblob_list()
Definition: werd.h:93
uint8_t space()
Definition: werd.h:102
T & back() const
void ResetWordIterator()
Definition: pageres.cpp:1533
void set_right(int x)
Definition: rect.h:82
int16_t left() const
Definition: rect.h:72
bool flag(WERD_FLAGS mask) const
Definition: werd.h:126
WERD_RES * word() const
Definition: pageres.h:751
Definition: werd.h:59
bool empty() const
Definition: genericvector.h:90
Definition: werd.h:34
C_BLOB_LIST * cblob_list()
Definition: werd.h:98
void set_left(int x)
Definition: rect.h:75
bool combination
Definition: pageres.h:334
static int SortByXMiddle(const void *v1, const void *v2)
Definition: stepblob.h:125
void DeleteCurrentWord()
Definition: pageres.cpp:1450
int16_t right() const
Definition: rect.h:79
tesseract::BoxWord * box_word
Definition: pageres.h:266
#define ASSERT_HOST(x)
Definition: errcode.h:84
WERD * word
Definition: pageres.h:189

◆ ResetWordIterator()

void PAGE_RES_IT::ResetWordIterator ( )

Definition at line 1533 of file pageres.cpp.

1533  {
1534  if (row_res == next_row_res) {
1535  // Reset the member iterator so it can move forward and detect the
1536  // cycled_list state correctly.
1537  word_res_it.move_to_first();
1538  for (word_res_it.mark_cycle_pt();
1539  !word_res_it.cycled_list() && word_res_it.data() != next_word_res;
1540  word_res_it.forward()) {
1541  if (!word_res_it.data()->part_of_combo) {
1542  if (prev_row_res == row_res) prev_word_res = word_res;
1543  word_res = word_res_it.data();
1544  }
1545  }
1546  ASSERT_HOST(!word_res_it.cycled_list());
1547  word_res_it.forward();
1548  } else {
1549  // word_res_it is OK, but reset word_res and prev_word_res if needed.
1550  WERD_RES_IT wr_it(&row_res->word_res_list);
1551  for (wr_it.mark_cycle_pt(); !wr_it.cycled_list(); wr_it.forward()) {
1552  if (!wr_it.data()->part_of_combo) {
1553  if (prev_row_res == row_res) prev_word_res = word_res;
1554  word_res = wr_it.data();
1555  }
1556  }
1557  }
1558 }
WERD_RES_LIST word_res_list
Definition: pageres.h:147
#define ASSERT_HOST(x)
Definition: errcode.h:84

◆ restart_page()

WERD_RES* PAGE_RES_IT::restart_page ( )
inline

Definition at line 698 of file pageres.h.

698  {
699  return start_page(false); // Skip empty blocks.
700  }
WERD_RES * start_page(bool empty_ok)
Definition: pageres.cpp:1510

◆ restart_page_with_empties()

WERD_RES* PAGE_RES_IT::restart_page_with_empties ( )
inline

Definition at line 701 of file pageres.h.

701  {
702  return start_page(true); // Allow empty blocks.
703  }
WERD_RES * start_page(bool empty_ok)
Definition: pageres.cpp:1510

◆ restart_row()

WERD_RES * PAGE_RES_IT::restart_row ( )

Definition at line 1637 of file pageres.cpp.

1637  {
1638  ROW_RES *row = this->row();
1639  if (!row) return nullptr;
1640  for (restart_page(); this->row() != row; forward()) {
1641  // pass
1642  }
1643  return word();
1644 }
ROW_RES * row() const
Definition: pageres.h:754
WERD_RES * restart_page()
Definition: pageres.h:698
WERD_RES * word() const
Definition: pageres.h:751
WERD_RES * forward()
Definition: pageres.h:731

◆ row()

ROW_RES* PAGE_RES_IT::row ( ) const
inline

Definition at line 754 of file pageres.h.

754  { // row of current word
755  return row_res;
756  }

◆ start_page()

WERD_RES * PAGE_RES_IT::start_page ( bool  empty_ok)

Definition at line 1510 of file pageres.cpp.

1510  {
1511  block_res_it.set_to_list(&page_res->block_res_list);
1512  block_res_it.mark_cycle_pt();
1513  prev_block_res = nullptr;
1514  prev_row_res = nullptr;
1515  prev_word_res = nullptr;
1516  block_res = nullptr;
1517  row_res = nullptr;
1518  word_res = nullptr;
1519  next_block_res = nullptr;
1520  next_row_res = nullptr;
1521  next_word_res = nullptr;
1522  internal_forward(true, empty_ok);
1523  return internal_forward(false, empty_ok);
1524 }
BLOCK_RES_LIST block_res_list
Definition: pageres.h:81
PAGE_RES * page_res
Definition: pageres.h:677

◆ word()

WERD_RES* PAGE_RES_IT::word ( ) const
inline

Definition at line 751 of file pageres.h.

751  { // current word
752  return word_res;
753  }

Member Data Documentation

◆ page_res

PAGE_RES* PAGE_RES_IT::page_res

Definition at line 677 of file pageres.h.


The documentation for this class was generated from the following files: