blob: 8bc560f6829b10806058cde2664133150df07ab5 [file] [log] [blame]
/**********************************************************************
* File: word.c
* Description: Code for the WERD class.
* Author: Ray Smith
* Created: Tue Oct 08 14:32:12 BST 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 WERD_H
#define WERD_H
#include "varable.h"
#include "bits16.h"
#include "strngs.h"
#include "blckerr.h"
#include "stepblob.h"
#include "polyblob.h"
//#include "larcblob.h"
enum WERD_FLAGS
{
W_SEGMENTED, //correctly segmented
W_ITALIC, //italic text
W_BOLD, //bold text
W_BOL, //start of line
W_EOL, //end of line
W_NORMALIZED, //flags
W_POLYGON, //approximation
W_LINEARC, //linearc approx
W_DONT_CHOP, //fixed pitch chopped
W_REP_CHAR, //repeated character
W_FUZZY_SP, //fuzzy space
W_FUZZY_NON, //fuzzy nonspace
W_INVERSE //white on black
};
enum DISPLAY_FLAGS
{
/* Display flags bit number allocations */
DF_BOX, //Bounding box
DF_TEXT, //Correct ascii
DF_POLYGONAL, //Polyg approx
DF_EDGE_STEP, //Edge steps
DF_BN_POLYGONAL //BL normalisd polyapx
};
class ROW; //forward decl
class WERD:public ELIST_LINK
{
public:
WERD() {
} //empty constructor
WERD( //constructor
C_BLOB_LIST *blob_list, //blobs in word
uinT8 blanks, //blanks in front
const char *text); //correct text
WERD( //constructor
PBLOB_LIST *blob_list, //blobs in word
uinT8 blanks, //blanks in front
const char *text); //correct text
WERD( //constructor
PBLOB_LIST *blob_list, //blobs in word
WERD *clone); //use these flags etc.
WERD( //constructor
C_BLOB_LIST *blob_list, //blobs in word
WERD *clone); //use these flags etc.
~WERD () { //destructor
if (flags.bit (W_POLYGON)) {
//use right destructor
((PBLOB_LIST *) & cblobs)->clear ();
//use right destructor
((PBLOB_LIST *) & rej_cblobs)->clear ();
}
// else if (flags.bit(W_LINEARC))
// ((LARC_BLOB_LIST*)&cblobs)->clear(); //use right destructor
}
WERD *poly_copy( //make copy as poly
float xheight); //row xheight
WERD *larc_copy( //make copy as larc
float xheight); //row xheight
//get DUFF compact blobs
C_BLOB_LIST *rej_cblob_list() {
if (flags.bit (W_POLYGON))
WRONG_WORD.error ("WERD::rej_cblob_list", ABORT, NULL);
return &rej_cblobs;
}
//get DUFF poly blobs
PBLOB_LIST *rej_blob_list() {
if (!flags.bit (W_POLYGON))
WRONG_WORD.error ("WERD::rej_blob_list", ABORT, NULL);
return (PBLOB_LIST *) (&rej_cblobs);
}
C_BLOB_LIST *cblob_list() { //get compact blobs
if (flags.bit (W_POLYGON) || flags.bit (W_LINEARC))
WRONG_WORD.error ("WERD::cblob_list", ABORT, NULL);
return &cblobs;
}
PBLOB_LIST *blob_list() { //get poly blobs
if (!flags.bit (W_POLYGON))
WRONG_WORD.error ("WERD::blob_list", ABORT, NULL);
//make it right type
return (PBLOB_LIST *) (&cblobs);
}
// LARC_BLOB_LIST *larc_blob_list() //get poly blobs
// {
// if (!flags.bit(W_LINEARC))
// WRONG_WORD.error("WERD::larc_blob_list",ABORT,NULL);
// return (LARC_BLOB_LIST*)(&cblobs); //make it right type
// }
PBLOB_LIST *gblob_list() { //get generic blobs
//make it right type
return (PBLOB_LIST *) (&cblobs);
}
const char *text() const { //correct text
return correct.string ();
}
uinT8 space() { //access function
return blanks;
}
void set_blanks( //set blanks
uinT8 new_blanks) {
blanks = new_blanks;
}
void set_text( //replace correct text
const char *new_text) { //with this
correct = new_text;
}
TBOX bounding_box(); //compute bounding box
BOOL8 flag( //test flag
WERD_FLAGS mask) const { //flag to test
return flags.bit (mask);
}
void set_flag( //set flag value
WERD_FLAGS mask, //flag to test
BOOL8 value) { //value to set
flags.set_bit (mask, value);
}
BOOL8 display_flag( //test display flag
uinT8 flag) const { //flag to test
return disp_flags.bit (flag);
}
void set_display_flag( //set display flag
uinT8 flag, //flag to set
BOOL8 value) { //value to set
disp_flags.set_bit (flag, value);
}
WERD *shallow_copy(); //shallow copy word
void move( // reposition word
const ICOORD vec); // by vector
void scale( // scale word
const float vec); // by multiplier
void join_on( //append word
WERD *&other); //Deleting other
void copy_on( //copy blobs
WERD *&other); //from other
void baseline_normalise ( // Tess style BL Norm
//optional antidote
ROW * row, DENORM * denorm = NULL);
void baseline_normalise_x ( //Use non standard xht
ROW * row, float x_height, //Weird value to use
DENORM * denorm = NULL); //optional antidote
void baseline_denormalise( //un-normalise
const DENORM *denorm);
void print( //print
FILE *fp); //file to print on
#ifndef GRAPHICS_DISABLED
void plot ( //draw one
ScrollView* window, //window to draw in
//uniform colour
ScrollView::Color colour, BOOL8 solid = FALSE);
void plot ( //draw one
//in rainbow colours
ScrollView* window, BOOL8 solid = FALSE);
void plot_rej_blobs ( //draw one
//in rainbow colours
ScrollView* window, BOOL8 solid = FALSE);
#endif
WERD & operator= ( //assign words
const WERD & source); //from this
void prep_serialise() { //set ptrs to counts
correct.prep_serialise ();
if (flags.bit (W_POLYGON))
((PBLOB_LIST *) (&cblobs))->prep_serialise ();
// else if (flags.bit(W_LINEARC))
// ((LARC_BLOB_LIST*)(&cblobs))->prep_serialise();
else
cblobs.prep_serialise ();
rej_cblobs.prep_serialise ();
}
void dump( //write external bits
FILE *f) {
correct.dump (f);
if (flags.bit (W_POLYGON))
((PBLOB_LIST *) (&cblobs))->dump (f);
// else if (flags.bit(W_LINEARC))
// ((LARC_BLOB_LIST*)(&cblobs))->dump( f );
else
cblobs.dump (f);
rej_cblobs.dump (f);
}
void de_dump( //read external bits
FILE *f) {
correct.de_dump (f);
if (flags.bit (W_POLYGON))
((PBLOB_LIST *) (&cblobs))->de_dump (f);
// else if (flags.bit(W_LINEARC))
// ((LARC_BLOB_LIST*)(&cblobs))->de_dump( f );
else
cblobs.de_dump (f);
rej_cblobs.de_dump (f);
}
make_serialise (WERD) private:
uinT8 blanks; //no of blanks
uinT8 dummy; //padding
BITS16 flags; //flags about word
BITS16 disp_flags; //display flags
inT16 dummy2; //padding
STRING correct; //correct text
C_BLOB_LIST cblobs; //compacted blobs
C_BLOB_LIST rej_cblobs; //DUFF blobs
};
ELISTIZEH_S (WERD)
#include "ocrrow.h" //placed here due to
extern BOOL_VAR_H (bln_numericmode, 0, "Optimize for numbers");
extern INT_VAR_H (bln_x_height, 128, "Baseline Normalisation X-height");
extern INT_VAR_H (bln_baseline_offset, 64,
"Baseline Norm. offset of baseline");
//void poly_linearc_outlines( //do list of outlines
//LARC_OUTLINE_LIST *srclist, //list to convert
//OUTLINE_LIST *destlist //desstination list
//);
//OUTLINE *poly_larcline( //draw it
//LARC_OUTLINE *srcline //one to approximate
//);
int word_comparator( //sort blobs
const void *word1p, //ptr to ptr to word1
const void *word2p //ptr to ptr to word2
);
#endif