reference/ocr-new/RLEMap.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
#include "system.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     2
#include "RLEMap.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     3
#include "RLEPair.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     4
#include "tcl_interface.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     5
#include "status_message.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     6
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     7
 /* *****************************************************************
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     8
  * RLEMap.cc - Member functions for an RLEMap                      *
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     9
  *         
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    10
  *	RLEMap() - Constructor
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    11
  *     ~RLEMap() - Destructor
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
  *	int imageLength();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    14
  *	int imageWidth();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    15
  *	MapStatus & status;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    16
  *  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    17
  * Below is an index of the other functions and the files where they 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    18
  * appear.  
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
  *   	MapStatus readMap(char * filename) - RLEMap_readMap.cc
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    21
  *	MapStatus WriteMap(char * filename);
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
  *	// Data Access and low level manipulation functions  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    24
  *     RLEPairs * row(int i) - Returns a pointer to the list of RLEPairs
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    25
  *     for row i.                       
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    26
  *     MapStatus setBit(Point point, Color clr);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    27
  *	Color readBit(Point point);
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
   ***************************************************************/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    31
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    32
RLEMap::RLEMap()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    33
: fMapData(NULL), fImageLength(0), fImageWidth(0), fStatus(EMPTY)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    34
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    35
Primary Function: Constructor
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    36
Return Value: pointer to new RLEMap
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    37
Effects: Initialize status to empty other values to zero
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    38
Rev: 10/6/95  KM
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    39
---------------------------------------------------------------*/
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
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    42
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    43
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    44
 RLEMap::~RLEMap()
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
Primary Purpose: destructor
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    47
Effects: Deletes each row of RLEPairs then the array of rows
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    48
Rev: 10/6/95   KM
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
  if (fMapData != NULL)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    52
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    53
      int i;
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
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    56
      // delete each row
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    57
      for (i=0; i< fImageLength; i++)
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
	    delete fMapData[i];
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
      // delete array of rows
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    62
        delete fMapData;   
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
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    66
int & RLEMap::imageLength()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    67
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    68
Return Value: vertical length of image in pixels
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    69
Constraints: readMap() must have been run and fStatus be VALID
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    70
Rev: 10/6 KM
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    71
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    72
  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    73
  return fImageLength;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    74
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    75
};
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    76
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    77
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    78
int & RLEMap::imageWidth()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    79
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    80
Return Value: horizontal width of image in pixels
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    81
Constraints: readMap() must have been run and fStatus be valid
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    82
Rev: 10/20 KM
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    83
---------------------------------------------------------------*/
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
  return fImageWidth;
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
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    88
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
MapStatus & RLEMap::status()
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
Return Value: return reference to current status EMPTY, VALID etc..
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    93
Rev: 10/6/95 KM
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
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    96
  return fStatus;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    97
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
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
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   102
RLEPairs *  RLEMap::operator [](int i)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   103
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   104
Arguments: i is the row # of the RLEPair list to be returned
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   105
Return Value: A pointer to the list of RLEPairs in row i
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   106
Rev:  10/20/95 KM
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
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   110
  return fMapData[i];
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   111
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   112
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   113
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   114
RLEPairs * RLEMap::row(int i)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   115
// Same as overloaded [] function above
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   116
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   117
  return fMapData[i];
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   118
}
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
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   122
MapStatus RLEMap::readMap(char * filename)
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
Primary Purpose: Read an RLEMap from a TIFF file
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   125
Arguments: filename of TIFF file
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   126
Return Value: A MapStatus, either VALID or READERROR
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   127
Effects:
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   128
  *  RLEMap::readMap(filename) will read a two level TIFF file
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   129
  *  and place it in an RLEMap.  The private fields of the RLEMap
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   130
  *  set are:
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   131
         fImageWidth - the pixel width of the image
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   132
	 fImageLength - the vertical pixel length of the image
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   133
	 fstat - the status of the image VALID or READERROR
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   134
         fMapData - an array of pointers to lists of RLEPairs
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   135
Constraints: filename must be a two level TIFF file
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   136
Rev: 10/20/95  Portions Borrowed from Assignment 1
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
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   139
  TIFF *tif;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   140
  unsigned char * buf;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   141
  short photometric;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   142
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   143
  // Open File - Read length and width
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
  tif = TIFFOpen (filename, "r");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   146
  if(tif == NULL)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   147
    return READERROR;
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
  TIFFGetField (tif, TIFFTAG_IMAGELENGTH, &fImageLength);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   150
  TIFFGetField (tif, TIFFTAG_IMAGEWIDTH, &fImageWidth);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   151
  TIFFGetField (tif, TIFFTAG_PHOTOMETRIC, &photometric);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   152
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   153
  printf("open succeeded on file %s.  length = %d. width = %d ",
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   154
	 filename, fImageLength, fImageWidth);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   155
  if(photometric == PHOTOMETRIC_MINISWHITE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   156
    printf("min-is-white format\n");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   157
  else if(photometric == PHOTOMETRIC_MINISBLACK )
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   158
    printf("min-is-black format\n");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   159
  else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   160
    printf("with an unknown photometric: %d\n", photometric);
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
  // allocate buffer and array for data
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   163
  int numCharsInBuf = fImageWidth / 8  +1 ;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   164
  buf = new unsigned char[numCharsInBuf];
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   165
  fMapData = new (RLEPairs*)[fImageLength+1]; 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   166
 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   167
 for (int row = 0; row < fImageLength; ++row)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   168
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   169
      TIFFReadScanline(tif,buf,row,0);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   170
      if(photometric != PHOTOMETRIC_MINISWHITE)  /* invert anything except white */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   171
	invertBitsInBuffer(buf, numCharsInBuf);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   172
      if(row==0 || row == fImageLength -1)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   173
	clearBitsInBuffer(buf,numCharsInBuf);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   174
      // Create a list of RLEPairs for this row and fill with buffer data
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   175
      fMapData[row] = new RLEPairs(row); 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   176
   	fMapData[row]->fill(buf, numCharsInBuf, row);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   177
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   178
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   179
 TIFFClose(tif);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   180
   
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   181
  return VALID;
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
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   184
short int RLEMap::grayScale(Point ul, Point  lr)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   185
// Dummy function for now
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
   int numPixels = pixelsInRegion( ul, lr);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   188
   int area = (lr.x() - ul.x()+1) * (lr.y() - ul.y()+1);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   189
   if (area < numPixels) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   190
     printf("Uh oh! Area = %d and pixels = %d\n", area, numPixels);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   191
     assert(area >= numPixels);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   192
   }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   193
   short int gscale =(short int)(((float)numPixels/area) * 255);
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
   return gscale;
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
int RLEMap::pixelsInRegion(Point  ul, Point  lr)
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
  assert (ul >= Point(0,0));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   201
  assert (ul <= lr);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   202
  assert (lr <= Point(fImageWidth, fImageLength));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   203
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   204
  int ulx = ul.x(); int uly = ul.y();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   205
  int lrx = lr.x(); int lry = lr.y();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   206
  int numPixels = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   207
  RLEPairs * curRow;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   208
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   209
  for (int r = uly; r <= lry; r++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   210
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   211
      curRow = row(r);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   212
      numPixels += curRow->pixelsBetween(ulx, lrx);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   213
//      cout << curRow->pixelsBetween(ulx,lrx) <<" ";
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   214
 //     cout << numPixels << endl;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   215
    }
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
  return numPixels;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   218
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
ListElement*
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   222
RLEMap::FindNearVertDot(int startCol, int endCol, int startRow, int endRow) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   223
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   224
Primary Purpose: Return closest interval to startRow within bounds of
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   225
                 startCol and endRow in the direction of endRow. Finds
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   226
                 closest dot vertically from startRow.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   227
