/**********************************************************************
 * File:        ocrblock.h  (Formerly block.h)
 * Description: Page block class definition.
 * Author:		Ray Smith
 * Created:		Thu Mar 14 17:32:01 GMT 1991
 *
 * (C) Copyright 1991, Hewlett-Packard Ltd.
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 ** http://www.apache.org/licenses/LICENSE-2.0
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.
 *
 **********************************************************************/

#ifndef           OCRBLOCK_H
#define           OCRBLOCK_H

#include          "img.h"
#include          "ocrrow.h"
#include          "pdblock.h"

class BLOCK;                     //forward decl

ELISTIZEH_S (BLOCK)
class BLOCK:public ELIST_LINK, public PDBLK
//page block
{
  friend class BLOCK_RECT_IT;    //block iterator

  public:
  BLOCK()
    : re_rotation_(1.0f, 0.0f),
      classify_rotation_(1.0f, 0.0f),
      skew_(1.0f, 0.0f) {
      hand_poly = NULL;
    }
  BLOCK(const char *name,  // filename
          BOOL8 prop,        //proportional
          inT16 kern,        //kerning
          inT16 space,       //spacing
          inT16 xmin,        //bottom left
          inT16 ymin,
          inT16 xmax,        //top right
          inT16 ymax);

  ~BLOCK () {
    }

  // set space size etc.
  void set_stats(BOOL8 prop,        // proportional
                   inT16 kern,        //inter char size
                   inT16 space,       //inter word size
                   inT16 ch_pitch) {  //pitch if fixed
      proportional = prop;
      kerning = (inT8) kern;
      spacing = space;
      pitch = ch_pitch;
    }
  void set_xheight(inT32 height) {  // set char size
      xheight = height;
    }
  void set_font_class(inT16 font) {  // set font class
      font_class = font;
    }
    BOOL8 prop() const {  //return proportional
      return proportional;
    }
    inT32 fixed_pitch() const {  //return pitch
      return pitch;
    }
    inT16 kern() const {  //return kerning
      return kerning;
    }
    inT16 font() const {  //return font class
      return font_class;
    }
    inT16 space() const {  //return spacing
      return spacing;
    }
    const char *name() const {  //return filename
      return filename.string ();
    }
    inT32 x_height() const {  //return xheight
      return xheight;
    }
    float cell_over_xheight() const {
      return cell_over_xheight_;
    }
    void set_cell_over_xheight(float ratio) {
      cell_over_xheight_ = ratio;
    }
    ROW_LIST *row_list() {  //get rows
      return &rows;
    }
    C_BLOB_LIST *blob_list() {  //get blobs
      return &c_blobs;
    }
    C_BLOB_LIST *reject_blobs() {
      return &rej_blobs;
    }
  FCOORD re_rotation() const {
    return re_rotation_;         // How to transform coords back to image.
  }
  void set_re_rotation(const FCOORD& rotation) {
    re_rotation_ = rotation;
  }
  FCOORD classify_rotation() const {
    return classify_rotation_;   // Apply this before classifying.
  }
  void set_classify_rotation(const FCOORD& rotation) {
    classify_rotation_ = rotation;
  }
  FCOORD skew() const {
    return skew_;                // Direction of true horizontal.
  }
  void set_skew(const FCOORD& skew) {
    skew_ = skew;
  }
  const ICOORD& median_size() const {
    return median_size_;
  }
  void set_median_size(int x, int y) {
    median_size_.set_x(x);
    median_size_.set_y(y);
  }

  void rotate(const FCOORD& rotation);

    void sort_rows();  //decreasing y order

    void compress();  //shrink white space

    void check_pitch();  //check proportional

  void compress(const ICOORD vec);  // shrink white spaceand move by vector

  void print(FILE *fp, BOOL8 dump);  // dump whole table

    void prep_serialise() {  //set ptrs to counts
      filename.prep_serialise ();
      rows.prep_serialise ();
      c_blobs.prep_serialise ();
      rej_blobs.prep_serialise ();
      leftside.prep_serialise ();
      rightside.prep_serialise ();
    }

  void dump(FILE *f) {
      filename.dump (f);
      rows.dump (f);
      c_blobs.dump (f);
      rej_blobs.dump (f);
      leftside.dump (f);
      rightside.dump (f);
    }

  void de_dump(FILE *f) {  // read external bits
      filename.de_dump (f);
      rows.de_dump (f);
      c_blobs.de_dump (f);
      rej_blobs.de_dump (f);
      leftside.de_dump (f);
      rightside.de_dump (f);
    }

  make_serialise(BLOCK)

  BLOCK& operator=(const BLOCK & source);

  private:
    BOOL8 proportional;          //proportional
    inT8 kerning;                //inter blob gap
    inT16 spacing;               //inter word gap
    inT16 pitch;                 //pitch of non-props
    inT16 font_class;            //correct font class
    inT32 xheight;               //height of chars
    float cell_over_xheight_;    // Ratio of cell height to xheight.
    STRING filename;             //name of block
    ROW_LIST rows;               //rows in block
    C_BLOB_LIST c_blobs;         //before textord
    C_BLOB_LIST rej_blobs;       //duff stuff
  FCOORD re_rotation_;         // How to transform coords back to image.
  FCOORD classify_rotation_;   // Apply this before classifying.
  FCOORD skew_;                // Direction of true horizontal.
  ICOORD median_size_;         // Median size of blobs.
};

int decreasing_top_order(const void *row1, const void *row2);

#endif
