Tesseract  3.02
ROW Class Reference

#include <ocrrow.h>

Inheritance diagram for ROW:
ELIST_LINK

List of all members.

Public Member Functions

 ROW ()
 ROW (inT32 spline_size, inT32 *xstarts, double *coeffs, float x_height, float ascenders, float descenders, inT16 kern, inT16 space)
 ROW (TO_ROW *row, inT16 kern, inT16 space)
WERD_LIST * word_list ()
float base_line (float xpos) const
float x_height () const
void set_x_height (float new_xheight)
inT32 kern () const
float body_size () const
void set_body_size (float new_size)
inT32 space () const
float ascenders () const
float descenders () const
TBOX bounding_box () const
void set_lmargin (inT16 lmargin)
void set_rmargin (inT16 rmargin)
inT16 lmargin () const
inT16 rmargin () const
void set_has_drop_cap (bool has)
bool has_drop_cap () const
void set_para (PARA *p)
PARApara () const
void recalc_bounding_box ()
void move (const ICOORD vec)
void print (FILE *fp)
void plot (ScrollView *window, ScrollView::Color colour)
void plot (ScrollView *window)
void plot_baseline (ScrollView *window, ScrollView::Color colour)
ROWoperator= (const ROW &source)

Friends

void tweak_row_baseline (ROW *, double, double)

Detailed Description

Definition at line 32 of file ocrrow.h.


Constructor & Destructor Documentation

ROW::ROW ( ) [inline]

Definition at line 36 of file ocrrow.h.

          {
    }                            //empty constructor
ROW::ROW ( inT32  spline_size,
inT32 xstarts,
double *  coeffs,
float  x_height,
float  ascenders,
float  descenders,
inT16  kern,
inT16  space 
)

Definition at line 36 of file ocrrow.cpp.

    : baseline(spline_size, xstarts, coeffs),
      para_(NULL) {
  kerning = kern;                //just store stuff
  spacing = space;
  xheight = x_height;
  ascrise = ascenders;
  bodysize = 0.0f;
  descdrop = descenders;
  has_drop_cap_ = false;
  lmargin_ = 0;
  rmargin_ = 0;
}
ROW::ROW ( TO_ROW row,
inT16  kern,
inT16  space 
)

Definition at line 67 of file ocrrow.cpp.

          : para_(NULL) {
  kerning = kern;                //just store stuff
  spacing = space;
  xheight = to_row->xheight;
  bodysize = to_row->body_size;
  ascrise = to_row->ascrise;
  descdrop = to_row->descdrop;
  baseline = to_row->baseline;
  has_drop_cap_ = false;
  lmargin_ = 0;
  rmargin_ = 0;
}

Member Function Documentation

float ROW::ascenders ( ) const [inline]

Definition at line 79 of file ocrrow.h.

                            {  //return size
      return ascrise;
    }
float ROW::base_line ( float  xpos) const [inline]

Definition at line 56 of file ocrrow.h.

                                      {  //at the position
                                 //get spline value
      return (float) baseline.y (xpos);
    }
float ROW::body_size ( ) const [inline]

Definition at line 70 of file ocrrow.h.

                            {  //return body size
      return bodysize;
    }
TBOX ROW::bounding_box ( ) const [inline]

Definition at line 85 of file ocrrow.h.

                              {  //return bounding box
      return bound_box;
    }
float ROW::descenders ( ) const [inline]

Definition at line 82 of file ocrrow.h.

                             {  //return size
      return descdrop;
    }
bool ROW::has_drop_cap ( ) const [inline]

Definition at line 105 of file ocrrow.h.

                              {
      return has_drop_cap_;
    }
inT32 ROW::kern ( ) const [inline]

Definition at line 67 of file ocrrow.h.

                       {  //return kerning
      return kerning;
    }
inT16 ROW::lmargin ( ) const [inline]

Definition at line 95 of file ocrrow.h.

                          {
      return lmargin_;
    }
void ROW::move ( const ICOORD  vec)

Definition at line 138 of file ocrrow.cpp.

                {
  WERD_IT it(&words);  // word iterator

  for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ())
    it.data ()->move (vec);

  bound_box.move (vec);
  baseline.move (vec);
}
ROW & ROW::operator= ( const ROW source)

