tesseract  4.00.00dev
PAGE_RES_IT Class Reference

#include <pageres.h>

Public Member Functions

 PAGE_RES_IT ()
 
 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 659 of file pageres.h.

Constructor & Destructor Documentation

◆ PAGE_RES_IT() [1/2]

PAGE_RES_IT::PAGE_RES_IT ( )
inline

Definition at line 663 of file pageres.h.

663  {
664  } // empty contructor

◆ PAGE_RES_IT() [2/2]

PAGE_RES_IT::PAGE_RES_IT ( PAGE_RES the_page_res)
inline

Definition at line 666 of file pageres.h.

666  { // page result
667  page_res = the_page_res;
668  restart_page(); // ready to scan
669  }
WERD_RES * restart_page()
Definition: pageres.h:683
PAGE_RES * page_res
Definition: pageres.h:661

Member Function Documentation

◆ block()

BLOCK_RES* PAGE_RES_IT::block ( ) const
inline

Definition at line 742 of file pageres.h.

742  { // block of cur. word
743  return block_res;
744  }

◆ cmp()

int PAGE_RES_IT::cmp ( const PAGE_RES_IT other) const

Definition at line 1202 of file pageres.cpp.

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

◆ DeleteCurrentWord()

void PAGE_RES_IT::DeleteCurrentWord ( )

Definition at line 1451 of file pageres.cpp.

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

◆ forward()

WERD_RES* PAGE_RES_IT::forward ( )
inline

Definition at line 716 of file pageres.h.

716  { // Get next word.
717  return internal_forward(false, false);
718  }

◆ forward_block()

WERD_RES * PAGE_RES_IT::forward_block ( )

Definition at line 1668 of file pageres.cpp.

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

◆ forward_paragraph()

WERD_RES * PAGE_RES_IT::forward_paragraph ( )

Definition at line 1653 of file pageres.cpp.

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

◆ forward_with_empties()

WERD_RES* PAGE_RES_IT::forward_with_empties ( )
inline

Definition at line 720 of file pageres.h.

720  {
721  return internal_forward(false, true);
722  }

◆ InsertSimpleCloneWord()

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

Definition at line 1270 of file pageres.cpp.

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

◆ MakeCurrentWordFuzzy()

void PAGE_RES_IT::MakeCurrentWordFuzzy ( )

Definition at line 1484 of file pageres.cpp.

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

◆ next_block()

BLOCK_RES* PAGE_RES_IT::next_block ( ) const
inline

Definition at line 751 of file pageres.h.

751  { // block of next word
752  return next_block_res;
753  }

◆ next_row()

ROW_RES* PAGE_RES_IT::next_row ( ) const
inline

Definition at line 748 of file pageres.h.

748  { // row of next word
749  return next_row_res;
750  }

◆ next_word()

WERD_RES* PAGE_RES_IT::next_word ( ) const
inline

Definition at line 745 of file pageres.h.

745  { // next word
746  return next_word_res;
747  }

◆ operator!=()

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

Definition at line 675 of file pageres.h.

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

◆ operator==()

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

Definition at line 1196 of file pageres.cpp.

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

◆ prev_block()

BLOCK_RES* PAGE_RES_IT::prev_block ( ) const
inline

Definition at line 733 of file pageres.h.

733  { // block of prev word
734  return prev_block_res;
735  }

◆ prev_row()

ROW_RES* PAGE_RES_IT::prev_row ( ) const
inline

Definition at line 730 of file pageres.h.

730  { // row of prev word
731  return prev_row_res;
732  }

◆ prev_word()

WERD_RES* PAGE_RES_IT::prev_word ( ) const
inline

Definition at line 727 of file pageres.h.

727  { // previous word
728  return prev_word_res;
729  }

◆ rej_stat_word()

void PAGE_RES_IT::rej_stat_word ( )

Definition at line 1675 of file pageres.cpp.

1675  {
1676  inT16 chars_in_word;
1677  inT16 rejects_in_word = 0;
1678 
1679  chars_in_word = word_res->reject_map.length ();
1680  page_res->char_count += chars_in_word;
1681  block_res->char_count += chars_in_word;
1682  row_res->char_count += chars_in_word;
1683 
1684  rejects_in_word = word_res->reject_map.reject_count ();
1685 
1686  page_res->rej_count += rejects_in_word;
1687  block_res->rej_count += rejects_in_word;
1688  row_res->rej_count += rejects_in_word;
1689  if (chars_in_word == rejects_in_word)
1690  row_res->whole_word_rej_count += rejects_in_word;
1691 }
inT32 rej_count
Definition: pageres.h:129
inT32 char_count
Definition: pageres.h:60
inT32 rej_count
Definition: pageres.h:61
int16_t inT16
Definition: host.h:36
inT32 length() const
Definition: rejctmap.h:235
inT32 whole_word_rej_count
Definition: pageres.h:130
PAGE_RES * page_res
Definition: pageres.h:661
inT16 reject_count()
Definition: rejctmap.h:241
inT32 rej_count
Definition: pageres.h:101
inT32 char_count
Definition: pageres.h:128
inT32 char_count
Definition: pageres.h:100
REJMAP reject_map
Definition: pageres.h:271

◆ ReplaceCurrentWord()

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

Definition at line 1323 of file pageres.cpp.

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

◆ ResetWordIterator()

void PAGE_RES_IT::ResetWordIterator ( )

Definition at line 1534 of file pageres.cpp.

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

◆ restart_page()

WERD_RES* PAGE_RES_IT::restart_page ( )
inline

Definition at line 683 of file pageres.h.

683  {
684  return start_page(false); // Skip empty blocks.
685  }
WERD_RES * start_page(bool empty_ok)
Definition: pageres.cpp:1511

◆ restart_page_with_empties()

WERD_RES* PAGE_RES_IT::restart_page_with_empties ( )
inline

Definition at line 686 of file pageres.h.

686  {
687  return start_page(true); // Allow empty blocks.
688  }
WERD_RES * start_page(bool empty_ok)
Definition: pageres.cpp:1511

◆ restart_row()

WERD_RES * PAGE_RES_IT::restart_row ( )

Definition at line 1638 of file pageres.cpp.

1638  {
1639  ROW_RES *row = this->row();
1640  if (!row) return NULL;
1641  for (restart_page(); this->row() != row; forward()) {
1642  // pass
1643  }
1644  return word();
1645 }
ROW_RES * row() const
Definition: pageres.h:739
WERD_RES * restart_page()
Definition: pageres.h:683
WERD_RES * forward()
Definition: pageres.h:716
WERD_RES * word() const
Definition: pageres.h:736

◆ row()

ROW_RES* PAGE_RES_IT::row ( ) const
inline

Definition at line 739 of file pageres.h.

739  { // row of current word
740  return row_res;
741  }

◆ start_page()

WERD_RES * PAGE_RES_IT::start_page ( bool  empty_ok)

Definition at line 1511 of file pageres.cpp.

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

◆ word()

WERD_RES* PAGE_RES_IT::word ( ) const
inline

Definition at line 736 of file pageres.h.

736  { // current word
737  return word_res;
738  }

Member Data Documentation

◆ page_res

PAGE_RES* PAGE_RES_IT::page_res

Definition at line 661 of file pageres.h.


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