/////////////////////////////////////////////////////////////////////// // 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;icount;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); } }