mirror of
https://github.com/tesseract-ocr/tesseract.git
synced 2024-12-18 19:39:24 +08:00
231 lines
7.3 KiB
C++
231 lines
7.3 KiB
C++
|
/**********************************************************************
|
||
|
* File: txtregn.c (Formerly text_region.c)
|
||
|
* Description: Text region within a polygonal block
|
||
|
* Author: Sheelagh Lloyd?
|
||
|
* Created:
|
||
|
*
|
||
|
* (C) Copyright 1993, 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.
|
||
|
*
|
||
|
**********************************************************************/
|
||
|
|
||
|
#include "mfcpch.h"
|
||
|
#include <ctype.h>
|
||
|
#include <math.h>
|
||
|
#include "txtregn.h"
|
||
|
#include "labls.h"
|
||
|
|
||
|
#include "hpddef.h" //must be last (handpd.dll)
|
||
|
|
||
|
ELISTIZE_S (TEXT_REGION) TEXT_REGION::TEXT_REGION (INT32 idno, ICOORDELT_LIST * points, TEXT_REGION_LIST * child):POLY_BLOCK (points,
|
||
|
POLY_TEXT) {
|
||
|
TEXT_REGION_IT
|
||
|
c = &txt_regions;
|
||
|
|
||
|
id_number = idno;
|
||
|
txt_regions.clear ();
|
||
|
c.move_to_first ();
|
||
|
c.add_list_before (child);
|
||
|
}
|
||
|
|
||
|
|
||
|
TEXT_REGION::TEXT_REGION (INT32 idno, ICOORDELT_LIST * points):POLY_BLOCK (points,
|
||
|
POLY_TEXT) {
|
||
|
id_number = idno;
|
||
|
|
||
|
txt_regions.clear ();
|
||
|
}
|
||
|
|
||
|
|
||
|
TEXT_REGION::TEXT_REGION ( //constructor
|
||
|
INT32 idno, ICOORDELT_LIST * points, INT8 hor, INT8 tex, INT8 ser, INT8 pro, INT8 nor, INT8 upr, INT8 sol, INT8 bla, INT8 und, INT8 dro):POLY_BLOCK (points,
|
||
|
POLY_TEXT) {
|
||
|
|
||
|
id_number = idno;
|
||
|
horizontal = hor;
|
||
|
text = tex;
|
||
|
serif = ser;
|
||
|
proportional = pro;
|
||
|
normal = nor;
|
||
|
upright = upr;
|
||
|
solid = sol;
|
||
|
black = bla;
|
||
|
underlined = und;
|
||
|
dropcaps = dro;
|
||
|
|
||
|
txt_regions.clear ();
|
||
|
}
|
||
|
|
||
|
|
||
|
void TEXT_REGION::set_attrs(INT8 hor,
|
||
|
INT8 tex,
|
||
|
INT8 ser,
|
||
|
INT8 pro,
|
||
|
INT8 nor,
|
||
|
INT8 upr,
|
||
|
INT8 sol,
|
||
|
INT8 bla,
|
||
|
INT8 und,
|
||
|
INT8 dro) {
|
||
|
|
||
|
horizontal = hor;
|
||
|
text = tex;
|
||
|
serif = ser;
|
||
|
proportional = pro;
|
||
|
normal = nor;
|
||
|
upright = upr;
|
||
|
solid = sol;
|
||
|
black = bla;
|
||
|
underlined = und;
|
||
|
dropcaps = dro;
|
||
|
}
|
||
|
|
||
|
|
||
|
#include "hpddef.h" //must be last (handpd.dll)
|
||
|
void TEXT_REGION::show_attrs( //Now uses tprintf instead
|
||
|
DEBUG_WIN *f) {
|
||
|
TEXT_REGION_IT it = &txt_regions;
|
||
|
|
||
|
if (id_number > -1) {
|
||
|
f->
|
||
|
dprintf
|
||
|
("Text region no. %d with attributes %s, %s, %s, %s, %s, %s, %s, %s, %s, %s\n",
|
||
|
id_number, tlabel[0][horizontal], tlabel[1][text],
|
||
|
tlabel[2][serif], tlabel[3][proportional], tlabel[4][normal],
|
||
|
tlabel[5][upright], tlabel[6][solid], tlabel[7][black],
|
||
|
tlabel[8][underlined], tlabel[9][dropcaps]);
|
||
|
if (!txt_regions.empty ()) {
|
||
|
f->dprintf ("with text subregions\n");
|
||
|
for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ())
|
||
|
it.data ()->show_attrs (f);
|
||
|
f->dprintf ("end of subregions\n");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
f->
|
||
|
dprintf
|
||
|
("Text subregion with attributes %s, %s, %s, %s, %s, %s, %s, %s, %s, %s\n",
|
||
|
tlabel[0][horizontal], tlabel[1][text], tlabel[2][serif],
|
||
|
tlabel[3][proportional], tlabel[4][normal], tlabel[5][upright],
|
||
|
tlabel[6][solid], tlabel[7][black], tlabel[8][underlined],
|
||
|
tlabel[9][dropcaps]);
|
||
|
}
|
||
|
|
||
|
|
||
|
void TEXT_REGION::add_a_region(TEXT_REGION *newchild) {
|
||
|
TEXT_REGION_IT c = &txt_regions;
|
||
|
|
||
|
c.move_to_first ();
|
||
|
c.add_to_end (newchild);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**********************************************************************
|
||
|
* TEXT_REGION::rotate
|
||
|
*
|
||
|
* Rotate the TEXT_REGION and its children
|
||
|
**********************************************************************/
|
||
|
|
||
|
void TEXT_REGION::rotate( //cos,sin
|
||
|
FCOORD rotation) {
|
||
|
//sub block iterator
|
||
|
TEXT_REGION_IT child_it = &txt_regions;
|
||
|
TEXT_REGION *child; //child block
|
||
|
|
||
|
for (child_it.mark_cycle_pt (); !child_it.cycled_list ();
|
||
|
child_it.forward ()) {
|
||
|
child = child_it.data ();
|
||
|
child->rotate (rotation);
|
||
|
}
|
||
|
POLY_BLOCK::rotate(rotation);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**********************************************************************
|
||
|
* TEXT_REGION::move
|
||
|
*
|
||
|
* Move the TEXT_REGION and its children
|
||
|
**********************************************************************/
|
||
|
|
||
|
void TEXT_REGION::move(ICOORD shift //amount to move
|
||
|
) {
|
||
|
//sub block iterator
|
||
|
TEXT_REGION_IT child_it = &txt_regions;
|
||
|
TEXT_REGION *child; //child block
|
||
|
|
||
|
for (child_it.mark_cycle_pt (); !child_it.cycled_list ();
|
||
|
child_it.forward ()) {
|
||
|
child = child_it.data ();
|
||
|
child->move (shift);
|
||
|
}
|
||
|
POLY_BLOCK::move(shift);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**********************************************************************
|
||
|
* TEXT_REGION::serialise_asc() Convert to ascii file.
|
||
|
*
|
||
|
**********************************************************************/
|
||
|
|
||
|
void TEXT_REGION::serialise_asc( //convert to ascii
|
||
|
FILE *f //file to use
|
||
|
) {
|
||
|
((POLY_BLOCK *) this)->serialise_asc (f);
|
||
|
serialise_INT32(f, id_number); //unique id
|
||
|
//horizontal, vertical, skewed
|
||
|
serialise_INT32(f, horizontal);
|
||
|
serialise_INT32(f, text); //text, table, form
|
||
|
serialise_INT32(f, serif); //serif, sansserif
|
||
|
//proportional, fixed
|
||
|
serialise_INT32(f, proportional);
|
||
|
serialise_INT32(f, normal); //normal, bold
|
||
|
serialise_INT32(f, upright); //upright, italic
|
||
|
serialise_INT32(f, solid); //solid, outline
|
||
|
serialise_INT32(f, black); //black, coloured, white,
|
||
|
//not underlined, underlined
|
||
|
serialise_INT32(f, underlined);
|
||
|
serialise_INT32(f, dropcaps); //not dropcaps, dropcaps
|
||
|
|
||
|
txt_regions.serialise_asc (f);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**********************************************************************
|
||
|
* TEXT_REGION::de_serialise_asc() Convert from ascii file.
|
||
|
*
|
||
|
**********************************************************************/
|
||
|
|
||
|
void TEXT_REGION::de_serialise_asc( //convert from ascii
|
||
|
FILE *f //file to use
|
||
|
) {
|
||
|
((POLY_BLOCK *) this)->de_serialise_asc (f);
|
||
|
//unique id
|
||
|
id_number = de_serialise_INT32 (f);
|
||
|
//horizontal, vertical, skewed
|
||
|
horizontal = de_serialise_INT32 (f);
|
||
|
text = de_serialise_INT32 (f); //text, table, form
|
||
|
serif = de_serialise_INT32 (f);//serif, sansserif
|
||
|
//proportional, fixed
|
||
|
proportional = de_serialise_INT32 (f);
|
||
|
//normal, bold
|
||
|
normal = de_serialise_INT32 (f);
|
||
|
//upright, italic
|
||
|
upright = de_serialise_INT32 (f);
|
||
|
solid = de_serialise_INT32 (f);//solid, outline
|
||
|
black = de_serialise_INT32 (f);//black, coloured, white,
|
||
|
//not underlined, underlined
|
||
|
underlined = de_serialise_INT32 (f);
|
||
|
//not dropcaps, dropcaps
|
||
|
dropcaps = de_serialise_INT32 (f);
|
||
|
|
||
|
txt_regions.de_serialise_asc (f);
|
||
|
}
|