| /////////////////////////////////////////////////////////////////////// |
| // File: tessdll.cpp |
| // Description: Windows dll interface for Tesseract. |
| // Author: Glen Wernersbach |
| // Created: Tue May 15 10:30:01 PDT 2007 |
| // |
| // (C) Copyright 2007, Jetsoftdev. |
| // 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. |
| // |
| /////////////////////////////////////////////////////////////////////// |
| // tessdll.cpp : Defines the entry point for the DLL application. |
| // |
| |
| #include "stdafx.h" |
| |
| |
| #include "mfcpch.h" |
| #include "applybox.h" |
| #include "control.h" |
| #include "tessvars.h" |
| #include "tessedit.h" |
| #include "pageres.h" |
| #include "imgs.h" |
| #include "varabled.h" |
| #include "tprintf.h" |
| #include "tesseractmain.h" |
| #include "stderr.h" |
| #include "notdll.h" |
| |
| |
| |
| #include "tessdll.h" |
| |
| #ifdef __MSW32__ |
| extern ESHM_INFO shm; /*info on shm */ |
| #define TICKS 1000 |
| #endif |
| |
| extern BOOL_VARIABLE tessedit_write_ratings; |
| extern BOOL_VARIABLE tessedit_write_output; |
| extern BOOL_VARIABLE tessedit_write_raw_output; |
| extern BOOL_VARIABLE tessedit_write_txt_map; |
| extern BOOL_VARIABLE tessedit_resegment_from_boxes; |
| |
| //unsigned char membuf[sizeof (ETEXT_DESC)+32000L*sizeof (EANYCODE_CHAR)]; |
| |
| BOOL APIENTRY DllMain( HANDLE hModule, |
| DWORD ul_reason_for_call, |
| LPVOID lpReserved |
| ) |
| { |
| switch (ul_reason_for_call) |
| { |
| case DLL_PROCESS_ATTACH: |
| case DLL_THREAD_ATTACH: |
| case DLL_THREAD_DETACH: |
| case DLL_PROCESS_DETACH: |
| break; |
| } |
| return TRUE; |
| } |
| |
| |
| TessDllAPI::TessDllAPI(const char* lang) { |
| uinT16 oldlang; //language |
| |
| ocr_open_shm ("0", "0", "0", "0", "0", "0", &oldlang); |
| |
| Init(NULL, lang); |
| |
| |
| if (interactive_mode) { |
| debug_window_on.set_value (TRUE); |
| } |
| |
| tessedit_write_ratings.set_value (TRUE); |
| tessedit_write_output.set_value(FALSE); |
| tessedit_write_raw_output.set_value(FALSE); |
| tessedit_write_txt_map.set_value(FALSE); |
| |
| |
| membuf = (unsigned char *) new BYTE[(sizeof (ETEXT_DESC)+32000L*sizeof (EANYCODE_CHAR))]; |
| } |
| |
| TessDllAPI::~TessDllAPI() { |
| EndPage(); |
| |
| End(); |
| |
| if (membuf) delete []membuf; |
| } |
| |
| int TessDllAPI::BeginPage(uinT32 xsize,uinT32 ysize,unsigned char *buf) |
| { |
| return BeginPage(xsize,ysize,buf,1); |
| } |
| |
| int TessDllAPI::BeginPage(uinT32 xsize,uinT32 ysize,unsigned char *buf,uinT8 bpp) { |
| SetImage(buf, xsize, ysize, bpp/8, (xsize*bpp + 7)/8); |
| return ProcessPagePass1(); |
| } |
| int TessDllAPI::BeginPageUpright(uinT32 xsize,uinT32 ysize,unsigned char *buf) |
| { |
| |
| return BeginPageUpright(xsize,ysize,buf,1); |
| } |
| |
| int TessDllAPI::BeginPageUpright(uinT32 xsize,uinT32 ysize,unsigned char *buf, uinT8 bpp) { |
| SetPageSegMode(tesseract::PSM_SINGLE_BLOCK); |
| SetImage(buf, xsize, ysize, bpp/8, (xsize*bpp + 7)/8); |
| return ProcessPagePass1(); |
| } |
| |
| int TessDllAPI::ProcessPagePass1() { |
| if (page_res_ != NULL) |
| ClearResults(); |
| if (FindLines() != 0) |
| return -1; |
| |
| page_res_ = new PAGE_RES(block_list_); |
| |
| if (page_res_) |
| tesseract_->recog_all_words(page_res_, global_monitor,0L,1); |
| |
| return (page_res_!=0); |
| } |
| |
| void TessDllAPI::EndPage() { |
| ClearResults(); |
| } |
| |
| |
| ETEXT_DESC * TessDllAPI::Recognize_all_Words(void) { |
| return Recognize_a_Block(0,0,0,0); |
| } |
| |
| ETEXT_DESC * TessDllAPI::Recognize_a_Block(uinT32 left,uinT32 right, |
| uinT32 top,uinT32 bottom) { |
| TBOX target_word_box(ICOORD (left+400, top+400), ICOORD (right+400, bottom+400)); |
| int i; |
| |
| |
| shm.shm_size=sizeof (ETEXT_DESC)+32000L*sizeof (EANYCODE_CHAR); |
| |
| memset(membuf,0,shm.shm_size); |
| shm.shm_mem=membuf; |
| |
| |
| global_monitor = ocr_setup_monitor(); |
| |
| tesseract_->recog_all_words(page_res_, global_monitor, |
| (right==0 ? 0L : &target_word_box), 2); |
| /* Disabled for now |
| for (i=0;i<global_monitor->count;i++) { |
| global_monitor->text[i].left-=400; |
| global_monitor->text[i].right-=400; |
| global_monitor->text[i].bottom-=400; |
| global_monitor->text[i].top-=400; |
| } |
| */ |
| |
| global_monitor = 0L; |
| |
| return ((ETEXT_DESC *) membuf); |
| } |
| |
| TessDllAPI *recognize=0L; |
| char* current_lang = 0L; |
| |
| extern "C" |
| { |
| |
| TESSDLL_API void __cdecl TessDllRelease() { |
| if (recognize) delete recognize; |
| recognize=0L; |
| } |
| |
| TESSDLL_API void * __cdecl TessDllInit(const char* lang) { |
| if (recognize) TessDllRelease(); |
| |
| recognize = new TessDllAPI(lang); |
| if (current_lang != 0L) |
| free(current_lang); |
| current_lang = lang ? strdup(lang) : 0L; |
| |
| return (void*) recognize; |
| } |
| |
| TESSDLL_API int __cdecl TessDllBeginPageBPP(uinT32 xsize,uinT32 ysize, |
| unsigned char *buf, uinT8 bpp) { |
| return TessDllBeginPageLangBPP(xsize, ysize, buf, NULL,bpp); |
| } |
| |
| TESSDLL_API int __cdecl TessDllBeginPageLangBPP(uinT32 xsize, uinT32 ysize, |
| unsigned char *buf, |
| const char* lang, uinT8 bpp) { |
| if (recognize==0L || (lang != 0L) != (current_lang != 0L) || |
| lang != 0L && strcmp(lang, current_lang)) |
| TessDllInit(lang); |
| |
| return recognize->BeginPage(xsize, ysize, buf,bpp); |
| } |
| |
| TESSDLL_API int __cdecl TessDllBeginPageUprightBPP(uinT32 xsize, uinT32 ysize, |
| unsigned char *buf, |
| const char* lang, uinT8 bpp) { |
| if (recognize==0L || (lang != 0L) != (current_lang != 0L) || |
| lang != 0L && strcmp(lang, current_lang)) |
| TessDllInit(lang); |
| |
| return recognize->BeginPageUpright(xsize, ysize, buf,bpp); |
| } |
| |
| TESSDLL_API int __cdecl TessDllBeginPage(uinT32 xsize,uinT32 ysize, |
| unsigned char *buf) { |
| return TessDllBeginPageLangBPP(xsize, ysize, buf, NULL,1); |
| } |
| |
| TESSDLL_API int __cdecl TessDllBeginPageLang(uinT32 xsize, uinT32 ysize, |
| unsigned char *buf, |
| const char* lang) { |
| if (recognize==0L || (lang != 0L) != (current_lang != 0L) || |
| lang != 0L && strcmp(lang, current_lang)) |
| TessDllInit(lang); |
| |
| return recognize->BeginPage(xsize, ysize, buf,1); |
| } |
| |
| TESSDLL_API int __cdecl TessDllBeginPageUpright(uinT32 xsize, uinT32 ysize, |
| unsigned char *buf, |
| const char* lang) { |
| if (recognize==0L || (lang != 0L) != (current_lang != 0L) || |
| lang != 0L && strcmp(lang, current_lang)) |
| TessDllInit(lang); |
| |
| return recognize->BeginPageUpright(xsize, ysize, buf); |
| } |
| |
| TESSDLL_API void __cdecl TessDllEndPage(void) { |
| recognize->EndPage(); |
| } |
| |
| TESSDLL_API ETEXT_DESC * __cdecl TessDllRecognize_a_Block(uinT32 left, |
| uinT32 right, |
| uinT32 top, |
| uinT32 bottom) { |
| return recognize->Recognize_a_Block(left,right,top,bottom); |
| } |
| |
| |
| TESSDLL_API ETEXT_DESC * __cdecl TessDllRecognize_all_Words(void) { |
| return recognize->Recognize_all_Words(); |
| } |
| |
| |
| |
| //deprecated funtions |
| TESSDLL_API void __cdecl ReleaseRecognize() |
| { |
| |
| if (recognize) delete recognize;recognize=0L; |
| |
| } |
| |
| |
| |
| |
| TESSDLL_API void * __cdecl InitRecognize() |
| { |
| if (recognize) ReleaseRecognize(); |
| |
| recognize = new TessDllAPI(); |
| |
| return (void*) recognize; |
| } |
| |
| TESSDLL_API int __cdecl CreateRecognize(uinT32 xsize,uinT32 ysize,unsigned char *buf) |
| { |
| InitRecognize(); |
| |
| return recognize->BeginPage(xsize,ysize,buf); |
| |
| } |
| |
| TESSDLL_API ETEXT_DESC * __cdecl reconize_a_word(uinT32 left,uinT32 right,uinT32 top,uinT32 bottom) |
| { |
| return recognize->Recognize_a_Block(left,right,top,bottom); |
| } |
| |
| |
| } |