/*---------------------------------------------------------------------------*/ Bool LoadLinesSpecInfo (Handle hC, void *vB, Handle Key, int Cnt) { int i; uint32_t err32, nTeor, nReal; Handle hBlockLineSpec; Handle hBlockLinePrev; UN_BUFF *pB; char *vCurr; pB = (UN_BUFF *)vB; vCurr = (char *)pB->vCurr; nTeor = sizeof (LineInfo); for (i=0; i<Cnt; i++) { /* ключ к данным */ if (i==0) hBlockLineSpec = CPAGE_GetBlockFirst (hC, Key); else hBlockLineSpec = CPAGE_GetBlockNext (hC, hBlockLinePrev, Key); err32 = CPAGE_GetReturnCode (); if ((err32!=0)||(hBlockLineSpec==NULL)) { #ifdef Almi if (i==0) AM_Console ("RLTABLE : Ошибка чужой библиотеки - [CPAGE]%s", "[GetBlockFirst]"); else AM_Console ("RLTABLE : Ошибка чужой библиотеки - [CPAGE]%s", "[GetBlockNext]"); #endif return FALSE; } /* собственно данные */ nReal = CPAGE_GetBlockData (hC, hBlockLineSpec, Key, (void *)vCurr, nTeor); err32 = CPAGE_GetReturnCode (); if ((nReal!=nTeor)||(err32!=0)) { #ifdef Almi AM_Console ("RLTABLE : Ошибка чужой библиотеки - [CPAGE]%s", "[GetBlockData]"); #endif return FALSE; } hBlockLinePrev = hBlockLineSpec; vCurr += nTeor; } EndLastDataPart (vB, UN_DA_Unknown, UN_DT_LineInfo, nTeor, Cnt); return TRUE; }
/*---------------------------------------------------------------------------*/ Bool LoadLinesTotalInfo_rv (Handle hC, void *vB, char *pStr) { uint32_t err32, nTeor, nReal; Handle hBlockLine; UN_BUFF *pB; pB = (UN_BUFF *)vB; /* ключ к данным */ hBlockLine = CPAGE_GetBlockFirst (hC, RLINE_BLOCK_TYPE); if (!hBlockLine) { sprintf (pStr, "Линии не выделялись."); return RV_EMPTY; } err32 = CPAGE_GetReturnCode (); if (err32!=0) { #ifdef Almi AM_Console ("RLTABLE : Ошибка чужой библиотеки - [CPAGE]%s", "[GetBlockFirst]"); #endif return RV_FALSE; } /* собственно данные */ nTeor = sizeof (LinesTotalInfo); if ((int)nTeor>pB->SizeCurr) { sprintf (pStr, "Не хватило памяти под 1, инфо-линии!"); return RV_DOUBT; } nReal = CPAGE_GetBlockData (hC, hBlockLine, RLINE_BLOCK_TYPE, pB->vCurr, nTeor); err32 = CPAGE_GetReturnCode (); if ((nReal!=nTeor)||(err32!=0)) { #ifdef Almi AM_Console ("RLTABLE : Ошибка чужой библиотеки - [CPAGE]%s", "[GetBlockData]"); #endif return RV_FALSE; } EndLastDataPart (vB, UN_DA_Unknown, UN_DT_LinesTotalInfo, nTeor, 1); return RV_TRUE; }
Bool32 MyGetZher (void **vvZher, int32_t *nZher, int32_t MaxZher, Handle hCPage) { uint32_t err32, nTeor, nReal; Handle hBlockZher; Handle hBlockPrev; int i; nTeor = sizeof (void *); i=0; while (1) { if (i==0) hBlockZher = CPAGE_GetBlockFirst (hCPage, RVERLINE_ZHERTVY_LINIY); else hBlockZher = CPAGE_GetBlockNext (hCPage, hBlockPrev, RVERLINE_ZHERTVY_LINIY); err32 = CPAGE_GetReturnCode (); if (err32!=0) { //if (i==0) // Error_CPage ("[GetBlockFirst]"); //else // Error_CPage ("[GetBlockNext]"); return FALSE; } if (!hBlockZher) break; if (i>=MaxZher) return FALSE; nReal = CPAGE_GetBlockData (hCPage, hBlockZher, RVERLINE_ZHERTVY_LINIY, (void *)&(vvZher[i]), nTeor); err32 = CPAGE_GetReturnCode (); if (!nReal||(err32!=0)) { //Error_CPage ("[SetBlockData]"); return FALSE; } hBlockPrev = hBlockZher; i++; } *nZher = i; return TRUE; }
void PageMarker::restoreLayout() { image_data_->hCPAGE = CPAGE_RestorePage(TRUE, layout_filename_.c_str()); if (image_data_->hCPAGE == NULL) { Debug() << BOOST_CURRENT_FUNCTION << " CPAGE_RestorePage failed with code: " << CPAGE_GetReturnCode() << std::endl; throw Exception("CPAGE_RestorePage failed"); } CPAGE_SetCurrentPage(CPAGE_GetNumberPage(image_data_->hCPAGE)); Debug() << "Layout restored from file: \"" << layout_filename_ << "\"\n"; }
/*---------------------------------------------------------------------------*/ Bool LoadPicts_rv (Handle hC, void *vB, char *pStr) { int SizeCurr, Deficit, nRc; uint32_t err32, nTeor, nReal; Bool ret; POLY_ Pict; Handle hBlockPictSpec; Handle hBlockPictPrev; UN_BUFF *pB; Rect16 *pCurr; pB = (UN_BUFF *)vB; nRc = 0; Deficit = 0; pCurr = (Rect16 *)pB->vCurr; SizeCurr = pB->SizeCurr; nTeor = sizeof (POLY_); hBlockPictPrev = NULL; while (1) { /* ключ к данным */ if (hBlockPictPrev==NULL) hBlockPictSpec = CPAGE_GetBlockFirst (hC, TYPE_IMAGE); else hBlockPictSpec = CPAGE_GetBlockNext (hC, hBlockPictPrev, TYPE_IMAGE); err32 = CPAGE_GetReturnCode (); if (hBlockPictSpec==NULL) break; if (err32!=0) { if (hBlockPictPrev==NULL) sprintf (pStr, "[GetBlockFirst]"); else sprintf (pStr, "[GetBlockNext]"); return FALSE; } /* собственно данные */ nReal = CPAGE_GetBlockData (hC, hBlockPictSpec, TYPE_IMAGE, (void *)(&Pict), nTeor); err32 = CPAGE_GetReturnCode (); if ((nReal!=nTeor)||(err32!=0)) { sprintf (pStr, "[GetBlockData]"); return FALSE; } hBlockPictPrev = hBlockPictSpec; if ((int)nTeor > SizeCurr) { Deficit++; continue; } nRc++; ret = MakeRectFromPict (pCurr, (void *)(&Pict)); #include "am_comm.h" #ifdef Almi #include "ft_rule.h" if (!ret) { if (!AM_Skip (FT_GetKeyOfRule (RU_FT_C_ContWarn))) AM_Console ("Не удалось осмыслить картинку!"); continue; } #endif pCurr++; SizeCurr -= sizeof (Rect16); } if (nRc==0) { sprintf (pStr, "Нет картинок"); return RV_EMPTY; } EndLastDataPart (vB, UN_DA_PictReal, UN_DT_Rect16, sizeof (Rect16), nRc); if (Deficit > 0) { sprintf (pStr, "Не хватило памяти под %d %s!", Deficit, "коробки картинок"); return RV_DOUBT; } return RV_TRUE; }
Bool32 ModulesInit(Handle ghStorage) { // CONTEINERS if(!CLINE_Init(PUMA_MODULE_CLINE,NULL)) { SetReturnCode_puma(CLINE_GetReturnCode()); goto lError; } if(!CFIO_Init(PUMA_MODULE_CFIO,NULL)) { SetReturnCode_puma(CFIO_GetReturnCode()); goto lError; } /* ghStorage = OpenStorage(szStorage,OS_CREATE); if(ghStorage==NULL) { SetReturnCode_puma(IDS_ERR_CREATESTORAGE); goto lError; } */ if(!CIMAGE_Init(PUMA_MODULE_CIMAGE,NULL)) { SetReturnCode_puma(CIMAGE_GetReturnCode()); goto lError; } if(!CCOM_Init(PUMA_MODULE_CCOM,NULL)) // нужна инициализация контейнера CCOM перед { // вызовом поиска компонент SetReturnCode_puma(CCOM_GetReturnCode()); goto lError; } if(!CPAGE_Init(PUMA_MODULE_CPAGE,ghStorage)) { SetReturnCode_puma(CPAGE_GetReturnCode()); goto lError; } if(!CSTR_Init(PUMA_MODULE_CSTR,ghStorage)) { SetReturnCode_puma(CSTR_GetReturnCode()); goto lError; } // RECOGNITIONS if(!REXC_Init(PUMA_MODULE_REXC,NULL)) // инициализация библиотеки поиска компонент { SetReturnCode_puma(REXC_GetReturnCode()); goto lError; } // REXC_SetImportData(REXC_OcrPath, GetModulePath()); if(!RLINE_Init(PUMA_MODULE_RLINE,ghStorage)) { SetReturnCode_puma(RLINE_GetReturnCode()); goto lError; } if(!RRECCOM_Init(PUMA_MODULE_RRECCOM,ghStorage)) { SetReturnCode_puma(RRECCOM_GetReturnCode()); goto lError; } RRECCOM_SetImportData(RRECCOM_OcrPath, GetModulePath()); if(!RSL_Init(PUMA_MODULE_RSL,ghStorage)) { SetReturnCode_puma(RSL_GetReturnCode()); goto lError; } if(!RSTUFF_Init(PUMA_MODULE_RSTUFF,ghStorage)) { SetReturnCode_puma(RSTUFF_GetReturnCode()); goto lError; } if(!RMARKER_Init(PUMA_MODULE_RBLOCK,ghStorage)) { SetReturnCode_puma(RMARKER_GetReturnCode()); goto lError; } if(!RBLOCK_Init(PUMA_MODULE_RBLOCK,ghStorage)) { SetReturnCode_puma(RBLOCK_GetReturnCode()); goto lError; } if(!RSELSTR_Init(PUMA_MODULE_RBLOCK,ghStorage)) { SetReturnCode_puma(RSELSTR_GetReturnCode()); goto lError; } RSTR_SetImportData(RSTR_OcrPath, GetModulePath()); RSTR_SetImportData(RSTR_pchar_temp_dir, GetModuleTempPath()); if(!RSTR_Init(PUMA_MODULE_RSTR,ghStorage)) { SetReturnCode_puma(RSTR_GetReturnCode()); goto lError; } if(!RFRMT_Init(PUMA_MODULE_RFRMT,ghStorage)) { SetReturnCode_puma(RFRMT_GetReturnCode()); goto lError; } if(!RIMAGE_Init(PUMA_MODULE_RIMAGE,ghStorage)) { SetReturnCode_puma(RIMAGE_GetReturnCode()); goto lError; } // Инициализируем виртуальные функции if(!RPSTR_Init(PUMA_MODULE_RPSTR,ghStorage)) { SetReturnCode_puma(RPSTR_GetReturnCode()); goto lError; } if(!RPIC_Init(PUMA_MODULE_RPIC,ghStorage)) { SetReturnCode_puma(RPIC_GetReturnCode()); goto lError; } if(!CED_Init(PUMA_MODULE_CED,ghStorage)) { SetReturnCode_puma(CED_GetReturnCode()); goto lError; } if(!ROUT_Init(PUMA_MODULE_ROUT,ghStorage)) { SetReturnCode_puma(ROUT_GetReturnCode()); goto lError; } else { if(!ROUT_LoadRec6List("rec6all.dat")) { SetReturnCode_puma(ROUT_GetReturnCode()); goto lError; } } #ifdef _USE_RVERLINE_ if(!RVERLINE_Init(PUMA_MODULE_RVERLINE,ghStorage)) { SetReturnCode_puma(RVERLINE_GetReturnCode()); goto lError; } #endif //_USE_RVERLINE_ #ifdef _USE_RMSEGMENT_ if(!RMSEGMENT_Init(PUMA_MODULE_RMSEGMENT,ghStorage)) { SetReturnCode_puma(RMSEGMENT_GetReturnCode()); goto lError; } #endif //_USE_RMSEGMENT_ if(!RCORRKEGL_Init(PUMA_MODULE_RCORRKEGL,ghStorage)) { goto lError; } //#ifdef _DEBUG My_SJTL_Init(); if( !LDPUMA_Skip(hDebugEnableSaveJtl) ) { My_SJTL_open("one.frm", "one.jtl"); } /* FIXME: could not figure out what to do with this in Linux, so disabled it. _CrtMemCheckpoint( &g_dbgMemState ); */ //#endif return TRUE; lError: ModulesDone(ghStorage); return FALSE; }
/*---------------------------------------------------------------------------*/ Bool MyReSetLines (void *vLti, int MaxNumLin, Handle hCPage, Handle HoriType , Handle VertType, char *pStr) { int i; uint32_t err32, nTeor;//, nReal; Bool32 nReal;//differ Handle hBlockLine; Handle hBlockLineHor; Handle hBlockLineVer; Handle hBlockLinePrev; void *Hor, *Ver; LinesTotalInfo *pLti; pLti = (LinesTotalInfo *)vLti; /*** Общая информация о линиях ***/ Hor = pLti->Hor.Lns; Ver = pLti->Ver.Lns; pLti->Hor.Lns = (LineInfo *)HoriType; pLti->Ver.Lns = (LineInfo *)VertType; hBlockLine = CPAGE_GetBlockFirst (hCPage, RLINE_BLOCK_TYPE); err32 = CPAGE_GetReturnCode (); if (err32!=0) { sprintf (pStr, "RLTABLE : Ошибка чужой библиотеки - [CPAGE][GetBlockFirst]"); return FALSE; } nTeor = sizeof (LinesTotalInfo); nReal = CPAGE_SetBlockData (hCPage, hBlockLine, RLINE_BLOCK_TYPE, (void *)pLti, nTeor); err32 = CPAGE_GetReturnCode (); // if ((nReal!=nTeor)||(err32!=0)) if (!nReal||(err32!=0)) { sprintf (pStr, "RLTABLE : Ошибка чужой библиотеки - [CPAGE][SetBlockData]"); return FALSE; } pLti->Hor.Lns = (LineInfo *)Hor; pLti->Ver.Lns = (LineInfo *)Ver; /*** Горизонтальные линии ***/ for (i=0; i<pLti->Hor.Cnt; i++) { if (i==0) hBlockLineHor = CPAGE_GetBlockFirst (hCPage, HoriType); else hBlockLineHor = CPAGE_GetBlockNext (hCPage, hBlockLinePrev, HoriType); err32 = CPAGE_GetReturnCode (); if (err32!=0) { if (i==0) sprintf (pStr, "RLTABLE : Ошибка чужой библиотеки - [CPAGE][GetBlockFirst]"); else sprintf (pStr, "RLTABLE : Ошибка чужой библиотеки - [CPAGE][GetBlockNext]"); return FALSE; } nTeor = sizeof (LineInfo); nReal = CPAGE_SetBlockData (hCPage, hBlockLineHor, HoriType, (void *)&(pLti->Hor.Lns[i]), nTeor); err32 = CPAGE_GetReturnCode (); // if ((nReal!=nTeor)||(err32!=0)) if (!nReal||(err32!=0)) { sprintf (pStr, "RLTABLE : Ошибка чужой библиотеки - [CPAGE][SetBlockData]"); return FALSE; } hBlockLinePrev = hBlockLineHor; } /*** Вертикальные линии ***/ for (i=0; i<pLti->Ver.Cnt; i++) { if (i==0) hBlockLineVer = CPAGE_GetBlockFirst (hCPage, VertType); else hBlockLineVer = CPAGE_GetBlockNext (hCPage, hBlockLinePrev, VertType); err32 = CPAGE_GetReturnCode (); if (err32!=0) { if (i==0) sprintf (pStr, "RLTABLE : Ошибка чужой библиотеки - [CPAGE][GetBlockFirst]"); else sprintf (pStr, "RLTABLE : Ошибка чужой библиотеки - [CPAGE][GetBlockNext]"); return FALSE; } nTeor = sizeof (LineInfo); nReal = CPAGE_SetBlockData (hCPage, hBlockLineVer, VertType, (void *)&(pLti->Ver.Lns[i]), nTeor); err32 = CPAGE_GetReturnCode (); // if ((nReal!=nTeor)||(err32!=0)) if (!nReal||(err32!=0)) { sprintf (pStr, "RLTABLE : Ошибка чужой библиотеки - [CPAGE][SetBlockData]"); return FALSE; } hBlockLinePrev = hBlockLineVer; } return TRUE; }
///////////////////////////////////////////////////////////////////////////////////////////////////// // //Bool32 AboutLines(PRSPreProcessImage Image, Bool32 *BadScan, int32_t *ScanQual) //{ // return TRUE; //} ///////////////////////////////////////////////////////////////////////////////////////////////////// // Bool32 CalcIncline(PRSPreProcessImage Image) { int SizeWork,SizeMain; char Str[256]; Bool ret, WasLine, ManyComp; Bool CalcMuchSkew, TalkMuchSkew; uint16_t Code; int32_t SkewReg, Skew, SkewLocVerLin; Rect16 RcReg; PAGEINFO info = {0}; UN_BUFF MainBuff = {0}; void *vMain; char *cWork; Handle hCPage=Image->hCPAGE; CLINE_handle hCLINE=*((CLINE_handle*)Image->phCLINE); GetPageInfo(hCPage,&info); /* 2. Инициализация. */ /*** переменные ***/ WasLine = 0; /*** организация памяти ***/ GiveMainBuff (&vMain, &SizeMain); MainBuff.vBuff = vMain; MainBuff.SizeBuff = SizeMain; MainBuff.vCurr = MainBuff.vBuff; MainBuff.SizeCurr = MainBuff.SizeBuff; GiveWorkBuff (&cWork, &SizeWork); /*** линии ***/ // if(!LDPUMA_Skip(hUseCLine)) ret=LoadLinesVP_rv(hCLINE,UN_LD_LinesVP2,&MainBuff,Str,&Code); // else // ret = LoadLinesVP_rv (hCPage, UN_LD_LinesVP, (void *)(&MainBuff), Str, &Code); if ((ret!=RV_TRUE)&&(ret!=RV_EMPTY)) { SetReturnCode_rstuff (Code); return ret; } WasLine = (ret==RV_TRUE); /*** компоненты ***/ ret = LoadComps_rv (*(Image->phCCOM), (void *)(&MainBuff), Str, 0); //t-e-d if (ret==RV_DOUBT) { SetReturnCode_rstuff (Code); CleanLastDataPart ((void *)(&MainBuff)); } ManyComp = (ret==RV_TRUE)&&(MainBuff.nPartUnits[MainBuff.nPart-1]>10000); if (ManyComp) { CleanLastDataPart ((void *)(&MainBuff)); } if (ret==RV_DOUBT||ManyComp) { ret = LoadComps_rv (*(Image->phCCOM), (void *)(&MainBuff), Str, 3); //t-e-d if (ret==RV_DOUBT) { SetReturnCode_rstuff (Code); CleanLastDataPart ((void *)(&MainBuff)); } } if (ret!=RV_TRUE) { return ret; } RcReg.left=0; RcReg.right=(int16_t)info.Width; RcReg.top=0; RcReg.bottom=(int16_t)info.Height; SkewReg=0; Bool ContWarn = 0; SkewLocVerLin = 0; CalcMuchSkew = (!LDPUMA_Skip(hCalcMuchSkew)); TalkMuchSkew = (!LDPUMA_Skip(hTalkMuchSkew)); // 5.1 Определяем угол наклона страницы (ее заполнения в целом). // if(!LDPUMA_Skip(hUseCLine)) ret=ConvertLinesToAM_rv (UN_LD_LinesVP2, UN_LD_LinesAM, (void *)(&MainBuff) ,(int *)cWork, SizeWork / sizeof (int), &RcReg, SkewReg, Str, ContWarn); // else // ret = ConvertLinesToAM_rv (UN_LD_LinesVP, UN_LD_LinesAM, (void *)(&MainBuff) // ,(int *)cWork, SizeWork / sizeof (int), &RcReg, SkewReg, Str, ContWarn); // f-t-e-d if (ret==RV_DOUBT) { SetReturnCode_rstuff (Code); } if (ret!=RV_TRUE) return ret; SMetric_SetImportData(SMetric_ResolX, (void *)info.DPIX); SMetric_SetImportData(SMetric_ResolY, (void *)info.DPIY); ret = SMetric_FindMainSkew ((void *)(&MainBuff), cWork, SizeWork, &Skew , &SkewLocVerLin, &RcReg, SkewReg, Str, CalcMuchSkew, TalkMuchSkew); if (ret!=RV_TRUE) return ret; info.Incline2048 = Skew*2; info.SkewLocVerLin2048 = SkewLocVerLin*2; if(!CPAGE_SetPageData(Image->hCPAGE,PT_PAGEINFO,&info,sizeof(PAGEINFO))) { SetReturnCode_rstuff(CPAGE_GetReturnCode()); return FALSE; } return TRUE; }