Arguments: startRow is row to start from, startCol and endCol are
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   228
           left and right boundaries of search. Search in the direction
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   229
	   of endRow.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   230
Return Value: An RLE interval - pointer to a list element in RLEPairs 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   231
Effects:
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   232
Constraints: startRow < endRow
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
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   235
  ListElement* current;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   236
  if (startRow < endRow) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   237
    for (int i = startRow+2; i <= endRow; i++) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   238
      current = fMapData[i]->first;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   239
      while (current != NULL) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   240
	if ((((RLEPair *) current->item)->start <= endCol)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   241
	    && (((RLEPair *) current->item)->end >= startCol))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   242
	  return current;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   243
	current = current->next;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   244
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   245
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   246
  } else {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   247
    for (int i = startRow-2; i >= endRow; i--) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   248
      current = fMapData[i]->first;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   249
      while (current != NULL) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   250
	if ((((RLEPair *) current->item)->start <= endCol)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   251
	    && (((RLEPair *) current->item)->end >= startCol))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   252
	  return current;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   253
	current = current->next;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   254
      }
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
  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   257
  return NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   258
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   259
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
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
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   264
ListElement*
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   265
RLEMap::FindNearHorizDot(int startCol, int startRow, int endRow) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   266
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   267
Primary Purpose: Return closest interval to startCol within bounds of
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   268
                 startRow and endRow (startRow is lower). Finds
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   269
                 closest dot horizontally from startCol.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   270