Definition at line 218 of file ocrrow.cpp.

                                        {
  this->ELIST_LINK::operator= (source);
  kerning = source.kerning;
  spacing = source.spacing;
  xheight = source.xheight;
  bodysize = source.bodysize;
  ascrise = source.ascrise;
  descdrop = source.descdrop;
  if (!words.empty ())
    words.clear ();
  baseline = source.baseline;    //QSPLINES must do =
  bound_box = source.bound_box;
  has_drop_cap_ = source.has_drop_cap_;
  lmargin_ = source.lmargin_;
  rmargin_ = source.rmargin_;
  para_ = source.para_;
  return *this;
}
PARA* ROW::para ( ) const [inline]

Definition at line 112 of file ocrrow.h.

                       {
      return para_;
    }
void ROW::plot ( ScrollView window,
ScrollView::Color  colour 
)

Definition at line 178 of file ocrrow.cpp.

                {
  WERD *word;                    //current word
  WERD_IT it = &words;           //words of ROW

  for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
    word = it.data ();
    word->plot (window, colour); //all in one colour
  }
}
void ROW::plot ( ScrollView window)

Definition at line 199 of file ocrrow.cpp.

                {
  WERD *word;                    //current word
  WERD_IT it = &words;           //words of ROW

  for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
    word = it.data ();
    word->plot (window);         //in rainbow colours
  }
}
void ROW::plot_baseline ( ScrollView window,
ScrollView::Color  colour 
) [inline]

Definition at line 131 of file ocrrow.h.

                                               {  //colour to draw
                                 //draw it
      baseline.plot (window, colour);
    }
void ROW::print ( FILE *  fp)

Definition at line 157 of file ocrrow.cpp.

                 {
  tprintf("Kerning= %d\n", kerning);
  tprintf("Spacing= %d\n", spacing);
  bound_box.print();
  tprintf("Xheight= %f\n", xheight);
  tprintf("Ascrise= %f\n", ascrise);
  tprintf("Descdrop= %f\n", descdrop);
  tprintf("has_drop_cap= %d\n", has_drop_cap_);
  tprintf("lmargin= %d, rmargin= %d\n", lmargin_, rmargin_);
}
void ROW::recalc_bounding_box ( )

Definition at line 91 of file ocrrow.cpp.

                              {  //recalculate BB
  WERD *word;                    //current word
  WERD_IT it = &words;           //words of ROW
  inT16 left;                    //of word
  inT16 prev_left;               //old left

  if (!it.empty ()) {
    word = it.data ();
    prev_left = word->bounding_box ().left ();
    it.forward ();
    while (!it.at_first ()) {
      word = it.data ();
      left = word->bounding_box ().left ();
      if (left < prev_left) {
        it.move_to_first ();
                                 //words in BB order
        it.sort (word_comparator);
        break;
      }
      prev_left = left;
      it.forward ();
    }
  }
  for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
    word = it.data ();
    if (it.at_first ())
      word->set_flag (W_BOL, TRUE);
    else
                                 //not start of line
      word->set_flag (W_BOL, FALSE);
    if (it.at_last ())
      word->set_flag (W_EOL, TRUE);
    else
                                 //not end of line
      word->set_flag (W_EOL, FALSE);
                                 //extend BB as reqd
    bound_box += word->bounding_box ();
  }
}
inT16 ROW::rmargin ( ) const [inline]

Definition at line 98 of file ocrrow.h.

                          {
      return rmargin_;
    }
void ROW::set_body_size ( float  new_size) [inline]

Definition at line 73 of file ocrrow.h.

                                       {  // set body size
      bodysize = new_size;
    }
void ROW::set_has_drop_cap ( bool  has) [inline]

Definition at line 102 of file ocrrow.h.

                                    {
      has_drop_cap_ = has;
    }
void ROW::set_lmargin ( inT16  lmargin) [inline]

Definition at line 89 of file ocrrow.h.

                                    {
      lmargin_ = lmargin;
    }
void ROW::set_para ( PARA p) [inline]

Definition at line 109 of file ocrrow.h.

                           {
      para_ = p;
    }
void ROW::set_rmargin ( inT16  rmargin) [inline]

Definition at line 92 of file ocrrow.h.

                                    {
      rmargin_ = rmargin;
    }
void ROW::set_x_height ( float  new_xheight) [inline]

Definition at line 64 of file ocrrow.h.

                                         {  // set x height
      xheight = new_xheight;
    }
inT32 ROW::space ( ) const [inline]

Definition at line 76 of file ocrrow.h.

                        {  //return spacing
      return spacing;
    }
WERD_LIST* ROW::word_list ( ) [inline]

Definition at line 52 of file ocrrow.h.

                           {  //get words
      return &words;
    }
float ROW::x_height ( ) const [inline]

