/********************************************************************** * 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 "pageblk.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 //block label friend void scan_hpd_blocks(const char *name, PAGE_BLOCK_LIST *page_blocks, //head of full pag inT32 &block_no, //no of blocks BLOCK_IT *block_it); friend BOOL8 read_vec_file( //read uscan output STRING name, //basename of file inT32 xsize, //page size //output list inT32 ysize, BLOCK_LIST *blocks); friend BOOL8 read_pd_file( //read uscan output STRING name, //basename of file inT32 xsize, //page size //output list inT32 ysize, BLOCK_LIST *blocks); public: BLOCK() { //empty constructor hand_block = NULL; hand_poly = NULL; } BLOCK( //simple constructor 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); // void set_sides( //set vertex lists // ICOORDELT_LIST *left, //list of left vertices // ICOORDELT_LIST *right); //list of right vertices ~BLOCK () { //destructor } void set_stats( //set space size etc. 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( //set char size inT32 height) { xheight = height; } void set_font_class( //set font class inT16 font) { font_class = font; } // TEXT_REGION* text_region() // { // return hand_block; // } // POLY_BLOCK* poly_block() // { // return hand_poly; // } 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; } // void bounding_box( //get box // ICOORD& bottom_left, //bottom left // ICOORD& top_right) const //topright // { // bottom_left=box.botleft(); // top_right=box.topright(); // } // const TBOX& bounding_box() const //get real box // { // return box; // } // BOOL8 contains( //is pt inside block // ICOORD pt); // void move( // reposition block // const ICOORD vec); // by vector void sort_rows(); //decreasing y order void compress(); //shrink white space void check_pitch(); //check proportional void compress( //shrink white space const ICOORD vec); //and move by vector void print( //print summary/table FILE *fp, //file to print on BOOL8 dump); //dump whole table // void plot( //draw histogram // WINDOW window, //window to draw in // inT32 serial, //serial number // COLOUR colour); //colour to draw in // void show( //show image // IMAGE *image, //image to show // WINDOW window); //window to show in 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( //write external bits FILE *f) { filename.dump (f); rows.dump (f); c_blobs.dump (f); rej_blobs.dump (f); leftside.dump (f); rightside.dump (f); if (hand_block != NULL) hand_block->serialise (f); } void de_dump( //read external bits FILE *f) { 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); if (hand_block != NULL) hand_block = TEXT_REGION::de_serialise (f); } //assignment make_serialise (BLOCK) BLOCK & operator= ( const BLOCK & source); //from this 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 // TEXT_REGION* hand_block; //if it exists // POLY_BLOCK* hand_poly; //wierd as well ROW_LIST rows; //rows in block C_BLOB_LIST c_blobs; //before textord C_BLOB_LIST rej_blobs; //duff stuff // ICOORDELT_LIST leftside; //left side vertices // ICOORDELT_LIST rightside; //right side vertices // TBOX box; //bounding box }; int decreasing_top_order( // const void *row1, const void *row2); #endif