Arguments: startCol is column to start from, startRow and endRow are
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   271
           upper and lower boundaries of search
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   272
Return Value: An RLE interval - pointer to a list element in RLEPairs 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   273
Effects:
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   274
Constraints: startRow < endRow
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
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   277
  ListElement* answer = NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   278
  ListElement* current;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   279
  int closest = fImageWidth;
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
  for (int i = startRow; i <= endRow; i++) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   282
    current = fMapData[i]->first;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   283
    while ((current != NULL) && (((RLEPair *) current->item)->end 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   284
				 < startCol)) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   285
      current = current->next;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   286
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   287
    if ((current != NULL) && (((RLEPair *) current->item)->start < closest)) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   288
      answer = current;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   289
      closest = ((RLEPair *) answer->item)->start;
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
  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   292
  return answer;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   293
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   294
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   295
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
void testRLEMap(char * filename)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   299
/*--------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   300
Primary Purpose: Test the reading of tiff files into RLE format
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   301
Effects:  Reads filename,  puts it into RLE format then prints
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   302
Rev:  10/7/95 KM
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
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   305
  RLEMap m;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   306
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   307
  m.readMap(filename);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   308
  if (m.imageLength() < 100)  printMap(&m);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   309
  testpixelsBetween(&m);   // In RLEPairs.cc - tests pixelsBetween function
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
void printMap(RLEMap * map)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   314
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   315
  int startX = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   316
  int endX = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   317
  int pos;    
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   318
  RLEPair * item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   319
  RLEPairs * rowdata;
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
  RLEMap & m = *map;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   322
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   323
  for (int r = 0; r < m.imageLength(); r++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   324
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   325
      startX = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   326
      endX = -1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   327
      rowdata = m[r];
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   328
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   329
      for (ListElement* ptr = rowdata->first; ptr != NULL; ptr = ptr->next) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   330
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   331
	  item = (RLEPair *)(ptr->item);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   332
	  startX = item->start;	  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   333
	  for ( pos = endX+1; pos< startX; pos++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   334
	  cout << " ";
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   335
          endX = item->end;	  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   336
	  for ( pos = startX; pos <= endX; pos++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   337
	    cout << "X";
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   338
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   339
      cout << "" << endl;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   340
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   341
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   342
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   343
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   344
void RLEMap::printPairs(int startRow, int endRow)
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
Primary Purpose: Prints RLE Pairs for this map from startRow to endRow  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   347
Rev:11/2 KM
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   348
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   349
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   350
  int startX, endX;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   351
  RLEPair * item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   352
  RLEPairs * rowdata;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   353
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   354
  RLEMap & m = *this;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   355
  cout << "printing rows " << startRow << " to " << endRow << endl;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   356
  for (int r = startRow; r <= endRow; r++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   357
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   358
      rowdata = m[r];
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
      cout << "row " << r << " ";
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   361
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   362
      for (ListElement *ptr = rowdata->first; ptr != NULL; ptr = ptr->next) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   363
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   364
	  item = (RLEPair *)(ptr->item);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   365
	  startX = item->start;	  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   366
	  endX = item->end;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   367
	  cout << "(" << startX << "," << endX <<")";
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   368
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   369
      cout << endl;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   370
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   371
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   372
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   373
void testpixelsBetween(RLEMap * map)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   374
// tests out a row by making sure that pixels between 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   375
// 0 and ImageWidth - 1 == pixels in sub ranges of 29 pixels
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   376
// Test performed on center row.
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
  int start = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   379
  int end = 28;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   380
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   381
  int pcount;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   382
  int sum = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   383
  RLEPairs * pairs;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   384
  int row;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   385
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   386
  for (row = 0; row < map->imageLength(); row++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   387
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   388
      pairs = (*map)[row];  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   389
      while (start <= map->imageWidth())
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
	  pcount = pairs->pixelsBetween(start, end);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   392
//	  printf("row %d col %d to %d - %d pixels\n",row, start,end,pcount);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   393
	  sum += pcount;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   394
	  start +=29;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   395
	  end +=29;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   396
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   397
      if (sum !=0)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   398
	printf("row %d sum was %d , should be %d\n", row, sum, pairs->numPixels);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   399
      assert(sum == pairs->numPixels);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   400
      start = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   401
      end = 28;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   402
      sum = 0;
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
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   405
  delete pairs;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   406
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   407
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   408
int RLEMap::deskew()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   409
/* going to be a (near-blind) steal from fateman */
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
Primary Purpose: deskewing an RLEMap
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   412
Arguments: none 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   413
Return Value: 1 if the page is altered, 0 if not
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   414
Effects: RLEMap is straightened out
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   415
Constraints: RLE shouldn't be tilted too much (< 10deg)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   416
Rev: AR 11/1/95
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   417
---------------------------------------------------------------*/
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
  double skew = -get_skew(this);  /* skew in rad */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   420
  if((skew >= MINIMUM_SKEW_ANGLE)||(skew <= - MINIMUM_SKEW_ANGLE))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   421
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   422
      double h = tan(skew / (180 / M_PI));  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   423
      if(h > 0)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   424
	  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   425
	    tilt_and_slant(1/h, 1); /* clockwise */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   426
	    return 1;
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 if (h < 0)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   429
	  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   430
	    tilt_and_slant(-(1/h), -1); /* counter clockwise */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   431
	    return 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   432
	  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   433
      else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   434
	return 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   435
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   436
  else 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   437
    return 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   438
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   439
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   440
#define DEBUG_TILT_AND_SLANT 1
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   441
void RLEMap::tilt_and_slant(double step, int direction)
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
Primary Purpose: do the work of shifting the RLEMap
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   444
Arguments: step--something about how many rows to go before shifting,
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   445
           direction--counterclockwise or clockwise
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   446
Return Value: none
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   447
Effects: rotates the RLEMap some ammount by tilting the map slightly,
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   448
        then slanting it. (duh). Not an exact rotation
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   449
Constraints:
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   450
Rev: AR 11/1/95
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   451
---------------------------------------------------------------*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   452
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   453
  if(DEBUG_TILT_AND_SLANT)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   454
    printf("Call to tilt_and_slant: step = %lf, direction = %d\n ", step, direction);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   455
  if(direction > 0)
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
      tilt(step, direction);  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   458
      slant(step, direction);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   459
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   460
  else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   461
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   462
      slant(step, -direction);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   463
      tilt(step, direction); 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   464
    }
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
#define DEBUG_SLANT 1
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   468
/*  "slant a picture by shifting lines horizontally 1 bit every step rows"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   469
  ;; dir 1 means shift to right as row number increases
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   470
  ;; dir -1 means shift by left
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   471
  ;; this does not rotate the picture, since rows are each unchanged.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   472
  ;; the effect of a positive direction, say (slantpic pic 3 3 1)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   473
  ;; is to "italicize".
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
void RLEMap::slant(double step, int direction)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   476
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   477
  if(DEBUG_SLANT)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   478
    printf("Slant called, step = %lf, dir = %d\n", step, direction);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   479
  fImageWidth += (int)((double)fImageLength / (double)step);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   480
  int shift_amount = direction;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   481
  int num_steps = 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   482
  for(int i = 0; i < fImageLength; i++)
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
	if(i > (num_steps*(int)step))  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   485
/* if we have gone through step rows, increment the shift */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   486
	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   487
	      shift_amount += direction;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   488
	      num_steps++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   489
	    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   490
