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