Definition at line 61 of file ocrrow.h.

                           {  //return x height
      return xheight;
    }

Friends And Related Function Documentation

void tweak_row_baseline ( ROW ,
double  ,
double   
) [friend]

Definition at line 680 of file tordmain.cpp.

                                                  {
  TBOX blob_box;                 //bounding box
  C_BLOB *blob;                  //current blob
  WERD *word;                    //current word
  inT32 blob_count;              //no of blobs
  inT32 src_index;               //source segment
  inT32 dest_index;              //destination segment
  inT32 *xstarts;                //spline segments
  double *coeffs;                //spline coeffs
  float ydiff;                   //baseline error
  float x_centre;                //centre of blob
                                 //words of row
  WERD_IT word_it = row->word_list ();
  C_BLOB_IT blob_it;             //blob iterator

  blob_count = 0;
  for (word_it.mark_cycle_pt (); !word_it.cycled_list (); word_it.forward ()) {
    word = word_it.data ();      //current word
                                 //get total blobs
    blob_count += word->cblob_list ()->length ();
  }
  if (blob_count == 0)
    return;
  xstarts =
    (inT32 *) alloc_mem ((blob_count + row->baseline.segments + 1) *
    sizeof (inT32));
  coeffs =
    (double *) alloc_mem ((blob_count + row->baseline.segments) * 3 *
    sizeof (double));

  src_index = 0;
  dest_index = 0;
  xstarts[0] = row->baseline.xcoords[0];
  for (word_it.mark_cycle_pt (); !word_it.cycled_list (); word_it.forward ()) {
    word = word_it.data ();      //current word
                                 //blobs in word
    blob_it.set_to_list (word->cblob_list ());
    for (blob_it.mark_cycle_pt (); !blob_it.cycled_list ();
    blob_it.forward ()) {
      blob = blob_it.data ();
      blob_box = blob->bounding_box ();
      x_centre = (blob_box.left () + blob_box.right ()) / 2.0;
      ydiff = blob_box.bottom () - row->base_line (x_centre);
      if (ydiff < 0)
        ydiff = -ydiff / row->x_height ();
      else
        ydiff = ydiff / row->x_height ();
      if (ydiff < blshift_maxshift
        && blob_box.height () / row->x_height () > blshift_xfraction) {
        if (xstarts[dest_index] >= x_centre)
          xstarts[dest_index] = blob_box.left ();
        coeffs[dest_index * 3] = 0;
        coeffs[dest_index * 3 + 1] = 0;
        coeffs[dest_index * 3 + 2] = blob_box.bottom ();
        //shift it
        dest_index++;
        xstarts[dest_index] = blob_box.right () + 1;
      }
      else {
        if (xstarts[dest_index] <= x_centre) {
          while (row->baseline.xcoords[src_index + 1] <= x_centre
          && src_index < row->baseline.segments - 1) {
            if (row->baseline.xcoords[src_index + 1] >
            xstarts[dest_index]) {
              coeffs[dest_index * 3] =
                row->baseline.quadratics[src_index].a;
              coeffs[dest_index * 3 + 1] =
                row->baseline.quadratics[src_index].b;
              coeffs[dest_index * 3 + 2] =
                row->baseline.quadratics[src_index].c;
              dest_index++;
              xstarts[dest_index] =
                row->baseline.xcoords[src_index + 1];
            }
            src_index++;
          }
          coeffs[dest_index * 3] =
            row->baseline.quadratics[src_index].a;
          coeffs[dest_index * 3 + 1] =
            row->baseline.quadratics[src_index].b;
          coeffs[dest_index * 3 + 2] =
            row->baseline.quadratics[src_index].c;
          dest_index++;
          xstarts[dest_index] = row->baseline.xcoords[src_index + 1];
        }
      }
    }
  }
  while (src_index < row->baseline.segments
    && row->baseline.xcoords[src_index + 1] <= xstarts[dest_index])
    src_index++;
  while (src_index < row->baseline.segments) {
    coeffs[dest_index * 3] = row->baseline.quadratics[src_index].a;
    coeffs[dest_index * 3 + 1] = row->baseline.quadratics[src_index].b;
    coeffs[dest_index * 3 + 2] = row->baseline.quadratics[src_index].c;
    dest_index++;
    src_index++;
    xstarts[dest_index] = row->baseline.xcoords[src_index];
  }
                                 //turn to spline
  row->baseline = QSPLINE (dest_index, xstarts, coeffs);
  free_mem(xstarts);
  free_mem(coeffs);
}

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