/*	printf("Shifting row %d by %d\n", i, shift_amount);  */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   491
	fMapData[i]->shift(shift_amount);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   492
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   493
}
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
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   496
void RLEMap::display_intervals(char* color)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   497
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   498
  display_intervals(".main_window.display.work_space", SCALE_FACTOR, color);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   499
}
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
void RLEMap::display_intervals(char* window, double scaleFactor, char * color)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   502
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   503
  assert(scaleFactor > 0);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   504
  if(!DISPLAY_IMAGE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   505
    return;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   506
  double skip;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   507
  last_status = 0.0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   508
  printf("scaleFactor = %lf  ", scaleFactor);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   509
  skip = 1.0 / scaleFactor;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   510
  printf("Skip = %lf\n", skip);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   511
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   512
  /* delete any garbage hanging around */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   513
  docommand("%s delete all", window);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   514
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   515
  set_status("Displaying Image: 0%...");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   516
    for (int i = 0, j= 0; i < fImageLength;i= int(j * skip), j++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   517
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   518
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   519
	set_display_status((int)(i*skip), fImageLength);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   520
	fMapData[i]->draw_pairs(window, scaleFactor,
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   521
			      i, color, 1.0/skip);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   522
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   523
	
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
  last_status = 0.0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   527
  update();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   528
  set_status("Displaying Image: Done");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   529
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   530
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   531
void RLEMap::tilt(double step, int direction)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   532
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   533
/*    printf("tilt called, step = %lf, dir = %d\n", step, direction); */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   534
  int old_height = fImageLength;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   535
  int new_height = /* ceiling */ (int)(((double)fImageWidth) / step) + old_height;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   536
  int delta = old_height - new_height;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   537
  RLEPairs ** new_data = new RLEPairs*[new_height];
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   538
  for(int i = 0; i < new_height; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   539
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   540
	new_data[i] = new RLEPairs(i);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   541
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   542
  for(int j = 0; j < old_height; j++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   543
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   544
	tilt_row(j, delta, new_data, step, direction);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   545
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   546
  fMapData = new_data;  /* probably want to delete old data */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   547
  fImageLength = new_height;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   548
  display_intervals("black");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   549
}  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   550
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   551
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   552
void RLEMap::tilt_row(int old_row_index, int old_new_row_diff, RLEPairs** new_data, double step, int direction)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   553
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   554
/*    printf("Tilt row called: old row = %d, row diff = %d, step = %lf, dir = %d\n", old_row_index, old_new_row_diff, step, direction); */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   555
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   556
  double cur_x = 0;  /* I don't know what will happen with negative rows */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   557
  double new_x;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   558
  int cur_y = old_row_index + (old_new_row_diff * direction);
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
  while(((new_x = cur_x + step) < fImageWidth) &&
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   561
	(cur_y >= 0) && (cur_y < fImageLength))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   562
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   563
      RLEPairs* new_pairs;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   564
      new_pairs = (fMapData[old_row_index])->extract((int) cur_x, (int)new_x);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   565
      new_data[cur_y]->merge(new_pairs);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   566
      cur_x = new_x + 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   567
      cur_y += direction;
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
}
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
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
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   574
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   575
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