• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**********************************************************************
2  * File:        ocrclass.h
3  * Description: Class definitions and constants for the OCR API.
4  * Author:					Hewlett-Packard Co
5  *
6  * (C) Copyright 1996, Hewlett-Packard Co.
7  ** Licensed under the Apache License, Version 2.0 (the "License");
8  ** you may not use this file except in compliance with the License.
9  ** You may obtain a copy of the License at
10  ** http://www.apache.org/licenses/LICENSE-2.0
11  ** Unless required by applicable law or agreed to in writing, software
12  ** distributed under the License is distributed on an "AS IS" BASIS,
13  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  ** See the License for the specific language governing permissions and
15  ** limitations under the License.
16  *
17  **********************************************************************/
18 
19 /**********************************************************************
20  * This file contains typedefs for all the structures used by
21  * the HP OCR interface.
22  * The code is designed to be used with either a C or C++ compiler.
23  * The structures are designed to allow them to be used with any
24  * structure alignment upto 8.
25  **********************************************************************/
26 
27 #ifndef           OCRCLASS_H
28 #define           OCRCLASS_H
29 
30 #include          <time.h>
31 #ifdef __MSW32__
32 #include          <windows.h>
33 #endif
34 #include          "host.h"
35 
36 /*Maximum lengths of various strings*/
37 #define MAX_FONT_NAME   34       /*name of font */
38 #define MAX_OCR_NAME    32       /*name of engine */
39 #define MAX_OCR_VERSION   17     /*version code of engine */
40 
41 /*Image parameters*/
42 #define MIN_IMAGE_SIZE    64     /*smallest image that will be passed */
43 #define IMAGE_ROUNDING    32     /*all sizes are multiple of this */
44 
45 #if defined(__SLOW_TIMES__)
46 /*Maximum timeouts of various functions (in secs)*/
47 #define STARTUP_TIMEOUT   100    /*start of OCR engine */
48 #define SHUTDOWN_TIMEOUT  50     /*end of OCR engine */
49 #define SENDIM_TIMEOUT    50     /*send of image */
50 #define RELEASE_TIMEOUT   50     /*release of semaphore */
51 #define READIM_TIMEOUT    100    /*read of image */
52 #define READTEXT_TIMEOUT  50     /*read of text */
53 #define PROGRESS_TIMEOUT  30     /*progress every 3 seconds */
54 #define BADTIMES_TIMEOUT  7      /*max lack of progress */
55 #else
56 /*Maximum timeouts of various functions (in secs)*/
57 #define STARTUP_TIMEOUT   10     /*start of OCR engine */
58 #define SHUTDOWN_TIMEOUT  6      /*end of OCR engine */
59 #define SENDIM_TIMEOUT    5      /*send of image */
60 #define RELEASE_TIMEOUT   5      /*release of semaphore */
61 #define READIM_TIMEOUT    10     /*read of image */
62 #define READTEXT_TIMEOUT  5      /*read of text */
63 #define PROGRESS_TIMEOUT  3      /*progress every 3 seconds */
64 #define BADTIMES_TIMEOUT  7      /*max lack of progress */
65 #endif
66 
67 /*language definitions are identical to RTF*/
68 #define LANGE_NONE      0x0400   /*no language */
69 #define LANGE_ALBANIAN    0x041c /*Albanian */
70 #define LANGE_BRITISH   0x0809   /*International English */
71 #define LANGE_BULGARIAN   0x0402 /*Bulgarian */
72 #define LANGE_CROATIAN    0x041a /*Croatian(latin alphabet) */
73 #define LANGE_CZECH     0x0405   /*Czech */
74 #define LANGE_DANISH    0x0406   /*Danish */
75 #define LANGE_DUTCH     0x0413   /*Dutch */
76 #define LANGE_FINNISH   0x040b   /*Finnish */
77 #define LANGE_FRENCH    0x040c   /*French */
78 #define LANGE_GERMAN    0x0407   /*German */
79 #define LANGE_GREEK     0x0408   /*Greek */
80 #define LANGE_HUNGARIAN   0x040e /*Hungarian */
81 #define LANGE_ITALIAN   0x0410   /*Italian */
82 #define LANGE_JAPANESE    0x0411 /*Japanese */
83 #define LANGE_KOREAN    0x0412   /*Korean */
84 #define LANGE_NORWEGIAN   0x0414 /*Bokmal */
85 #define LANGE_POLISH    0x0415   /*Polish */
86 #define LANGE_PORTUGESE   0x0416 /*Brazilian Portugese */
87 #define LANGE_ROMANIAN    0x0418 /*Romanian */
88 #define LANGE_RUSSIAN   0x0419   /*Russian */
89 #define LANGE_SCHINESE    0x0804 /*Simplified Chinese */
90 #define LANGE_SLOVAK    0x041b   /*Slovak */
91 #define LANGE_SPANISH   0x040a   /*Castilian */
92 #define LANGE_SWEDISH   0x041d   /*Swedish */
93 #define LANGE_TCHINESE    0x0404 /*Traditional Chinese */
94 #define LANGE_TURKISH   0x041f   /*Turkish */
95 #define LANGE_USENGLISH   0x0409 /*American */
96 
97 /*font family definitions are identical to RTF*/
98 #define FFAM_NONE     0          /*unknown */
99 #define FFAM_ROMAN      1        /*serifed prop */
100 #define FFAM_SWISS      2        /*sans-serif prop */
101 #define FFAM_MODERN     3        /*fixed pitch */
102 
103 /*character set definitions are identical to RTF*/
104 #define CHSET_ANSI      0        /*Ansi efigs */
105 #define CHSET_SHIFT_JIS   128    /*JIS X 0208-1990 */
106 #define CHSET_KOREAN    129      /*KS C 5601-1992 */
107 #define CHSET_SCHINESE    134    /*GB 2312-80 */
108 #define CHSET_BIG5      136      /*Big Five */
109 #define CHSET_CYRILLIC    204    /*Cyrillic */
110 #define CHSET_EEUROPE   238      /*Eastern Europe */
111 
112 /*pitch set definitions are identical to RTF*/
113 #define PITCH_DEF     0          /*default */
114 #define PITCH_FIXED     1        /*fixed pitch */
115 #define PITCH_VAR     2          /*variable pitch */
116 
117 /*Bitmasks for character enhancements.
118 OR these together for enhancement in ocr_append_char*/
119 #define EUC_BOLD      1          /*bold character */
120 #define EUC_ITALIC      2        /*italic char */
121 #define EUC_UNDERLINE   4        /*underlined char */
122 #define EUC_SUBSCRIPT   8        /*subscript char */
123 #define EUC_SUPERSCRIPT   16     /*superscript char */
124 
125 /*enum for character rendering direction*/
126 enum OCR_CHAR_DIRECTION
127 {
128   OCR_CDIR_RIGHT_LEFT,           /*right to left horizontal */
129   OCR_CDIR_LEFT_RIGHT,           /*left to right horizontal */
130   OCR_CDIR_TOP_BOTTOM,           /*top to bottom vertical */
131   OCR_CDIR_BOTTOM_TOP            /*bottom to top vertical */
132 };
133 
134 /*enum for line rendering direction*/
135 enum OCR_LINE_DIRECTION
136 {
137   OCR_LDIR_DOWN_RIGHT,           /*horizontal lines go down */
138   /*vertical lines go right */
139   OCR_LDIR_UP_LEFT               /*horizontal lines go up */
140 };
141 
142 /*enum for newline type*/
143 enum OCR_NEWLINE_TYPE
144 {
145   OCR_NL_NONE,                   /*not a newline */
146   OCR_NL_NEWLINE,                /*this is a newline but not new para */
147   OCR_NL_NEWPARA                 /*this is a newline and a new para */
148 };
149 
150 /*error codes that can be returned from the API functions other than OKAY and HPERR*/
151 #define OCR_API_NO_MEM    (-2)   /*filled output buffer */
152 #define OCR_API_BAD_CHAR  (-3)   /*whitespace sent to ocr_append_char */
153 #define OCR_API_BAD_STATE (-4)   /*invalid call sequence */
154 
155 /*error codes used for passing errors back to the HP side*/
156 enum OCR_ERR_CODE
157 {
158   OCR_ERR_NONE,                  /*no error */
159   OCR_ERR_CLEAN_EXIT,            /*no error */
160   OCR_ERR_NO_MEM,                /*out of memory */
161   OCR_ERR_FILE_READ,             /*failed to read data file */
162   OCR_ERR_TMP_WRITE,             /*failed to write temp file */
163   OCR_ERR_TMP_READ,              /*failed to read temp file */
164   OCR_ERR_BAD_DLL,               /*missing or invalid dll subcomponent */
165   OCR_ERR_BAD_EXE,               /*missing or invalid exe subcomponent */
166   OCR_ERR_BAD_LOAD,              /*failed to load subcomponent */
167   OCR_ERR_BAD_LANG,              /*unable to recognize requested language */
168   OCR_ERR_BAD_STATE,             /*engine did call out of sequence */
169   OCR_ERR_INTERNAL1,             /*internal error type 1 */
170   OCR_ERR_INTERNAL2,             /*internal error type 1 */
171   OCR_ERR_INTERNAL3,             /*internal error type 1 */
172   OCR_ERR_INTERNAL4,             /*internal error type 1 */
173   OCR_ERR_INTERNAL5,             /*internal error type 1 */
174   OCR_ERR_INTERNAL6,             /*internal error type 1 */
175   OCR_ERR_INTERNAL7,             /*internal error type 1 */
176   OCR_ERR_INTERNAL8,             /*internal error type 1 */
177   OCR_ERR_TIMEOUT                /*timed out in comms */
178 };                               /*for calls to ocr_error */
179 
180 /**********************************************************************
181  * EFONT_DESC
182  * Description of one font.
183  * The information required is basically that used by RTF.
184  * The name may be either a valid font on the system or the empty string.
185  **********************************************************************/
186 
187 typedef struct                   /*font description */
188 {
189   uinT16 language;               /*default language */
190   uinT8 font_family;             /*serif/not, fixed/not */
191   uinT8 char_set;                /*character set standard */
192   uinT8 pitch;                   /*fixed or prop */
193   inT8 name[MAX_FONT_NAME + 1];  /*plain ascii name */
194 } EFONT_DESC;                    /*font description */
195 
196 /**********************************************************************
197  * EOCR_DESC
198  * Description of the OCR engine provided at startup.
199  * The name and version may be reported to the user at some point.
200  * The fonts array should indicate the fonts that the OCR system
201  * can recognize.
202  **********************************************************************/
203 
204 typedef struct                   /*startup info */
205 {
206   inT32 protocol;                /*interface version */
207   uinT32 font_count;             /*number of fonts */
208   uinT16 language;               /*default language */
209   uinT16 name[MAX_OCR_NAME + 1]; /*name of engine */
210                                  /*version of engine */
211   uinT16 version[MAX_OCR_VERSION + 1];
212   EFONT_DESC fonts[1];           /*array of fonts */
213 } EOCR_DESC;                     /*startup info */
214 
215 /**********************************************************************
216  * ESTRIP_DESC
217  * Description of the image strip as it is passed to the engine.
218  * The image is always 1 bit, with 1=black.
219  * The width is always a multiple of 32, so padding is always OK.
220  * The height of the full image is always a multiple of 32.
221  * The top y coordinate is 0, and increases down.
222  * The top leftmost pixel is in the most significant bit of the first byte.
223  **********************************************************************/
224 
225 typedef struct                   /*bitmap strip */
226 {
227   inT16 x_size;                  /*width in pixels */
228   inT16 y_size;                  /*of full image */
229   inT16 strip_size;              /*of this strip */
230   inT16 resolution;              /*pixels per inch */
231   uinT8 data[8];                 /*image data */
232 } ESTRIP_DESC;                   /*bitmap strip */
233 
234 /**********************************************************************
235  * EANYCODE_CHAR
236  * Description of a single character. The character code is defined by
237  * the character set of the current font.
238  * Output text is sent as an array of these structures.
239  * Spaces and line endings in the output are represented in the
240  * structures of the surrounding characters. They are not directly
241  * represented as characters.
242  * The first character in a word has a positive value of blanks.
243  * Missing information should be set to the defaults in the comments.
244  * If word bounds are known, but not character bounds, then the top and
245  * bottom of each character should be those of the word. The left of the
246  * first and right of the last char in each word should be set. All other
247  * lefts and rights should be set to -1.
248  * If set, the values of right and bottom are left+width and top+height.
249  * Most of the members come directly from the parameters to ocr_append_char.
250  * The formatting member uses the enhancement parameter and combines the
251  * line direction stuff into the top 3 bits.
252  * The coding is 0=RL char, 1=LR char, 2=DR NL, 3=UL NL, 4=DR Para,
253  * 5=UL Para, 6=TB char, 7=BT char. API users do not need to know what
254  * the coding is, only that it is backwards compatible with the previous
255  * version.
256  **********************************************************************/
257 
258 typedef struct                   /*single character */
259 {
260 // It should be noted that the format for char_code for version 2.0 and beyond is UTF8
261 // which means that ASCII characters will come out as one structure but other characters
262 // will be returned in two or more instances of this structure with a single byte of the
263 // UTF8 code in each, but each will have the same bounding box.
264 // Programs which want to handle languagues with different characters sets will need to
265 // handle extended characters appropriately, but *all* code needs to be prepared to
266 // receive UTF8 coded characters for characters such as bullet and fancy quotes.
267   uinT16 char_code;              /*character itself */
268   inT16 left;                    /*of char (-1) */
269   inT16 right;                   /*of char (-1) */
270   inT16 top;                     /*of char (-1) */
271   inT16 bottom;                  /*of char (-1) */
272   inT16 font_index;              /*what font (0) */
273   uinT8 confidence;              /*0=perfect, 100=reject (0/100) */
274   uinT8 point_size;              /*of char, 72=i inch, (10) */
275   inT8 blanks;                   /*no of spaces before this char (1) */
276   uinT8 formatting;              /*char formatting (0) */
277 } EANYCODE_CHAR;                 /*single character */
278 
279 /**********************************************************************
280  * ETEXT_DESC
281  * Description of the output of the OCR engine.
282  * This structure is used as both a progress monitor and the final
283  * output header, since it needs to be a valid progress monitor while
284  * the OCR engine is storing its output to shared memory.
285  * During progress, all the buffer info is -1.
286  * Progress starts at 0 and increases to 100 during OCR. No other constraint.
287  * Every progress callback, the OCR engine must set ocr_alive to 1.
288  * The HP side will set ocr_alive to 0. Repeated failure to reset
289  * to 1 indicates that the OCR engine is dead.
290  * If the cancel function is not null then it is called with the number of
291  * user words found. If it returns true then operation is cancelled.
292  **********************************************************************/
293 typedef bool (*CANCEL_FUNC)(void* cancel_this, int words);
294 
295 typedef struct ETEXT_STRUCT      /*output header */
296 {
297   inT16 count;                   /*chars in this buffer(0) */
298   inT16 progress;                /*percent complete increasing (0-100) */
299   inT8 more_to_come;             /*true if not last */
300   inT8 ocr_alive;                /*ocr sets to 1, HP 0 */
301   inT8 err_code;                 /*for errcode use */
302   CANCEL_FUNC cancel;            /*returns true to cancel */
303   void* cancel_this;             /*this or other data for cancel*/
304   clock_t end_time;              /*time to stop if not 0*/
305   EANYCODE_CHAR text[1];         /*character data */
306 } ETEXT_DESC;                    /*output header */
307 
308 #ifdef __MSW32__
309 /**********************************************************************
310  * ESHM_INFO
311  * This data structure is used internally to the API to hold the handles
312  * to the operating system tools used for interprocess communications.
313  * API users do not access this structure directly.
314  **********************************************************************/
315 typedef struct                   /*shared mem info */
316 {
317   HANDLE shm_hand;               /*handle to shm */
318   HANDLE mutex;                  /*alive check */
319   HANDLE ocr_sem;                /*ocr semaphore */
320   HANDLE hp_sem;                 /*hp semaphore */
321   void *shm_mem;                 /*shared memory */
322   inT32 shm_size;                /*size of shm */
323 } ESHM_INFO;                     /*shared mem info */
324 #elif defined (__MAC__)
325 typedef struct                   /*shared mem info */
326 {
327   Boolean mutex;                 /*alive check */
328   Boolean ocr_sem;               /*ocr semaphore */
329   Boolean hp_sem;                /*hp semaphore */
330   void *shm_mem;                 /*shared memory */
331   inT32 shm_size;                /*size of shm */
332   inT16 language;
333 
334   // Process management information follows:
335   ProcessSerialNumber IPEProcess;
336   ProcessSerialNumber OCRProcess;
337 } ESHM_INFO;
338 #elif defined (__UNIX__)
339 typedef struct                   /*shared mem info */
340 {
341   void *shm_mem;                 /*shared memory */
342   inT32 shm_size;                /*size of shm */
343 } ESHM_INFO;
344 #endif
345 #endif
346