reference/ocr-new/Page.cc
author viric@llimona
Thu, 18 May 2006 23:12:51 +0200
changeset 0 6b8091ca909a
permissions -rw-r--r--
Init from working directory of svn repository.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     1
/** Page.cc contains the member functions for the primary OCR class Page */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     2
#include "system.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     3
#include "Page.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     4
#include "convertMap.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     5
#include "get_skew.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     6
#include "Component.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     7
#include "status_message.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     8
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     9
/*** Member functions of class Page.     ***/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    10
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    11
int Page::get_height()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    12
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    13
  return fRLEMap->imageLength();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    14
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    15
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    16
int Page::get_width()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    17
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    18
  return fRLEMap->imageWidth();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    19
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    20
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    21
int Page::get_linenum(int col, int row)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    22
 /*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    23
Primary Purpose: Returns line number of x,y coordinates (just uses y for now)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    24
                 called from proc equation_mark in new_ui.tcl
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    25
Return value: line number or -1 if no line is here.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    26
Requires: setLines be run first
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    27
Rev: 4/21/96
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    28
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    29
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    30
  assert (flineinfo != NULL);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    31
  int linenum= -1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    32
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    33
  for (int i = 0; i < fnumLines; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    34
    if (flineinfo[i].fstartrow <= row && flineinfo[i].fendrow >= row)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    35
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    36
	linenum = i;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    37
	if (ENABLE_USER_INTERFACE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    38
	  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    39
	    // save last mark before it is overwritten
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    40
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    41
	    docommand("set curline %d",linenum);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    42
	    docommand("set curline_startrow %d",flineinfo[i].fstartrow);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    43
	    docommand("set curline_endrow %d",flineinfo[i].fendrow);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    44
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    45
	    
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    46
	    // this will change with zoning
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    47
	    docommand("set curline_startcol %d",0);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    48
	    docommand("set curline_endcol %d",get_width());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    49
	      
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    50
	  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    51
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    52
	break;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    53
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    54
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    55
return linenum;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    56
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    57
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    58
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    59
int Page::send_words_to_tcl()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    60
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    61
Primary Purpose:  Display words in tcl
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    62
Rev - AR
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    63
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    64
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    65
  int word_count = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    66
  int unknown_char_count = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    67
  int low_precision_count = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    68
  int mispelled_count = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    69
  char* send_chars;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    70
  Word* temp_word;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    71
  if(ENABLE_USER_INTERFACE) set_status("Displaying text");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    72
  for(ListElement* ptr = (words())->first; ptr != NULL; ptr = ptr->next)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    73
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    74
      word_count++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    75
      set_text_display_status(word_count, fWordList->num_words);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    76
      temp_word = (Word*)ptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    77
      send_chars = backslashify(temp_word->characters);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    78
      /*	printf("Added word %s Confidence = %d\n", send_chars, 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    79
	       temp_word->confid); */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    80
      if(temp_word->confid < VERY_LOW_CONFIDENCE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    81
	  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    82
	    docommand("addword \"%s\" %d %d UNKNOWN_CHAR", send_chars, temp_word->ul.x(),  temp_word->ul.y());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    83
	    unknown_char_count++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    84
	  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    85
      else if(temp_word->confid < LOW_CONFIDENCE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    86
	  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    87
	    docommand("addword \"%s\" %d %d LOW_PRECISION", send_chars, temp_word->ul.x(),  temp_word->ul.y());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    88
	    low_precision_count++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    89
	  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    90
      else if((temp_word->mispelled) && SPELLCHECK)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    91
	  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    92
	    docommand("addword \"%s\" %d %d MISPELLED", send_chars, temp_word->ul.x(),  temp_word->ul.y());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    93
	    mispelled_count++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    94
	  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    95
      else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    96
	  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    97
	    docommand("addword \"%s\" %d %d OK", send_chars, temp_word->ul.x(),  temp_word->ul.y());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    98
	  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    99
      update();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   100
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   101
  if(ENABLE_USER_INTERFACE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   102
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   103
    set_status("Done displaying text");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   104
    set_status("Apparent word accuracy: %.3lf%%", (100 - (100 * ((double)(mispelled_count + unknown_char_count + low_precision_count) / (double)word_count))));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   105
  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   106
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   107
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   108
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   109
int Page::deskew(int deskew_method)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   110
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   111
Primary Purpose: Deskew the page
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   112
Arguments: 1 - RLE Rotation
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   113
           0 - BitMap Rotation
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   114
Return Value: 1 if successful, 0 if unsuccessful
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   115
Effects: updates the bitmap and rlemap of the page
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   116
Constraints: RLEMap Rotation is not currently reliable and probably
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   117
should not be used
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   118
Rev: AR
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   119
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   120
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   121
  /* a little ugly.... if the page is rotated
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   122
     in here, return 1, else 0 */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   123
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   124
  if(deskew_method == RLE_DESKEW)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   125
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   126
	if(fRLEMap->deskew())
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   127
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   128
	  convertMap(fRLEMap, fBitMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   129
	  return 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   130
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   131
	return 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   132
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   133
  else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   134
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   135
      double skew = get_skew(fRLEMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   136
      if((skew >= MINIMUM_SKEW_ANGLE)||(skew <= - MINIMUM_SKEW_ANGLE))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   137
	  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   138
	    fBitMap->rotateMap(skew);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   139
	    convertMap(fBitMap, fRLEMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   140
	    return 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   141
	  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   142
      return 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   143
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   144
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   145
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   146
Page::Page()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   147
/**Page::Page - constructor allocates bitmap and rlemap*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   148
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   149
  fBitMap = new BitMap;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   150
  fRLEMap = new RLEMap;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   151
  fEqnList = new EqnMarkers;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   152
  fLineComponents = NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   153
  fWordList = NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   154
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   155
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   156
Page::~Page()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   157
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   158
Primary Purpose:  Destructor deallocates private fields that
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   159
have been created.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   160
Rev:
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   161
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   162
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   163
 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   164
  if (flineinfo) delete flineinfo;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   165
  for (int  i = 0; i <fnumLines; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   166
        if(fLineComponents[i] != NULL) delete fLineComponents[i];
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   167
  if(fLineComponents) delete fLineComponents;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   168
  if (fBitMap) delete fBitMap;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   169
  if (fRLEMap) delete fRLEMap;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   170
  if (fWordList) delete fWordList;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   171
  if (fEqnList) delete fEqnList;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   172
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   173
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   174
Angle Page::skewAngle()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   175
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   176
Primary Purpose: Determine the angle of rotation of the RLEMap r
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   177
Arguments: pointer to an RLEMap
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   178
Return Value: detected angle of rotation
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   179
Code is in get_skew.cc
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   180
Rev: AR
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   181
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   182
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   183
  return get_skew(fRLEMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   184
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   185
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   186
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   187
MapStatus Page::readMap(char * filename)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   188
 // Calls BitMap::readMap and then converts
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   189
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   190
  MapStatus status;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   191
  status = fBitMap->readMap(filename);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   192
  convertMap(fBitMap, fRLEMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   193
  return status;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   194
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   195
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   196
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   197
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   198
MapStatus Page::setLines()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   199
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   200
Primary Purpose:  Set flineinfo array in Page class with the 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   201
      starting and ending rows of each line of text.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   202
      Also sets fnumLines to the number of lines
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   203
Arguments: none
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   204
Return Value: A Mapstatus either VALID, EMPTY if there is no
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   205
   data in the RLEMAP, or OTHERERROR if there is an unexpected error
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   206
Effects:  Allocates flineinfo and fills with starting and ending row
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   207
   of each line.  The following global variables are used as parameters
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   208
   in this function.  These are defined in system.cc
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   209
   NoiseTolerance - Rows whose number of pixels is less than  this value
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   210
                will be considered empty (current val 6). 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   211
   MinVertSeparation - The minimum number of rows separating lines of text.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   212
                 Lines will be merged if actual Separation is less than this
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   213
		 value. (current val 3)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   214
   MinLineSize - The minimum number of rows in a line of text.  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   215
                 Any smaller lines are discarded (currentval 5)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   216
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   217
Constraints: Page::readMap() must be run first to fill fRLEMap 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   218
Rev: 10/26 KM
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   219
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   220
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   221
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   222
   int maxrow = fRLEMap->imageLength() - 1;      // maximum row number 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   223
   int actualSeparation = MinVertSeparation + 1; // must be bigger than min
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   224
                                                 // for line 0
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   225
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   226
   int linenum=0;                                // current line number
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   227
   int prvlinenum = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   228
   int lineSize;                                 // # rows in current line 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   229
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   230
   int maxLines = maxrow/MinLineSize;           // max # of lines of text 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   231
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   232
   if(maxrow == 0) return EMPTY;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   233
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   234
   flineinfo = new LineMarker[maxLines]; 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   235
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   236
   for (int i = 0; i < maxrow;)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   237
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   238
	  LineMarker & thisLine = flineinfo[linenum];
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   239
	  LineMarker & prevLine = flineinfo[prvlinenum];
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   240
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   241
	  while (i < maxrow && fRLEMap->row(i)->numPixels < NoiseTolerance)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   242
	    i++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   243
	  thisLine.fstartrow = i++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   244
	  while (i < maxrow &&fRLEMap->row(i)->numPixels > NoiseTolerance)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   245
	    i++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   246
	  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   247
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   248
	  lineSize = i - thisLine.fstartrow +1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   249
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   250
	  // If this line is less than MinVertSeparation away
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   251
	  //  from the last line.  Join the two together.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   252
	  if (linenum > 0)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   253
	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   254
	      actualSeparation = thisLine.fstartrow - prevLine.fendrow;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   255
	    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   256
	  if (actualSeparation < MinVertSeparation)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   257
	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   258
	     // If too small of a separation, add into prev row
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   259
	     prevLine.fendrow = i;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   260
	   }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   261
	  else if (lineSize >= MinLineSize)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   262
	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   263
	    thisLine.fendrow = i;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   264
/*	    printf (" Line %d  Start: %d  End: %d  lineHeight %d\n", 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   265
	        linenum,thisLine.fstartrow,
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   266
	        thisLine.fendrow, 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   267
	        thisLine.fendrow  - thisLine.fstartrow +1);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   268
*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   269
	    prvlinenum = linenum;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   270
	    linenum++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   271
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   272
	  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   273
	  if (linenum >= maxLines) return OTHERERROR;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   274
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   275
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   276
   fnumLines = linenum;   // Set number of lines in page class
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   277
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   278
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   279
   if((ENABLE_USER_INTERFACE) && DISPLAY_LINE_BOUNDARIES)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   280
     {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   281
       display_line_boundaries();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   282
     }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   283
   /*   printf("Setlines found a total of %d lines.\n", fnumLines); */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   284
   if(ENABLE_USER_INTERFACE) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   285
     update(); 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   286
   return VALID;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   287
 }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   288
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   289
void Page::display_line_boundaries()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   290
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   291
Primary Purpose: Display line boundaries in TCL/TK.  Called from
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   292
setLines if ENABLE_USER_INTERFACE and DISPLAY_LINE_BOUNDARIES are
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   293
set to TRUE
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   294
Effects:  Draws a blue line between each line of text
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   295
Rev:  AR
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   296
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   297
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   298
  int centerline, width;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   299
  for(int j=0; j < fnumLines; j++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   300
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   301
      centerline = (flineinfo[j].fendrow + flineinfo[j + 1].fstartrow) / 2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   302
      width = flineinfo[j + 1].fstartrow - flineinfo[j].fendrow;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   303
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   304
      scale(centerline);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   305
      scale(width);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   306
      /* having this pathname here is probably not such a good idea...*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   307
      
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   308
      docommand(".main_window.display.work_space create line %d %d %d %d -width %d -fill blue -tags {project_ray IMAGE_TAG} -stipple @/usr/sww/share/tclX-7.3a/tkX/3.6a/demos/bitmaps/grey.25", 0, centerline, bmap()->imageWidth(), centerline, width);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   309
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   310
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   311
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   312
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   313
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   314
int test_rlemap_lines(RLEMap* rmap)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   315
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   316
  int length = rmap->imageLength();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   317
  for(int i = 0; i < length; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   318
    printf("On line %d, numpixels = %d\n", i, rmap->fMapData[i]->numPixels);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   319
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   320
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   321
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   322
MapStatus Page::extractComponents(int horizMerge)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   323
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   324
                     Component extraction routines.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   325
*
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   326
* Given the top and bottom line of a row we want to generate a list of
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   327
* components. The general method is to find the closest dot, trace its 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   328
* connected dots, then project upwards and downwards and add anything we 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   329
* find there to the component. We will erase the component from the RLEMap
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   330
* as it is added to the component list. By projecting up and down 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   331
* from the piece we first find we should be able
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   332
* to completely encompass characters like :;i?|! The only problems are 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   333
* italic or ligatured characters where we may pick up two or more 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   334
* characters at a time (which would be bad) or characters fragmented 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   335
* with a vertical gap.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   336
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   337
Primary Purpose: Main extraction routine.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   338
Effects: Makes new components and puts them in a list. Deletes components 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   339
         from RLE map. Fills in component boundaries and calls 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   340
	 Component::setProperties to set the property vector
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   341
         Lastly convertMap is run to rebuild the RLEMap
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   342
Constraints: Page::setLines() must be run first 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   343
Rev: 4/28/96
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   344
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   345
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   346
  int currentCol, startRow, endRow, rowHeight;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   347
  ListElement* intrvl;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   348
  ListElement* tempintrvl;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   349
  /*  printf("fnumLines = %d\n", fnumLines); */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   350
  Component* comp;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   351
  int  totalSpacing = 0;  // total blank horizontal pixels between components
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   352
  int  baselines[MaxVertSize];     // array for finding the baseline
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   353
  last_status = 0.0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   354
  int compCounter = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   355
  int i;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   356
  int j;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   357
  int upwardBound;      // Projection distances different for equations
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   358
  int downwardBound;    // and non-equations
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   359
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   360
 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   361
  bool inEqn;          // Variables for finding if the center of a comp
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   362
  int centerx;         // is in an equation.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   363
  int centery;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   364
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   365
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   366
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   367
    printf("Extracting Components\n");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   368
   fLineComponents = new Components*[fnumLines];
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   369
  for (i = 0; i < fnumLines; i++) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   370
    if(ENABLE_USER_INTERFACE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   371
      set_component_status(i, fnumLines);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   372
    currentCol = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   373
    startRow = flineinfo[i].fstartrow;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   374
    endRow = flineinfo[i].fendrow;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   375
    rowHeight = endRow - startRow;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   376
    assert(rowHeight > 0);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   377
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   378
    for (j=0; j < MaxVertSize; j++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   379
      baselines[j] = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   380
    fLineComponents[i] = new Components();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   381
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   382
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   383
    while (currentCol<=fRLEMap->imageWidth()) {  //until we reach the end of the page
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   384
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   385
	//Build component starting with closest black dot
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   386
	intrvl = fRLEMap->FindNearHorizDot(currentCol, startRow, endRow);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   387
	if (intrvl == NULL) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   388
	//  printf("Reached end of line\n");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   389
	  break;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   390
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   391
	comp = new Component(); //Make a new component named comp
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   392
	assert(comp->AddToComponent(intrvl, fRLEMap, horizMerge));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   393
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   394
	//Now we want to extend upwards 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   395
	//First check if there is a blank space to the right 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   396
	tempintrvl =
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   397
	  fRLEMap->FindNearHorizDot(comp->lr().x(), startRow, endRow);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   398
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   399
	
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   400
	if (tempintrvl != NULL && ((RLEPair*) tempintrvl->item)->start > 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   401
	    comp->lr().x()+horizMerge+1)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   402
	  while (comp->ul().y() < endRow) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   403
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   404
	// find the center of the component to check if we are in an equation
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   405
	centerx = (comp->ul().x() + comp->lr().x())/2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   406
	centery = (comp->ul().y() + comp->lr().y())/2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   407
 	inEqn = inEquation(centerx, centery);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   408
	// Determine projection distance.  Only project for non Equations.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   409
	if(inEqn)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   410
	  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   411
	    upwardBound = comp->ul().y()+1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   412
	    downwardBound = comp->lr().y() - 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   413
	  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   414
	else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   415
	  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   416
	    upwardBound = startRow;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   417
	    downwardBound = endRow;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   418
	  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   419
	    intrvl = fRLEMap->FindNearVertDot(comp->ul().x(), 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   420
					      comp->lr().x(), comp->lr().y(),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   421
					      upwardBound);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   422
					      //  startRow);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   423
	    if ((intrvl != NULL) && (!comp->AddToComponent(intrvl, fRLEMap,
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   424
							   horizMerge)))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   425
	      break;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   426
	    if (intrvl == NULL) break;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   427
	  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   428
	else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   429
	  while (comp->ul().y() < endRow) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   430
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   431
       	// find the center of the component to check if we are in an equation
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   432
	    centerx = (comp->ul().x() + comp->lr().x())/2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   433
	    centery = (comp->ul().y() + comp->lr().y())/2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   434
	    inEqn = inEquation(centerx, centery);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   435
	    // Determine projection distance.  Only project for non Equations.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   436
	    if(inEqn)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   437
	      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   438
		upwardBound = comp->ul().y()+1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   439
		downwardBound = comp->lr().y() - 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   440
	      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   441
	    else // regular text
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   442
	      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   443
		upwardBound = startRow;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   444
		downwardBound = endRow;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   445
	      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   446
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   447
	    intrvl = fRLEMap->FindNearVertDot(comp->ul().x(), 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   448
					      comp->lr().x(), comp->ul().y(),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   449
					      upwardBound);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   450
					      // startRow);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   451
	    if ((intrvl != NULL) && (!comp->AddToComponent(intrvl, fRLEMap, 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   452
							   horizMerge)));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   453
	    break;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   454
	    if (intrvl == NULL) break;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   455
	  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   456
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   457
	//Now we want to extend downwards
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   458
	while (comp->lr().y() > startRow) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   459
	  intrvl = fRLEMap->FindNearVertDot(comp->ul().x(), comp->lr().x(), 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   460
						    comp->lr().y(), downwardBound);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   461
	  if ((intrvl != NULL) && (!comp->AddToComponent(intrvl, fRLEMap,
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   462
							 horizMerge)))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   463
	    break;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   464
	  if (intrvl == NULL) break;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   465
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   466
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   467
	// Now we toss out the noise
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   468
	int size;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   469
	if (comp != NULL) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   470
	  if (comp->ul() < Point(0,0))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   471
	    printf("Here's a problem. %d, %d\n", comp->ul().x(), comp->ul().y());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   472
	  else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   473
	    size = fBitMap->pixelsInRegion(comp->ul(), comp->lr());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   474
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   475
	  else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   476
	    size = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   477
	Component * prev = (Component *)(fLineComponents[i]->last->item);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   478
	if (size < MinComponentSize) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   479
//	  printf("Deleting some noise of size %d\n", size);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   480
	  // printComponent(comp);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   481
	  delete comp;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   482
	  comp = NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   483
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   484
	else if (prev != NULL && 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   485
		 abs(comp->ul().x() - prev->ul().x()) <= 1 &&
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   486
 	         abs(comp->lr().x() == prev->lr().x()) <= 1)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   487
	  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   488
	    // Check and see if this and the previous component have the
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   489
	    // same x boundaries, if so merge the two.  Good for = and :
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   490
	    prev->join(comp);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   491
	    prev->setProperties(fBitMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   492
	    delete comp;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   493
	    comp ==NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   494
	  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   495
	else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   496
	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   497
	      compCounter++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   498
	      // display a rectangle around the component
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   499
	      if(ENABLE_USER_INTERFACE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   500
		  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   501
		    if(DISPLAY_BOUNDING_BOXES)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   502
		      comp->display_bounding_box();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   503
		  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   504
	  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   505
	  // JMH - make an array of frequency of the y coord of bottom of comp
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   506
	      int vertOffset = endRow - comp->lr().y();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   507
	      if(vertOffset < MaxVertSize && vertOffset >= 0)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   508
		baselines[vertOffset]++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   509
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   510
	  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   511
	      comp->setProperties(fBitMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   512
	      if(fLineComponents[i]->last != NULL)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   513
		{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   514
		  int thisSpacing = comp->ul().x() - 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   515
		    ((Component *) (fLineComponents[i]->last->item))->lr().x();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   516
		  // if a realy big space, make space the width of this comp
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   517
		  if (thisSpacing > 200) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   518
		  thisSpacing = 2*(comp->lr().x() - comp->ul().x());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   519
		totalSpacing += thisSpacing;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   520
		}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   521
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   522
	      fLineComponents[i]->Append(comp);       // add this component to list
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   523
	      currentCol = (comp->ul()).x() + 1;   // update position on page
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   524
	    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   525
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   526
    
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   527
    // find most popular bottom of comp and call it the baseline
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   528
    int counter = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   529
    int baseline;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   530
    for (j=0; j < MaxVertSize; j++) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   531
      if (counter < baselines[j]) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   532
	counter = baselines[j];
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   533
	baseline = endRow - j;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   534
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   535
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   536
    //    printf("For row %d to %d baseline = %d\n", startRow, endRow, baseline);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   537
    // Now assign each character a group based on it's location
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   538
    for (ListElement* ptr = fLineComponents[i]->first; ptr != NULL; 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   539
	 ptr = ptr->next) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   540
      comp = (Component*) ptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   541
      comp->charGroup = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   542
      
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   543
      // if top of char is higher than top - tolerance 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   544
      if (comp->ul().y() < startRow + (rowHeight/TopLineTolerance)) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   545
	comp->charGroup += 2; //tall like a T
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   546
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   547
      
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   548
      // if bottom of char is lower than base - tolerance
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   549
      if (comp->lr().y() > baseline + (rowHeight/BaseLineTolerance)) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   550
	comp->charGroup += 1; //has a tail like a y
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   551
      } else 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   552
	if (comp->lr().y() < (baseline - (2*rowHeight/BaseLineTolerance))) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   553
	  comp->charGroup = 4; //floating like a '
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   554
	  /*	  printf("bottom at %d < %d\n", comp->lr().y(),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   555
		  baseline - (2*rowHeight/BaseLineTolerance)); */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   556
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   557
      //      printf("added character in group %d\n", comp->charGroup);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   558
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   559
  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   560
  /*  printf("Found %d components on this page.\n", compCounter); */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   561
  //  printComponents();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   562
  last_status = 0.0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   563
  if(ENABLE_USER_INTERFACE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   564
    set_status("Done extracting characters");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   565
  if((compCounter - fnumLines) > 0) /* don't want divide by zero */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   566
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   567
      favgSpacing = totalSpacing / (compCounter - fnumLines);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   568
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   569
  else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   570
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   571
      favgSpacing = 1;  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   572
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   573
  delete fRLEMap;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   574
  fRLEMap = new RLEMap;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   575
  convertMap(fBitMap, fRLEMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   576
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   577
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   578
void Page::printComponents()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   579
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   580
Primary Purpose: Debugging routine that prints little bitmaps
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   581
of low confidence characters
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   582
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   583
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   584
  int compcounter = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   585
  for (int i = 0; i < fnumLines; i++) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   586
    Component* comp;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   587
    for (ListElement* ptr = fLineComponents[i]->first; ptr != NULL; 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   588
	 ptr = ptr->next) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   589
      compcounter++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   590
      comp = (Component *) ptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   591
      if (comp->confid() < (ConfidenceThreshold-20) && comp->asciiId() == 'n')
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   592
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   593
	printf("Here's a poorly recognized component ul=%d,%d, lr=%d,%d.\n\n", 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   594
	   (comp->ul()).x(), (comp->ul()).y(),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   595
	   (comp->lr()).x(), (comp->lr()).y());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   596
	printComponent(comp);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   597
	printf("properties: "); 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   598
	printVector(comp->properties(), numProperties);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   599
	printf("I think it's a -> %c <-   confidence: %d  line: %d  group: %d Comp#%d\n",
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   600
	       comp->asciiId(),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   601
	       comp->confid(), i+1, comp->charGroup, compcounter);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   602
	printf("\n*******************************************************\n");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   603
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   604
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   605
  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   606
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   607
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   608
void Page::printComponent(Component* comp)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   609
// Print a single component.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   610
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   611
  int right = comp->ul().x()+78;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   612
  if (comp->lr().x() < right) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   613
    right = comp->lr().x();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   614
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   615
  for (int r = comp->ul().y(); 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   616
       r <= comp->lr().y(); r++){
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   617
    for (int c = comp->ul().x();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   618
	 c <= right; c++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   619
      bitprint(fBitMap->row(r)[c/8], c%8);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   620
    printf( "\n");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   621
  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   622
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   623
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   624
int spacing(ListElement * compa, ListElement * compb);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   625
// helper function for extractWords  (defined below)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   626
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   627
MapStatus Page::extractWords()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   628
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   629
Primary Purpose: Extract words from each lines components
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   630
Effects: sets the fWordsList to be a list of all of the words
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   631
in the document.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   632
Constraints: extractComponents must be run first
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   633
Rev: KM 11/7/95
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   634
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   635
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   636
  bool inWord;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   637
  ListElement * start;   // word Start
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   638
  int count;   // counts the components in the word
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   639
  int wordlength; // counts the characters in the word
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   640
  int word_count = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   641
  int spacingThreshold = (int) (1.25 * ((float) (favgSpacing)));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   642
  fWordList = new Words;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   643
  last_status = 0.0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   644
  for (int i = 0; i < fnumLines; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   645
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   646
	if(ENABLE_USER_INTERFACE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   647
	  set_extract_status(i, fnumLines);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   648
	inWord = FALSE;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   649
	for(ListElement *ptr = line(i)->first; ptr != NULL; ptr = ptr->next) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   650
	  Component * item = (Component *) ptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   651
	  if(!inWord)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   652
	      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   653
		start = ptr;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   654
		count = 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   655
		if (item->fasciiId == NULL) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   656
		  wordlength = 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   657
		else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   658
		  wordlength = strlen(item->fasciiId);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   659
		inWord = TRUE;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   660
	      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   661
	  if( spacing(ptr, ptr->next) > spacingThreshold || 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   662
	      inEquation( ptr)) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   663
	      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   664
		Word * newWord = new Word(start,count,wordlength);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   665
		(words())->Append(newWord);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   666
		if(1)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   667
		  printf("%s ",newWord->characters);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   668
		inWord = FALSE;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   669
		word_count++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   670
	      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   671
	  else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   672
	    count++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   673
	    if (item->fasciiId == NULL) wordlength ++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   674
	    else wordlength += strlen(item->fasciiId);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   675
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   676
	// Add in a separate word for new line
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   677
	Word * newWord = new Word("\n",2);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   678
        (words())->Append(newWord);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   679
	printf("%s", newWord->characters);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   680
	word_count++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   681
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   682
  last_status = 0.0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   683
  fWordList->num_words = word_count;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   684
  if(ENABLE_USER_INTERFACE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   685
    set_status("Done extracting words");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   686
  return VALID;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   687
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   688
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   689
void Page::spellcheck()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   690
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   691
Primary Purpose: Run spell checker on word list.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   692
Constraints: extractWords must be run first
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   693
Rev: AR
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   694
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   695
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   696
  int word_count = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   697
  Word* temp_word;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   698
  for(ListElement* ptr = (words())->first; ptr != NULL; ptr = ptr->next)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   699
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   700
      word_count++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   701
      if(ENABLE_USER_INTERFACE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   702
	set_spellcheck_status(word_count, fWordList->num_words);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   703
      temp_word = (Word*)ptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   704
      if(0)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   705
	printf("Spellchecking word %s\n", temp_word->characters);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   706
      if(mispelled(temp_word->characters))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   707
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   708
	  temp_word->mispelled = TRUE;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   709
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   710
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   711
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   712
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   713
int Page::spacing(ListElement * compa, ListElement * compb)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   714
// spacing from end of comp_a to begining of comp_b
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   715
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   716
  int x;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   717
  if (compb == NULL) return 1000;  // end of line
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   718
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   719
  Component * a = ((Component *) (compa)->item);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   720
  Component * b = ((Component *) (compb)->item);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   721
  int returnval =  (b->ul().x() - a->lr().x());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   722
  if (returnval < 0) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   723
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   724
      return 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   725
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   726
  assert (returnval >= 0);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   727
  return returnval;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   728
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   729
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   730
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   731
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   732
void Page::printWords()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   733
// Prits out each component of each word. This can take a very long time
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   734
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   735
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   736
  Word * thisWord;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   737
  for (ListElement * ptr = words()->first; ptr !=NULL; ptr= ptr->next)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   738
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   739
	thisWord = (Word *) ptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   740
	printf("!!!!!! NEW WORD  %s  confid : %d !!!!!\n", thisWord->characters, thisWord->confid);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   741
	for(int i = 0; i < thisWord->charCount; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   742
	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   743
	      Component * comp = thisWord->character[i];
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   744
	      if (comp == NULL) continue;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   745
	      printf("Printing a component ul=%d,%d, lr=%d,%d.\n\n", 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   746
		     (comp->ul()).x(), (comp->ul()).y(),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   747
		     (comp->lr()).x(), (comp->lr()).y());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   748
	      for (int r = comp->ul().y(); 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   749
		   r <= comp->lr().y(); r++){
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   750
		for (int c = comp->ul().x();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   751
		     c <= comp->lr().x(); c++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   752
		  bitprint(fBitMap->row(r)[c/8], c%8);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   753
		printf( "\n");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   754
	      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   755
	      printf("properties: "); 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   756
	      printVector(comp->properties(), numProperties);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   757
	      printf("Identification:  %c distance: %d confidence %d\n",
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   758
		     comp->asciiId(),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   759
		     comp->distance(&LearnedChars[comp->asciiId()]),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   760
	             comp->confid());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   761
	      printf("\n***********************************************\n");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   762
	    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   763
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   764
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   765
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   766
MapStatus Page::recognize()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   767
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   768
Primary Purpose: Recognize entire page.  Sets font and ascii id of
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   769
each component
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   770
Return Value: VALID if no error occurred OTHERERROR otherwise
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   771
Constraints: extractComponents must be run first.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   772
See recognize(line) below for more detailed info
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   773
Rev: KM
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   774
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   775
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   776
  printf("Recognizing document\n");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   777
  last_status = 0.0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   778
  for (int i = 0; i< fnumLines; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   779
      { 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   780
	if(ENABLE_USER_INTERFACE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   781
	  set_recognize_status(i, fnumLines);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   782
	recognize(i);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   783
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   784
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   785
  last_status = 0.0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   786
  return VALID;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   787
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   788
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   789
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   790
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   791
MapStatus Page::recognize(int linenum)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   792
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   793
Primary Purpose: Recognize a line of connected components
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   794
Arguments:  linenum is line number to recognize
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   795
Effects: sets ascii identification fontid and confidence in each component
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   796
If confidence is low and character is big enough for two characters.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   797
divideAndRecognize is called to split up the component.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   798
Constraints: extractComponents must be run first
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   799
Rev: KM 11/9/95
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   800
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   801
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   802
  Component * comp;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   803
  Distance d;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   804
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   805
  for(ListElement *ptr = line(linenum)->first; ptr != NULL; ptr = ptr->next) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   806
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   807
	comp = (Component *) ptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   808
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   809
	d = comp->recognize(LearnedGroups);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   810
	if (comp->confid() < ConfidenceThreshold && 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   811
	    comp->width() > 2*MinWidth) // really wide
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   812
	  divideAndRecognize(line(linenum), ptr, d);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   813
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   814
	/***	
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   815
	if (comp->confid() < ConfidenceThreshold || 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   816
	    (ptr !=  line(linenum)->first &&
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   817
	    ((Component *) ptr->previous->item)->confid() < ConfidenceThreshold))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   818
	  uniteAndRecognize(line(linenum), ptr, d);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   819
	  ***/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   820
	  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   821
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   822
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   823
  return VALID;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   824
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   825
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   826
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   827
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   828
void Page::divideAndRecognize (Components *list, ListElement * ptr, Distance d)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   829
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   830
Primary Purpose: Identify and separate merged characters
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   831
Arguments:ptr is a pointer to a list element containing a component
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   832
          d is the current recognition distance on the component
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   833
Effects: Subdivides component into two parts, Division is made at
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   834
         the minimum vertical height of the component.  If the 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   835
	 minHeight > JoinTolerance no divison will be made.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   836
	 (JoinTolerance is a global var that determines
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   837
	 the maximum number of merged pixels that are allowed in a
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   838
	 column for a division to be made)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   839
	 When a division is made.  The component's boundaries are 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   840
	 adjusted accordingly and a new component is inserted into
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   841
	 the list.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   842
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   843
	 Returns if distance is acceptable or width of component
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   844
	 is <= MinWidth*2
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   845
Rev: KM 11/24/95
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   846
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   847
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   848
  Component * comp = (Component *) ptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   849
  Component * newComp;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   850
  bool allGroups = TRUE;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   851
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   852
  // Save the original component boundaries just in case we cant improve
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   853
  Point oldlr = comp->lr();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   854
  Point oldul = comp->ul();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   855
  int oldwidth = (int) comp->width();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   856
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   857
  // Some easy access x,y coordinates
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   858
  int ulx = comp->ul().x();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   859
  int uly = comp->ul().y();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   860
  int lrx = comp->lr().x();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   861
  int lry = comp->lr().y();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   862
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   863
  Distance newdist, bestdist;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   864
  int bestlrx;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   865
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   866
  if (comp->confid() > ConfidenceThreshold)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   867
    return;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   868
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   869
  if (oldwidth < MinWidth*2)  // cant be split in two
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   870
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   871
	return;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   872
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   873
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   874
  // Determine where to split.  Split at the thinnest point
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   875
  // within JoinTolerance (maximum number of pixels that might be fused)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   876
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   877
  int minHeight = (int)comp->height();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   878
  bestlrx = comp->lr().x();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   879
  for(int i = MinWidth; i < oldwidth - MinWidth; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   880
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   881
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   882
	int newHeight = 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   883
	  fBitMap->pixelsInRegion(Point(ulx+i,uly), Point(ulx+i,lry));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   884
	if (newHeight < minHeight)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   885
	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   886
	      minHeight = newHeight;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   887
	      bestlrx = ulx+i;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   888
	    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   889
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   890
//  printf("bestlrx = %d, minHeight = %d\n", bestlrx, minHeight);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   891
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   892
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   893
  if (bestlrx < lrx  && minHeight < JoinTolerance)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   894
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   895
	comp->lr().x() = bestlrx;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   896
	int shrunk = comp->vertShrink(fBitMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   897
	comp->setProperties(fBitMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   898
	if (shrunk)  // ignore group if we had to shrink down
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   899
	  newdist = comp->recognize(LearnedGroups, allGroups);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   900
	else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   901
	  newdist = comp->recognize(LearnedGroups);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   902
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   903
//	printf("Distance = %u  asciiid = %c \n", newdist, comp->asciiId());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   904
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   905
	Component * newcomp = new Component(Point(bestlrx+1, oldul.y())
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   906
					    , oldlr);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   907
	newcomp->vertShrink(fBitMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   908
	newcomp->setProperties(fBitMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   909
	int newcompdist = newcomp->recognize(LearnedGroups,allGroups);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   910
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   911
	if ((newdist < d) && (newcomp->confid() > ConfidenceThreshold*.6))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   912
	  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   913
	    list->insertAfter(ptr, newcomp);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   914
	    newcomp->display_bounding_box("red");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   915
	    comp->display_bounding_box("red");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   916
	  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   917
	else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   918
	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   919
	      	comp->ul() = oldul;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   920
		comp->lr() = oldlr;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   921
		comp->setProperties(fBitMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   922
		comp->recognize(LearnedGroups);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   923
		delete newcomp;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   924
	    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   925
	return;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   926
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   927
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   928
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   929
  return;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   930
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   931
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   932
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   933
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   934
void Page::uniteAndRecognize (Components *list, ListElement * ptr, Distance d)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   935
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   936
Primary Purpose: Identify and merge a separated character
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   937
Arguments:ptr is a pointer to a list element containing a component
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   938
          d is the current recognition distance on the component
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   939
Effects: Unite two components into one.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   940
    
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   941
Rev: 5/6/96
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   942
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   943
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   944
  if (ptr->previous == NULL) return;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   945
  Component * part1 = (Component *) ptr->previous->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   946
  Component * part2 = (Component *) ptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   947
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   948
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   949
  Point ul, lr;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   950
  ul = part1->ul();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   951
  lr = part2->lr();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   952
  if (ul.y() > lr.y() || ul.x() > lr.x())
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   953
    return;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   954
  Component * newcomp = new Component(ul, lr);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   955
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   956
  newcomp->setProperties(fBitMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   957
  if (part1->charGroup <= 3 && part2->charGroup <= 3)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   958
    newcomp->charGroup = (part1->charGroup | part2->charGroup);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   959
  else if (part1->charGroup == 4)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   960
    newcomp->charGroup = (part2->charGroup | 2);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   961
  else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   962
    newcomp->charGroup = (part1->charGroup | 2);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   963
  if (newcomp->charGroup > 4) newcomp->charGroup = 4;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   964
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   965
  int newdist = newcomp->recognize(LearnedGroups);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   966
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   967
  if (newdist < d && newcomp->confid() > ConfidenceThreshold) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   968
    { 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   969
      list->removeAt(ptr->previous);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   970
      list->insertAfter(ptr, newcomp); 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   971
      list->removeAt(ptr); 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   972
    } else delete newcomp; 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   973
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   974
return;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   975
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   976
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   977
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   978
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   979
int Page::writeWordPos(char * filename)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   980
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   981
Primary Purpose: Writes word position, confidence, length and string to file
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   982
Arguments: output file name
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   983
Return Value: 1 if successful. 0 if an error occured
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   984
Effects: Calls fWordList->printWordPos
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   985
	  // Output format for each word
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   986
	      "%6d %6d %6d %6d %s\n", word->ul.x(), word->ul.y(),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   987
		          word->confid, word->charCount, word->characters 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   988
Rev: 11/25/95
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   989
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   990
{ return fWordList->writeWordPos(filename);};
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   991
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   992
int Page::writeWordbox(char * filename, int xoffset= 0, int yoffset = 0,
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   993
		       bool equationsOnly = FALSE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   994
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   995
Primary Purpose: Write out word to scanworks wordbox file
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   996
Arguments: output file, xoffset, yoffset, equationsOnly bool if we only want
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   997
equations.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   998
Return Value: 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   999
Effects: calls fWordList->writeWordbox
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1000
               // output format for each word
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1001
	 "%s %d %d %d %d  %d %d %d % \n",
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1002
		word->characters,
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1003
		word->ul.x(), word->ul.y(),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1004
		word->lr.x(), word->lr.y(),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1005
		word->lr.x(), word->ul.y(),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1006
		word->ul.x(), word->lr.y() );
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1007
	  New line between lines of text
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1008
Rev: 11/25/95
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1009
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1010
{ return fWordList->writeWordbox(filename, xoffset, yoffset, this, equationsOnly);};
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1011
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1012
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1013
int Page::writeAscii(char * filename)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1014
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1015
Primary Purpose: Write word list to asii file
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1016
Arguments: filename to write to
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1017
Return Value:  1 if successful 0 if unsuccessful
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1018
Effects:  Calss fWordList->writeAscii(filename)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1019
Writes words to fill in text format using MinLineSize
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1020
to differentiate lines.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1021
Rev: 11/25 KM
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1022
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1023
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1024
{return fWordList->writeAscii(filename);};
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1025
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1026
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1027
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1028
int Page::addEquation(int startline, int startcol, int endline, int endcol)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1029
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1030
Primary Purpose: Add an equation to the equation list
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1031
Arguments: boundaries of equation
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1032
Effects:  Adds an element fEqnList
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1033
Rev: 4/21/96
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1034
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1035
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1036
  EqnMarker * newEqn = new EqnMarker(startline, startcol, endline, endcol);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1037
  fEqnList->SortedInsert(newEqn, startline);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1038
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1039
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1040
int Page::deleteEquation(int col, int row)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1041
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1042
Primary Purpose: deletes equations with this coordinate.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1043
Arguments:  coordinate of equation to remove
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1044
Return Value: 1 if element was remove, 0 otherwise
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1045
Effects: removes any equation containing this coordinate
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1046
Rev: 4/21/96
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1047
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1048
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1049
  // first determine line number.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1050
  int linenum;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1051
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1052
  for (int i = 0; i < fnumLines; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1053
    if (flineinfo[i].fstartrow <= row && flineinfo[i].fendrow >= row)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1054
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1055
	linenum = i;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1056
	break;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1057
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1058
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1059
  for(ListElement *ptr = fEqnList->first; ptr != NULL; ptr = ptr->next) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1060
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1061
      EqnMarker * eqn =  (EqnMarker *) ptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1062
      if (linenum == eqn->startline &&  linenum == eqn->endline)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1063
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1064
	  if	(col >= eqn->startcol && col <= eqn->endcol)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1065
	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1066
	    delete eqn;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1067
	    setTclDeleteVars(eqn);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1068
	    fEqnList->removeAt(ptr);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1069
	    return 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1070
	    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1071
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1072
      else if (linenum == eqn->startline && col >= eqn->startcol)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1073
       	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1074
	    delete eqn;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1075
	    setTclDeleteVars(eqn);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1076
	    fEqnList->removeAt(ptr);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1077
	    return 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1078
	    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1079
      else if (linenum > eqn->startline && linenum < eqn->endline)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1080
	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1081
	    delete eqn;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1082
	    setTclDeleteVars(eqn);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1083
	    fEqnList->removeAt(ptr);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1084
	    return 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1085
	    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1086
      else if (linenum == eqn->endline && col <= eqn->endcol)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1087
	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1088
	    delete eqn;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1089
	    setTclDeleteVars(eqn);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1090
	    fEqnList->removeAt(ptr);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1091
	    return 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1092
	    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1093
      
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1094
  }      
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1095
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1096
  return 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1097
     
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1098
	  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1099
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1100
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1101
void Page::setTclDeleteVars(EqnMarker * eqn)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1102
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1103
	  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1104
if (ENABLE_USER_INTERFACE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1105
  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1106
    docommand("set deleted 1");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1107
    docommand("set curline %d",eqn->endline);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1108
    docommand("set curline_startrow %d",flineinfo[eqn->endline].fstartrow);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1109
    docommand("set curline_endrow %d",flineinfo[eqn->endline].fendrow);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1110
    docommand("set curx %d", eqn->endcol);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1111
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1112
    // prevlines are actually starting lines but allowed same use of 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1113
    // tcl add equation code
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1114
    docommand("set prevline %d",eqn->startline);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1115
    docommand("set prevline_startrow %d",flineinfo[eqn->startline].fstartrow);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1116
    docommand("set prevline_endrow %d",flineinfo[eqn->startline].fendrow);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1117
    docommand("set prevx %d", eqn->startcol);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1118
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1119
    
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1120
    
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1121
    // this will change with zoning
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1122
    docommand("set curline_startcol %d",0);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1123
    docommand("set curline_endcol %d",get_width());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1124
	      
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1125
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1126
  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1127
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1128
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1129
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1130
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1131
Component * Page::compAt(Point p)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1132
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1133
Primary Purpose: Calls Components::compAt to return the smallest
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1134
                  component containing point p
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1135
Return Value: Pointer to the component or null if no component here 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1136
Effects:
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1137
Rev: 4/25/96
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1138
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1139
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1140
  Component * returnComp= NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1141
  int linenum = get_linenum(p.x(), p.y() );
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1142
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1143
  if (linenum >= 0)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1144
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1145
      Components * complist = line(linenum);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1146
      returnComp = complist->compAt(p);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1147
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1148
  if (returnComp == NULL)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1149
    printf("No component found at ( %d, %d)\n ", p.x(), p.y());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1150
  else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1151
    printf("Component found at ( %d, %d)\n ul = (%d, %d)  lr = (%d, %d)\n "
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1152
	   , p.x(), p.y(),returnComp->ul().x(),returnComp->ul().y(),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1153
	   returnComp->lr().x(),returnComp->lr().y());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1154
    
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1155
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1156
    return returnComp;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1157
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1158
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1159
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1160
bool Page::inEquation(int col, int row)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1161
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1162
Primary Purpose: determine if x,y is in an equation
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1163
Arguments: x,y coordinates
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1164
Return Value: true if in an Equation, false otherwise
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1165
Effects: determines if equation with these coordinated is in fEqnList
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1166
Rev: 11/25/95
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1167
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1168
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1169
  // first determine line number.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1170
  int linenum = get_linenum(col, row);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1171
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1172
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1173
  for(ListElement *ptr = fEqnList->first; ptr != NULL; ptr = ptr->next) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1174
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1175
      EqnMarker * eqn =  (EqnMarker *) ptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1176
      if (linenum == eqn->startline &&  linenum == eqn->endline)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1177
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1178
	  if(col >= eqn->startcol && col <= eqn->endcol)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1179
	    return true;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1180
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1181
      else if (linenum == eqn->startline && col >= eqn->startcol)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1182
	return true;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1183
      else if (linenum > eqn->startline && linenum < eqn->endline)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1184
	return true;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1185
      else if (linenum == eqn->endline && col <= eqn->endcol)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1186
	return true;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1187
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1188
  return false;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1189
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1190
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1191
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1192
bool Page::inEquation(ListElement * comp)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1193
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1194
Primary Purpose:  determine if the component in this list element 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1195
                 is in an equation
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1196
Arguments: A list element from a component list
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1197
Return Value: true if in equation, false otherwise
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1198
Effects:  calls inEquation(x,y) to do the real work
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1199
Rev: 4/21/96
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1200
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1201
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1202
  Component * c = (Component *) comp->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1203
  return inEquation(c->ul().x(), c->ul().y());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1204
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1205
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1206
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1207
int Page::writeEquations(char * filename, int lineOffset)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1208
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1209
Primary Purpose:  Writes boundaries of equations
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1210
Arguments: output file name
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1211
Return Value: 1 if successful 0 otherwise 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1212
Effects: Outputs to filename for each equation
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1213
int startline, int startcol, int endline, int endcol <CR/LF>
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1214
Rev: 11/25/95
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1215
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1216
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1217
  FILE * outfile;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1218
  outfile = fopen(filename, "w");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1219
  if (outfile == NULL)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1220
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1221
	printf("Error openning %s", filename);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1222
	return 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1223
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1224
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1225
  for(ListElement *ptr = fEqnList->first; ptr != NULL; ptr = ptr->next) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1226
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1227
      EqnMarker * eqn =  (EqnMarker *) ptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1228
      fprintf(outfile, " %6d %6d %6d %6d\n", eqn->startline+lineOffset, 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1229
	      eqn->startcol, 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1230
	      eqn->endline+lineOffset, eqn->endcol);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1231
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1232
fclose(outfile);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1233
return 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1234
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1235
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1236
void Page::join(Component * a, Component * b)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1237
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1238
  if (a == b) return;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1239
  Component * primary;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1240
  Component * secondary;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1241
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1242
  primary = (( a < b) ? a : b);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1243
  secondary = ((primary == a) ? b : a);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1244
  assert(primary != secondary);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1245
  assert(get_linenum(a) == get_linenum(b));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1246
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1247
  primary->join(secondary);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1248
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1249
  // remove secondary component from component list.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1250
  int linenum = get_linenum(secondary);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1251
  line(linenum)->removeElement(secondary);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1252
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1253
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1254
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1255
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1256
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1257
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1258
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1259
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1260
int Page::thinnestHorizontalSplit(Components * complist, 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1261
				  ListElement * compptr)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1262
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1263
Primary Purpose: Splits this component at thinnest point
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1264
Arguments: the component list that contains the compoent and
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1265
            a pointer to its listelement
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1266
Return Value: 1 if split performed 0 otherwise.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1267
Effects: Adds a new component to the list
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1268
Constraints: 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1269
Rev: 4/26
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1270
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1271
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1272
  Component * comp = (Component *) compptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1273
  // Some easy access x,y coordinates
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1274
  int ulx = comp->ul().x();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1275
  int uly = comp->ul().y();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1276
  int lrx = comp->lr().x();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1277
  int lry = comp->lr().y();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1278
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1279
  int bestlrx;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1280
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1281
  // Determine where to split.  Split at the thinnest point
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1282
  // within JoinTolerance (maximum number of pixels that might be fused)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1283
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1284
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1285
  int minHeight = (int)comp->height();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1286
  int oldwidth = (int) comp->width();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1287
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1288
  bestlrx = comp->lr().x();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1289
  // MinWidth is the minimum width of a learned charcter
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1290
  for(int i = MinWidth; i < oldwidth - MinWidth; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1291
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1292
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1293
	int newHeight = 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1294
	  fBitMap->pixelsInRegion(Point(ulx+i,uly), Point(ulx+i,lry));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1295
	if (newHeight < minHeight)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1296
	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1297
	      minHeight = newHeight;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1298
	      bestlrx = ulx+i;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1299
	    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1300
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1301
//  printf("bestlrx = %d, minHeight = %d\n", bestlrx, minHeight);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1302
  horizontalCompSplit(complist, compptr, bestlrx);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1303
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1304
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1305
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1306
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1307
int Page::thinnestHorizontalSplit(Component * comp)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1308
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1309
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1310
  int i  = get_linenum(comp);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1311
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1312
  Components * complist = fLineComponents[i];
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1313
  ListElement * compptr;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1314
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1315
  for (ListElement * ptr = complist->first; ptr != NULL; ptr = ptr->next)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1316
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1317
    if ((Component *) (ptr->item) == comp)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1318
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1319
	compptr = ptr;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1320
	thinnestHorizontalSplit(complist, compptr);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1321
	return 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1322
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1323
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1324
  return 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1325
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1326
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1327
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1328
int Page::horizontalCompSplit(Components * complist, 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1329
			      ListElement * compptr, int x)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1330
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1331
Primary Purpose: Split this component in the list into two components
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1332
             at the indicated x coordinate
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1333
Arguments: x coordinate of splite
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1334
Return Value: 1 if split is performed 0 otherwise
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1335
Effects: Adds a new element to the list. One component is split into two
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1336
Constraints: fulx <= x >= flrx
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1337
Rev: 4/26/96
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1338
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1339
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1340
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1341
  Component * comp = (Component *) compptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1342
  bool allGroups = TRUE;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1343
  comp->display_bounding_box("white");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1344
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1345
  if( x < comp->ul().x() || x > comp->lr().x())
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1346
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1347
    cout << " Cant split component " << x << "is not between" 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1348
	 << comp->ul().x() << "and" << comp->lr().x() << endl;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1349
    return 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1350
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1351
  else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1352
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1353
      Component * newcomp = new Component(Point(x,comp->ul().y()),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1354
					  comp->lr());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1355
      comp->lr().x() = x-1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1356
      int compShrunk = comp->vertShrink(fBitMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1357
      comp->setProperties(fBitMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1358
      if(compShrunk)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1359
	comp->recognize(LearnedGroups, allGroups);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1360
      else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1361
	comp->recognize(LearnedGroups);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1362
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1363
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1364
      int newCompShrunk = newcomp->vertShrink(fBitMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1365
      newcomp->setProperties(fBitMap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1366
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1367
      if(newCompShrunk) // ignore group if shrunk
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1368
	newcomp->recognize(LearnedGroups, allGroups);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1369
      else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1370
	newcomp->recognize(LearnedGroups);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1371
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1372
      complist->insertAfter(compptr, newcomp);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1373
      comp->display_bounding_box("blue");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1374
      newcomp->display_bounding_box("blue");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1375
 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1376
     return 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1377
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1378
 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1379
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1380
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1381
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1382
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1383
ZonedPage::ZonedPage()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1384
  :Page(){ fzones = new Zones();}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1385
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1386
ZonedPage::~ZonedPage()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1387
{ 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1388
  ((Page *)this)->~Page();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1389
  delete fzones;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1390
} 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1391
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1392
Zones * ZonedPage::zones()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1393
 { return fzones; }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1394
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1395
Page * ZonedPage::activate(int x, int y)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1396
     // activate the page at Point(x,y)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1397
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1398
  Zone * activeZone = zones()->findZone(x,y);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1399
  if (activeZone == NULL) return NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1400
  docommand("set cur_xoffset %d", activeZone->ul().x());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1401
  docommand("set cur_yoffset %d", activeZone->ul().y());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1402
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1403
  if (activeZone->page() == NULL)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1404
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1405
      activeZone->buildPage(this);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1406
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1407
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1408
     return activeZone->page();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1409
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1410
}    
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1411
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1412
void ZonedPage::autoZone(int horizMerge, int vertMerge)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1413
{ // autoZone tries to automatically zone page
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1414
  Point curul;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1415
  Point curlr;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1416
  int changed = 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1417
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1418
  if (components() != NULL)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1419
    delete components();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1420
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1421
  extractComponents(horizMerge);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1422
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1423
  while(changed)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1424
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1425
    changed = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1426
  for (int i=0; i < numLines(); i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1427
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1428
    for(ListElement * mptr = line(i)->first; mptr != NULL; mptr=mptr->next)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1429
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1430
       	Component * mainitem = (Component *) mptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1431
	for (int j= i; j < numLines(); j++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1432
	  for(ListElement * ptr = line(j)->first; ptr != NULL; ptr=ptr->next)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1433
	      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1434
		
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1435
		Component * item = (Component *) ptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1436
		if( (item->ul().y() - mainitem->lr().y()) <= vertMerge &&
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1437
		    (mainitem != item) &&
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1438
		    mainitem->xoverlap(item))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1439
		    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1440
		      mainitem->join(item);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1441
		      (line(j))->removeAt(ptr);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1442
		      changed = 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1443
		    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1444
	      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1445
      }	
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1446
     }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1447
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1448
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1449
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1450
  for (int i=0; i < numLines(); i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1451
    { 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1452
    for(ListElement * mptr = line(i)->first; mptr != NULL; mptr=mptr->next)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1453
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1454
       	Component * mainitem = (Component *) mptr->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1455
	/*        printf(" (ul(%d,%d) lr(%d,%d)) ", mainitem->ul().x(),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1456
                mainitem->ul().y(),  mainitem->lr().x(), mainitem->lr().y());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1457
		*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1458
	/*
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1459
	mainitem->display_bounding_box("blue", 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1460
				     ZONING_SCALE_FACTOR,
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1461
				     ".zoning_window.work_space");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1462
				     */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1463
	Point ul = Point(mainitem->ul().x() -1,mainitem->ul().y() -1);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1464
	Point lr = Point( mainitem->lr().x() +1, mainitem->lr().y() +1);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1465
	docommand("start_region %d %d", (int)(ul.x()*ZONING_SCALE_FACTOR),
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1466
		                        (int)(ul.y()*ZONING_SCALE_FACTOR));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1467
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1468
	docommand("end_region %d %d", (int)(lr.x()*ZONING_SCALE_FACTOR), 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1469
		                      (int)(lr.y()*ZONING_SCALE_FACTOR));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1470
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1471
	Zone * newzone = new Zone(ul,lr);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1472
        zones()->Append(newzone);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1473
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1474
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1475
    
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1476
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1477
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1478
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1479
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1480
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1481
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1482
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1483
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1484
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1485
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1486
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1487
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1488
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1489
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1490
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1491
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
  1492