DjVuSource::DjVuSource(const CString& strFileName, GP<DjVuDocument> pDoc, DocSettings* pSettings)
	: m_strFileName(strFileName), m_pDjVuDoc(pDoc), m_nPageCount(0), m_bHasText(false),
	  m_pSettings(pSettings)
{
	m_nPageCount = m_pDjVuDoc->get_pages_num();
	ASSERT(m_nPageCount > 0);

	m_pages.clear();
	m_pages.resize(m_nPageCount);

	if (pApplication != NULL)
	{
		if (pApplication->GetDictionaryInfo(strFileName) != NULL)
			m_dictInfo.bInstalled = true;
	}

	PageInfo info = GetPageInfo(0, false, true);
	if (info.pAnt != NULL)
	{
		m_dictInfo.ReadPageIndex(info.pAnt->metadata[pszPageIndexKey]);
		m_dictInfo.ReadCharMap(info.pAnt->metadata[pszCharMapKey]);
		m_dictInfo.ReadTitle(info.pAnt->metadata[pszTitleKey]);
		m_dictInfo.ReadLangFrom(info.pAnt->metadata[pszLangFromKey]);
		m_dictInfo.ReadLangTo(info.pAnt->metadata[pszLangToKey]);
	}
}
Exemple #2
0
void __fastcall TTiffBook::DrawCenter(TCanvas *c, int xc, int yc, int w, int h) {
//-------------------------------------------------------------------------------
//                  Рисует текущую страницу с центром (xc, yc)                  |
// Масштабирует пропроционально, в итоге будет заполнено либо w, либо h         |
//-------------------------------------------------------------------------------
    TTiffImage *img;
    if (Page >= GetNPages()) return;
    img = GetImagePage(Page);
    TTiffPageInfo *pt = GetPageInfo(Page);
    img->DrawCenter(c, xc, yc, w, h, pt->PageNumber);
}
Exemple #3
0
void CRtfWord::calcBRect() {
    PAGEINFO PageInfo;
    Handle hCPAGE = CPAGE_GetHandlePage(CPAGE_GetCurrentPage());
    if (!hCPAGE)
        throw Exception("[CRtfWord::calcBRect] CPAGE_GetHandlePage failed");

    GetPageInfo(hCPAGE, &PageInfo);

    Rect tmp = charsBRect();
    rotateRect(tmp, PageInfo.Angle, PageInfo.Width, PageInfo.Height);
    brect_ = tmp;
}
Exemple #4
0
void PageMarker::searchNegatives(CCOM_cont * cont)
{
    if(hasFlag(SKIP_SEARCH_PICTURES))
        return;

    assert(image_data_);

    PAGEINFO info;
    GetPageInfo(image_data_->hCPAGE, &info);

    RNEG_RecogNeg(cont, image_data_->hCPAGE, (uchar*) info.szImageName, info.Incline2048);
}
Exemple #5
0
bool __fastcall TTiffBook::SaveBook(String TiffFiln, TPanel *SaveFilePanel) {
//-------------------------------------------------------------------------------
//                      Сохраняет результат манипуляций                         |
// SaveFilePanel - куда будет рисовать процесс выполнения
// Если что не так - выдает сообщение и вываливается                            |
//-------------------------------------------------------------------------------
    TTiffImage *img;
    TTiffPageInfo *pt;
    String TempFiln, BakFiln;
    int i;
    char buf[50];

    // if (TiffFiln == Filn) return false;                     // /* TODO : Временно для отладки ошибки сохранения файла */

    DWORD A = GetFileAttributes(TiffFiln.c_str());
    if (A != 0xFFFFFFFF) {
        if (A & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM))
            return false;
    }

    if (A == 0xFFFFFFFF) {
        TempFiln = TiffFiln;
    } else {
        TempFiln = TrimExt(TiffFiln) + "_temp.tif";
    }

    // if (!IniSaveBitmap2Tiff(TiffFiln.c_str())) {
    if (!IniSaveBitmap2Tiff(TempFiln.c_str())) {
        return false;
    }

    for (i = 0; i < Pages->Nrecs; i++) {
        if (SaveFilePanel != NULL) {
            wsprintf(buf, "Запись страницы %d из %d", i + 1, Pages->Nrecs);
            SaveFilePanel->Caption = (String)buf;
            Application->ProcessMessages();
        }
        img = GetImagePage(i);
        pt = GetPageInfo(i);
        SaveBitmap2Tiff(img->fbm, pt->PageNumber);
    }

    StopSaveBitmap2Tiff();

    if (A != 0xFFFFFFFF) {
        String BakFiln = TrimExt(TiffFiln) + ".bak";
        DeleteFile(BakFiln);
        if (MoveFile(TiffFiln.c_str(), BakFiln.c_str()) == 0) return false;
        if (MoveFile(TempFiln.c_str(), TiffFiln.c_str()) == 0) return false;
    }

    return true;
}
Exemple #6
0
void plRegistryPageNode::LoadKeys()
{
    hsAssert(IsValid(), "Trying to load keys for invalid page");
    hsAssert(!fIsNewPage, "Trying to read a new page");
    if (IsFullyLoaded())
        return;

    hsStream* stream = OpenStream();
    if (!stream)
    {
        hsAssert(0, plString::Format("plRegistryPageNode::LoadKeysFromSource - bad stream %s,%s",
            GetPageInfo().GetAge(), GetPageInfo().GetPage()).c_str());
        return;
    }

    // If we're loading keys in the middle of a read because FindKey() failed, we'd better
    // make note of our stream position and restore it when we're done.
    uint32_t oldPos = stream->GetPosition();
    stream->SetPosition(GetPageInfo().GetIndexStart());

    // Read in the number of key types
    uint32_t numTypes = stream->ReadLE32();
    for (uint32_t i = 0; i < numTypes; i++)
    {
        uint16_t classType = stream->ReadLE16();
        plRegistryKeyList* keyList = IGetKeyList(classType);
        if (!keyList)
        {
            keyList = new plRegistryKeyList(classType);
            fKeyLists[classType] = keyList;
        }
        keyList->Read(stream);
    }

    stream->SetPosition(oldPos);
    CloseStream();
    fStaticLoadedTypes = fKeyLists.size();
}
Bool32 CreateContainerBigComp( PRSPreProcessImage Image )
{
 CCOM_handle hCCOM_old=(CCOM_handle)(*(Image->phCCOM));
 Handle hCPage=Image->hCPAGE;
 CCOM_handle hCCOM_new=0;
 BIG_IMAGE big_Image;
 PAGEINFO info = {0};
 GetPageInfo(hCPage,&info);
 int i=0;

 for(i=0;i<CPAGE_MAXNAME;i++)
	  big_Image.ImageName[i]=info.szImageName[i];

 hCCOM_new = CCOM_CreateContainer();
 if(!hCCOM_new)
 {
	big_Image.hCCOM=NULL;
    return TRUE;
 }

 CCOM_comp* comp=NULL;
 CCOM_comp* new_comp;
 comp=CCOM_GetFirst(hCCOM_old,FALSE);

  while(comp)
  {
	  if( (comp->h>=MIN_BIG_H)&&(comp->w>=MIN_BIG_W) )
	  {
	   new_comp=CCOM_New(hCCOM_new,comp->upper,comp->left,comp->w,comp->h);
	   if(new_comp)
	   {
		if(comp->size_linerep<0)
			;
		else
		{
         if(!CCOM_Copy(new_comp,comp) )
		       CCOM_Delete(hCCOM_new,comp);
		}
	   }
	  }
	  comp=CCOM_GetNext(comp,FALSE);
  }

  big_Image.hCCOM=hCCOM_new;

   CPAGE_CreateBlock(hCPage,TYPE_BIG_COMP,0,0,&big_Image,sizeof(BIG_IMAGE));
  return TRUE;
}
Exemple #8
0
int GetMediumHeight(POLY_* pBlock) {
	CCOM_comp * comp;
	int sum_height = 0;
	int count = 0;
    cf::Point16 pLeftTop;
    cf::Point16 pRightTop;
    cf::Point16 pLeftBottom;
    cf::Point16 pRightBottom;

	PAGEINFO info;
	GetPageInfo(HCPAGE, &info);
	int nIncline = info.Incline2048;

	for (comp = CCOM_GetFirst((CCOM_handle) HCCOM, NULL); comp; comp
			= CCOM_GetNext(comp, NULL)) {
		if (comp->h < inf_let_h)
			continue;

		pLeftTop.rx() =  comp->left;
		pLeftTop.ry() = comp->upper - 1;
		pRightTop.rx() =  comp->left + comp->w - 1;
		pRightTop.ry() = comp->upper - 1;
		pLeftBottom.rx() =  comp->left;
		pLeftBottom.ry() = comp->upper + comp->h - 2;
		pRightBottom.rx() =  comp->left + comp->w - 1;
		pRightBottom.ry() = comp->upper + comp->h - 2;

		IDEAL_XY(pLeftTop.rx(), pLeftTop.ry());
		IDEAL_XY(pRightTop.rx(), pRightTop.ry());
		IDEAL_XY(pLeftBottom.rx(), pLeftBottom.ry());
		IDEAL_XY(pRightBottom.rx(), pRightBottom.ry());

		if (IsInPoly(pLeftTop, pBlock) || IsInPoly(pRightTop, pBlock)
				|| IsInPoly(pLeftBottom, pBlock) || IsInPoly(pRightBottom,
				pBlock)) {
			sum_height += comp->h;
			count++;
		}
	}

	if (!count)
		return medium_statistics_h;

	return sum_height / count;
}
Exemple #9
0
Bool GetMasP(Handle hCPage, Rect16 Rc, uchar** ppmasp) {
	int prewide;
	int left = Rc.left;
	int h = Rc.bottom - Rc.top + 1;
	int w = Rc.right - Rc.left + 1;
	int upper = Rc.top - 1;
	if ((w % 8) == 0)
		prewide = w;
	else {
		prewide = w / 8 + 1;
		prewide *= 8;
	}

	PAGEINFO info;
    CIMAGE_InfoDataInGet DataInto;
    CIMAGE_InfoDataOutGet DataOut;

	char Name[CPAGE_MAXNAME];
	Bool ret;
	int i;

	//  1. Подготовка к запросу части изображения.
	DataInto.dwHeight = (uint32_t)(h);
	DataInto.dwWidth = (uint32_t)(prewide);
	DataInto.wByteWidth = (uint16_t)(prewide / 8);
	DataInto.dwX = left;
	DataInto.dwY = upper;
	GetPageInfo(hCPage, &info);
	for (i = 0; i < CPAGE_MAXNAME; i++)
		Name[i] = info.szImageName[i];
	DataOut.dwWidth = DataInto.dwWidth;
	DataOut.dwHeight = DataInto.dwHeight;
	DataOut.wByteWidth = DataInto.wByteWidth;
	DataOut.byBit = (uint16_t) info.BitPerPixel;
	DataOut.lpData = *ppmasp;

	//	  5. Чтение части изображения.
	ret = CIMAGE_GetRawData(Name, &DataInto, &DataOut);
	if (!ret)
		return FALSE;
	if (DataOut.lpData == NULL)
		return FALSE;
	*ppmasp = DataOut.lpData;
	return TRUE;
}
Exemple #10
0
void __fastcall TTiffBook::EnumPages(int start, int first) {
//-------------------------------------------------------------------------------
//                              Нумерует страницы                               |
//-------------------------------------------------------------------------------
    TTiffPageInfo *pt;
    int i, k;

    if (start == 0 || first == 0) return;

    for (i = 1, k = first; i <= Pages->Nrecs; i++) {
        pt = GetPageInfo(i-1);
        if (i < start) {
            pt->PageNumber = -1;
        } else {
            pt->PageNumber = k;
            k++;
        }
    }
}
Exemple #11
0
void ResolutionChecker::check()
{
    PAGEINFO page_info;
    if(!GetPageInfo(cpage_, &page_info))
        return;

    if(isValidResolution(page_info)) {
        cfDebug(cf::MODULE_RSTUFF) << "no resolution correction needed: "
                                   << page_info.DPIX << "x" << page_info.DPIY;
        return;
    }

    ComponentHistogram hist;
    hist.fill(ccom_);
    hist.calculate();

    bool changed = false;

    if(hist.isYCorrectionNeeded(page_info)) {
        page_info.DPIY = hist.yDpi();
        changed = true;
    }

    if(hist.isXCorrectionNeeded(page_info)) {
        page_info.DPIX = hist.xDpi();
        changed = true;
    }

    if(changed) {
        SetPageInfo(cpage_, page_info);
        cfDebug(cf::MODULE_RSTUFF) << "new resolution: "
                                   << page_info.DPIX << "x" << page_info.DPIY;
    }

    if(hist_height_callback_)
        hist_height_callback_(hist.heightHistogram());

    if(hist_width_callback_)
        hist_width_callback_(hist.widthHistogram());
}
/////////////////////////////////////////////////////////////////////////////
//                    CreateInternalFileForFormatter
Bool CreateInternalFileForFormatter(FILE *pIFName)
{
 Bool         FReturnCode = TRUE;
 CSTR_line    line;
 CFPage       Page;
 PAGEINFO     PageInfo;

 Handle hCPAGE = CPAGE_GetHandlePage( CPAGE_GetCurrentPage());
 GetPageInfo(hCPAGE,&PageInfo);

 if(PageInfo.X && PageInfo.Y){
	 TemplateOffset.x = PageInfo.X;
     TemplateOffset.y = PageInfo.Y;
 }
 else{
	 TemplateOffset.x = 0;
     TemplateOffset.y = 0;
 }

 //Создание массива текстовых фрагментов
 Page.FragmentsArray.clear();
 Page.CreateArray_For_TextFragments( );

 //Чтение информации из хранилиша
 line = CSTR_FirstLine (1);

 while(line)
 {
	 if(CheckComingLine(&line) && Page.CheckComingLine_For_TextFragments(&line))
  	    Page.ProcessingComingLine(&line);
     line = CSTR_NextLine ( line, 1 );
 }

 CountPict  = GetPictCount();
// CountTable = GetTablCount();

 if(Page.Count.Chars>32000){
    ExFlagMode = TRUE;
 }

 if(!(Page.Count.Frags + (int)CountPict + (int)CountTable)){
	if(CreateEmptyRtfFile()<0){
 	   SetReturnCode_rfrmt(IDS_ERR_SIZEFRAGMENT);
 	   return FALSE;
    }
	return TRUE;
 }

 //Создания внутреннего файла для форматирования
 uint16_t  DistanceBetweenLeftMargin = 15;
 uint16_t  DistanceBetweenTopMargin  =  5;
 Page.m_wDpi             = (uint16_t)PageInfo.DPIX;
 PageIncline2048         = PageInfo.Incline2048;

 InternalRect VRect;
 fwrite(&Page.m_wDpi,              sizeof(uint16_t),1,pIFName); // ScanResolution
 fwrite(&Page.Count.Frags,         sizeof(uint16_t),1,pIFName); // число колонок
 fwrite(&Page.Count.Chars,         sizeof(uint16_t),1,pIFName); // число знакомест  in all page
 fwrite(&Page.Count.Words,         sizeof(uint16_t),1,pIFName); // число слов
 fwrite(&Page.Count.Strings,       sizeof(uint16_t),1,pIFName); // число строк
 fwrite(&DistanceBetweenLeftMargin,sizeof(uint16_t),1,pIFName); // distance between left margin letters- neighdoors from one word
 fwrite(&DistanceBetweenTopMargin, sizeof(uint16_t),1,pIFName); // distance between top margin

 CFragment* cFrag;
 CFString*  cString;
 CWord*     cWord;
 CChar*     cChar;

 // Processing Fragments
 for(int iPage=0; iPage < Page.Count.Frags; iPage++){
    cFrag = (CFragment*)Page.m_arFrags[iPage];
    VCopyRect( &VRect, &cFrag->m_rectFrag);
	if(CheckRect( &VRect ) == FALSE)
	  FReturnCode = FALSE ;
    fwrite(&VRect , sizeof( InternalRect ),1,pIFName);
    fwrite(&cFrag->m_wStringsCount, sizeof( uint16_t  ),1,pIFName);
    fwrite(&cFrag->m_wUserNumber  , sizeof( uint32_t ),1,pIFName);
    fwrite(&cFrag->m_Flags        , sizeof( uint32_t ),1,pIFName);

   // Processing Strings
   for(int iFrag=0; iFrag < cFrag->m_wStringsCount; iFrag++){
      cString = (CFString*)cFrag->m_arStrings[iFrag];
      VCopyRect( &VRect, &cString->m_rectBaseLine );
      fwrite( &VRect, sizeof( InternalRect ),1,pIFName);
      VCopyRect( &VRect, &cString->m_rectString );
      fwrite( &VRect, sizeof( InternalRect ),1,pIFName);
      fwrite( &cString->m_wWordsCount,  sizeof( uint16_t ),1,pIFName);
	  fwrite( &cString->S_Flags,  sizeof( uint32_t ),1,pIFName); //NEGA_STR
      // Processing Words
      for(int iString=0; iString < cString->m_wWordsCount; iString++){
         cWord = (CWord*)cString->m_arWords[iString];
         fwrite( &cWord->m_wCharsCount,   sizeof( uint16_t ),1,pIFName);
         fwrite( &cWord->m_wFontNumber,   sizeof( uint16_t ),1,pIFName);
         fwrite( &cWord->m_wFontPointSize,sizeof( uint16_t ),1,pIFName);

         // Processing Letters
         for(int iWord=0; iWord < cWord->m_wCharsCount; iWord++){
            cChar = (CChar*)cWord->m_arChars[iWord];
            VCopyRect( &VRect, &cChar->m_rectChar );
            fwrite( &VRect , sizeof( InternalRect ),1,pIFName);
            VCopyRect( &VRect, &cChar->m_RealRectChar );
            fwrite( &VRect , sizeof( InternalRect ),1,pIFName);
            fwrite( &cChar->m_wCountAlt ,    sizeof( uint16_t ),1,pIFName);
			for (int iAlt=0;iAlt<cChar->m_wCountAlt&&iAlt<REC_MAX_VERS;iAlt++)
			{
				fwrite( &cChar->m_chrVersions[iAlt].m_bChar ,sizeof( char ),1,pIFName);
				fwrite( &cChar->m_chrVersions[iAlt].m_bProbability , sizeof( char ),1,pIFName);
			}
            fwrite( &cChar->m_blanguage ,    sizeof( char ),1,pIFName);
            fwrite( &cChar->m_bFlg_spell_nocarrying, sizeof( char ),1,pIFName);
            fwrite( &cChar->m_bFlg_cup_drop ,sizeof( char ),1,pIFName);
            fwrite( &cChar->m_bFlg_spell,    sizeof( char ),1,pIFName);
            fwrite( &cChar->m_wFontNumber ,  sizeof( char ),1,pIFName);
         }
      }
   }
 }

 return	FReturnCode;
}
Exemple #13
0
void PrintEdit(HWND hEdit, wchar_t * lpDocName){
	FORMATRANGE		fr;
	CHARRANGE		chrg;
	HDC				hPrintDC;
	int				tempFlags;
	int				pageMin = 0, pageMax = 0;
	HFONT			hFontPageNumber, hFontOld;
	LOGFONTW		lf;
	int				xNP, yNP, yDoc;
	DOCINFOW		docinfo;
	wchar_t			szPage[32];
	int				oldAlign;
	COLORREF		oldColor;

	ZeroMemory(&g_pPdlg, sizeof(g_pPdlg));
	g_pPdlg.lStructSize = sizeof(g_pPdlg);
	g_pPdlg.hwndOwner = g_hMain;
	g_pPdlg.hInstance = g_hInstance;
	SendMessageW(hEdit, EM_EXGETSEL ,0, (LPARAM)&chrg);
	if(chrg.cpMax == 0 || chrg.cpMax == chrg.cpMin){
		g_pPdlg.Flags = PD_ALLPAGES | PD_NOSELECTION;
	}
	else{
		if(chrg.cpMax > chrg.cpMin){
			g_pPdlg.Flags = PD_SELECTION;
		}
		else{
			g_pPdlg.Flags = PD_ALLPAGES;
		}
	}
	g_pPdlg.Flags |= PD_RETURNDC | PD_HIDEPRINTTOFILE | 0x20000;	//PD_NONETWORKBUTTON
	GetPageInfo(hEdit, FALSE);

	g_pPdlg.nFromPage = 1;
	g_pPdlg.nToPage = m_CountPage;
	g_pPdlg.nMinPage = 1;
	g_pPdlg.nMaxPage = m_CountPage;
	g_pPdlg.nCopies = 1;

	if(PrintDlgW(&g_pPdlg)){
		hPrintDC = g_pPdlg.hDC;
		fr.hdc = hPrintDC;
		fr.hdcTarget = NULL;

		tempFlags = g_pPdlg.Flags;
		tempFlags &= PD_ALLPAGES | PD_SELECTION | PD_PAGENUMS;
		if(tempFlags == PD_ALLPAGES){
			pageMin = 0;
			pageMax = m_CountPage;
		}
		else if(tempFlags == PD_SELECTION){
			GetPageInfo(hEdit, TRUE);
			pageMin = 0;
			pageMax = m_CountPage;
		}
		else if(tempFlags == PD_PAGENUMS){
			pageMin = g_pPdlg.nFromPage;
			pageMin--;
			pageMax = g_pPdlg.nToPage;
		}

		fr.rc.left = m_Margin.left;
		fr.rc.top = m_Margin.top;
		fr.rc.right = m_Paper.x - m_Margin.right;
		fr.rc.bottom = m_Paper.y - m_Margin.bottom;

		ZeroMemory(&lf, sizeof(lf));
		lf.lfHeight = -MulDiv(10, GetDeviceCaps(hPrintDC, LOGPIXELSY), 72);
		wcscpy(lf.lfFaceName, FONT_NP);
		hFontPageNumber = CreateFontIndirectW(&lf);

		yNP = GetDeviceCaps(hPrintDC, VERTRES);
		xNP = GetDeviceCaps(hPrintDC, HORZRES) / 2;
		yDoc = 16;

		fr.rcPage.left = 0;
        fr.rcPage.top = 0;
        fr.rcPage.right = m_Paper.x;
        fr.rcPage.bottom = m_Paper.y  ;

		ZeroMemory(&docinfo, sizeof(docinfo));
		docinfo.cbSize = sizeof(docinfo);
		docinfo.lpszDocName = lpDocName;

		StartDocW(hPrintDC, &docinfo);
		if(pageMax){
			do{
				pageMin++;
				StartPage(hPrintDC);
				hFontOld = SelectFont(hPrintDC, hFontPageNumber);
				wsprintfW(szPage, L"Page %i", pageMin);
				oldAlign = SetTextAlign(hPrintDC, TA_CENTER | TA_BOTTOM);
	            oldColor = SetTextColor(hPrintDC, 0);
	            TextOutW(hPrintDC, xNP, yNP, szPage, wcslen(szPage));
				SetTextAlign(hPrintDC, TA_CENTER | TA_TOP);
				TextOutW(hPrintDC, xNP, yDoc, lpDocName, wcslen(lpDocName));
	            SetTextColor(hPrintDC, oldColor);
	            SelectFont(hPrintDC, hFontOld);
	            SetTextAlign(hPrintDC, oldAlign);
				if(m_pChar){
					int			min	= pageMin;
					min--;
					fr.chrg.cpMin = *(m_pChar + min);
					min++;
					fr.chrg.cpMax = *(m_pChar + min);
				}
				else{
					fr.chrg.cpMin = 0;
					fr.chrg.cpMax = 0;
				}
				SendMessageW(hEdit, EM_FORMATRANGE, TRUE, (LPARAM)&fr);
				EndPage(hPrintDC);
			}while(pageMin < pageMax);
		}
		DeleteFont(hFontPageNumber);
		SendMessageW(hEdit, EM_FORMATRANGE, FALSE, (LPARAM)NULL);
        EndDoc(hPrintDC);
        DeleteDC(hPrintDC);
	}
}
Exemple #14
0
bool WritePict(uint32_t IndexPict, SectorInfo * SectorInfo, Bool OutPutTypeFrame) {
    uint32_t PictNumber = 0;
    Point RtfLt;
    CPAGE_PICTURE pict;
    uint32_t NumberPage = CPAGE_GetCurrentPage();
    Handle h_Page = CPAGE_GetHandlePage(NumberPage);
    Handle h_Pict = CPAGE_PictureGetFirst(h_Page);

    while (h_Pict) {
        if (++PictNumber > IndexPict)
            break;

        h_Pict = CPAGE_PictureGetNext(h_Page, h_Pict);
    }

    if (!h_Pict)
        return false;

    PAGEINFO pinfo;

    if (!GetPageInfo(h_Page, &pinfo))
        return false;

    CIMAGE_InfoDataInGet in;
    BitmapInfoHeader image_info;
    Point Lr;
    Point Wh;
    Point LrN;
    Point WhN;

    if (CIMAGE_GetImageInfo(pinfo.szImageName, &image_info) == FALSE)
        return false;

    CPAGE_PictureGetPlace(h_Page, h_Pict, 0, &Lr, &Wh);
    CPAGE_PictureGetPlace(h_Page, h_Pict, -pinfo.Incline2048, &LrN, &WhN);
    Lr.rx() -= TemplateOffset.x();
    Lr.ry() -= TemplateOffset.y();
    int FrameOffset = abs(WhN.x() - Wh.x());

    if (Lr.x() < 0)
        FrameOffset += abs(Lr.x());

    // Получим картинку из исходного изображения задав ее контур
    //определяем размер маски

    if (!CPAGE_PictureGetPlace(h_Page, h_Pict, -pinfo.Incline2048, &Lr, &Wh))
        return false;

    Bool rc = TRUE;

    //piter : Корректируем координаты из-за повернута страницы.
    switch (pinfo.Angle) {
    case 0:
        in.dwX = Lr.x();
        in.dwY = Lr.y();
        in.dwWidth = Wh.x();
        in.dwHeight = Wh.y();
        break;
    case 270:
        in.dwX = pinfo.Width - (Wh.y() + Lr.y());
        in.dwY = Lr.x();
        in.dwWidth = Wh.y();
        in.dwHeight = Wh.x();
        break;
    case 180:
        in.dwX = pinfo.Width - (Wh.x() + Lr.x());
        in.dwY = pinfo.Height - (Wh.y() + Lr.y());
        in.dwWidth = Wh.x();
        in.dwHeight = Wh.y();
        break;
    case 90:
        in.dwX = Lr.y();
        in.dwY = pinfo.Height - (Wh.x() + Lr.x());
        in.dwWidth = Wh.y();
        in.dwHeight = Wh.x();
        break;
    }

    // end piter
    BitmapPtr pOutDIB = NULL;

    if (!CIMAGE_GetDIBData(PUMA_IMAGE_USER, Rect(in.dwX, in.dwY, in.dwWidth, in.dwHeight), NULL, &pOutDIB)) {
        Debug() << "[WritePict] CIMAGE_GetDIBData failed: " << PUMA_IMAGE_USER << "\n";
        return false;
    }

    // Соберем изображение
    const char * szTurnName = "RFRMT:TurnPicture";
    const char * szPictName = "RFRMT:Picture";
    const char * szRotateName = "RFRMT:RotatePicture";
    const char * lpName = szPictName;

    if (CIMAGE_AddImage(szPictName, (BitmapPtr) pOutDIB)) {
        switch (pinfo.Angle) {
        case 90:
            rc = RIMAGE_Turn(szPictName, szTurnName, RIMAGE_TURN_90);
            CIMAGE_RemoveImage(lpName);
            lpName = szTurnName;
            break;
        case 180:
            rc = RIMAGE_Turn(szPictName, szTurnName, RIMAGE_TURN_180);
            CIMAGE_RemoveImage(lpName);
            lpName = szTurnName;
            break;
        case 270:
            rc = RIMAGE_Turn(szPictName, szTurnName, RIMAGE_TURN_270);
            CIMAGE_RemoveImage(lpName);
            lpName = szTurnName;
            break;
        }

        if (!rc) {
            Debug() << "[WritePict] RIMAGE_Turn failed";
            rc = FALSE;
        }
    } else {
        Debug() << "[WritePict] CIMAGE_WriteDIB failed: " << szPictName << "\n";
    }

    // Довернем изображение на малый угол.
    if (!RIMAGE_Rotate(lpName, szRotateName, pinfo.Incline2048, 2048)) {
        Debug() << "[WritePict] RIMAGE_Rotate failed\n";
        rc = FALSE;
    } else {
        CIMAGE_RemoveImage(lpName);
        lpName = szRotateName;
    }

    // Маскируем полученное изображение
    Point ptLt, ptWh;

    if (rc && CPAGE_PictureGetPlace(h_Page, h_Pict, 0, &ptLt, &ptWh)) {
        if (pinfo.Incline2048 >= 0) {
            in.dwX = ptWh.y() * pinfo.Incline2048 / 2048;
            in.dwY = 0;
        } else {
            in.dwX = 0;
            //  Beg of Almi Corr
            //                      in.dwY = ptWh.x*pinfo.Incline2048/2048;
            in.dwY = (-ptWh.x() * pinfo.Incline2048 / 2048);
            //  End of Almi Corr
        }

        if (!RIMAGE_RotatePoint(lpName, in.dwX, in.dwY, (int32_t *) &in.dwX,
                (int32_t *) &in.dwY)) {
            in.dwX = 0;
            in.dwY = 0;
        }

        in.dwWidth = ptWh.x();
        in.dwHeight = ptWh.y();
        in.wByteWidth = (unsigned short) ((in.dwWidth + 7) / 8); //?
        // Получим размер маски
        uint32_t nSize = 0;

        if (CPAGE_PictureGetMask(h_Page, h_Pict, 0, NULL, &nSize)) {
            char * lpMask = (char*) malloc(sizeof(in) + nSize);

            if (lpMask) {// Получаем маску
                *(CIMAGE_InfoDataInGet*) lpMask = in;

                if (CPAGE_PictureGetMask(h_Page, h_Pict, 0, lpMask + sizeof(in), &nSize)) {
                     cf::BitMask bit_mask(0, 0, (uchar*) lpMask + sizeof(in));

                    if (!CIMAGE_GetDIBData(lpName, Rect(in.dwX, in.dwY, in.dwWidth, in.dwHeight), &bit_mask, &pOutDIB)) {
                        Debug() << "CIMAGE_GetDIBData failed\n";
                        rc = FALSE;
                    }
                } else {
                    Debug() << "PAGE_PictureGetMask failed\n";
                    rc = FALSE;
                }

                free(lpMask);
            }
        } else {
            Debug() << "PAGE_PictureGetMask() failed\n";
            rc = FALSE;
        }
    }

    BlockElement * hPrevObject = NULL;

    if (rc) {
        CTDIB * pTmpDIB = new CTDIB;
        pTmpDIB->setBitmap(pOutDIB);
        cf::Size pictGoal;
        pictGoal.rwidth() = pTmpDIB->lineWidth();
        pictGoal.rheight() = pTmpDIB->linesNumber();
        int32_t iDIBSize = pTmpDIB->dibSize();
        delete pTmpDIB;
        Rect indent;
        Rect playout;
        Lr.rx() = MAX(0, Lr.x());
        Lr.ry() = MAX(0, Lr.y());

        Rect slayout;
        slayout.rleft() = Lr.x();
        slayout.rright() = Lr.x() + Wh.x();
        slayout.rtop() = Lr.y();
        slayout.rbottom() = Lr.y() + Wh.y();
        hPrevObject = SectorInfo->hObject;

        if (SectorInfo->FlagInColumn || (OutPutTypeFrame && SectorInfo->FlagFictiveParagraph)) {
            CEDParagraph * par = SectorInfo->hEDSector->createParagraph(SectorInfo->hColumn,
                    ALIGN_NONE, indent, SectorInfo->userNum, -1, playout);
            par->addLine(new CEDLine(NULL, false, 6));
            SectorInfo->FlagFictiveParagraph = FALSE;
        }

        if (RfrmtOptions::useNone() || SectorInfo->CountFragments == 1)
            SectorInfo->hObject = SectorInfo->hColumn;
        else {
            if (SectorInfo->FlagInColumn == TRUE) {
                Rect EdFragmRect;
                EdFragmRect.setLeft(MAX(0, SectorInfo->OffsetFromColumn.x()));
                EdFragmRect.setTop(MAX(0, SectorInfo->OffsetFromColumn.y()));
                EdFragmRect.setWidth(MAX(0, Wh.x() - FrameOffset));
                EdFragmRect.setHeight(Wh.y());

                CEDFrame * frame = new CEDFrame(NULL, CEDFrame::HPOS_COLUMN,
                        CEDFrame::VPOS_PARAGRAPH);
                frame->setBoundingRect(EdFragmRect);
                SectorInfo->hColumn->addElement(frame);
                SectorInfo->hObject = frame;
            } else {
                Rect EdFragmRect;
                EdFragmRect.setLeft(Lr.x() - SectorInfo->Offset.x());
                EdFragmRect.setTop(Lr.y() - SectorInfo->Offset.y());
                EdFragmRect.setWidth(MAX(0, Wh.x() - FrameOffset));
                EdFragmRect.setHeight(Wh.y());
                CEDFrame * frame = new CEDFrame(NULL, CEDFrame::HPOS_COLUMN,
                        CEDFrame::VPOS_PARAGRAPH);
                frame->setBoundingRect(EdFragmRect);
                frame->dxfrtextx = 0;
                frame->dxfrtexty = 0;
                SectorInfo->hColumn->addElement(frame);
                SectorInfo->hObject = frame;
            }
        }

        CEDParagraph * ced_par = SectorInfo->hEDSector->createParagraph(SectorInfo->hObject,
                ALIGN_NONE, indent, SectorInfo->userNum, -1, playout);
        CEDLine * ced_line = new CEDLine;
        // TODO hard coded font value
        ced_line->setDefaultFontHeight(6);

        CEDPicture * ced_pict = new CEDPicture();
        ced_pict->setBoundingRect(slayout);
        ced_pict->setPictureNumber(IndexPict);
        ced_pict->setAlign(ED_ALIGN_MIDDLE);
        uchar * img_data = new uchar[iDIBSize];
        memcpy(img_data, pOutDIB, iDIBSize);
        ced_pict->setImage(new Image(img_data, iDIBSize, Image::AllocatorNew));
        ced_pict->image()->setSize(slayout.size());

        ced_line->addElement(ced_pict);
        ced_par->addLine(ced_line);
    }

    // piter
    // освобождает память переданную по pOutDIB
    CIMAGE_RemoveImage(lpName);
    CIMAGE_FreeCopiedDIB(pOutDIB);
    // end piter
    SectorInfo->hObject = hPrevObject;
    return TRUE;
}
Exemple #15
0
CCOM_handle GetStrCCOM(Handle hCPage, uchar* ImageName, Rect16 Rc, Bool neg, Bool vertical,
        RecRaster* rast, int min_h) {
    int min_w, max_h, max_w;
    // int j;
    PAGEINFO info;
    // uchar Name[CPAGE_MAXNAME];
    GetPageInfo(hCPage, &info);

    // if(ImageName)
    // {
    //	 for (j=0; j<CPAGE_MAXNAME; j++)
    //		Name[j] = ImageName[j];
    // }
    // else
    // {
    // for (j=0; j<CPAGE_MAXNAME; j++)
    //		Name[j] = info.szImageName[j];
    // }
    // Handle lpDIB;
    // if(!CIMAGE_ReadDIB(Name,&lpDIB,1))
    //	 return 0;
    ExcControl Control;
    if (vertical) {
        min_h = 2;
        min_w = 2;
        max_w = Rc.right - Rc.left + 1;
        max_h = max_w * 2;

    } else {
        min_w = 2;
        max_h = Rc.bottom - Rc.top + 1;
        max_w = Rc.right - Rc.left + 1;
    }

    int bytewide = ((rast->lnPixWidth + 63) / 64) * 8;
    Bool fotomet = FALSE;
    Bool RevOv = FALSE;

    Control.MinCompHei = min_h;
    Control.MinCompWid = min_w;
    Control.MaxCompHei = rast->lnPixHeight + 1;
    Control.MaxCompWid = bytewide * 8;
    Control.MaxScale = 0;
    Control.Control = Ex_ExtraComp/*|Ex_EvnRecog*/;//Andrey: опознавалка вынесена в отдельный модуль RRecCom, и кроме того, не вызвана функция REXC_SetEVNProperties для опознавания методом "Event"

    if (REXCExtra(Control, rast->Raster, bytewide, RevOv, bytewide * 8, rast->lnPixHeight,
            (info.DPIX * 10000) / 254, (info.DPIY * 10000) / 254, 0, 0, 0, 0, fotomet)) {
        /* 	 //Andrey: здесь как раз и идет опознавалка
         RRecComControl rcontrol;
         rcontrol.MinCompHei=min_h;
         rcontrol.MinCompWid=min_w;
         rcontrol.MaxCompHei=rast->lnPixHeight+1;
         rcontrol.MaxCompWid=bytewide*8;
         rcontrol.MaxScale=0;
         rcontrol.flags = RECOG_EVN;

         Handle hCCOM = (Handle)REXCGetContainer();

         if (hCCOM)
         //Andrey: вообще-то так делать нельзя (в смысле передавать последними 2мя параметрами то, что передается), но пока я не знаю, как здесь получить язык распознавания, поэтому вот таким образом пропускается инициализация
         if (!RRECCOM_Recog(hCCOM, rcontrol, NULL, -1))
         LDPUMA_ConsoleN(RRECCOM_GetReturnString(RRECCOM_GetReturnCode()));

         return (int32_t)hCCOM;
         */return REXCGetContainer();
    }
    return 0;
}
Exemple #16
0
int CutStrings(POLY_* pBlock) {
	medium_h = GetMediumHeight(pBlock);

	int cut_h = (int) ((double) (medium_h) * k_cut);

	CCOM_comp * comp;
	CCOM_comp* prev_comp = NULL;

	PAGEINFO info;
	GetPageInfo(HCPAGE, &info);
	int nIncline = info.Incline2048;

    cf::Point16 pLeftTop;
    cf::Point16 pRightTop;
    cf::Point16 pLeftBottom;
    cf::Point16 pRightBottom;

	Bool fl_cont = FALSE;

	comp = CCOM_GetFirst((CCOM_handle) HCCOM, NULL);
	prev_comp = comp;

	//Andrey: устанавливаем переменные для метода определения точек разрезания, перемещенного в RCUTP
	if (!RCUTP_RSelStr_SetEnv(/*(char*)info.szImageName, */medium_h, inf_let_w,
			inf_dust_h, inf_let_h, HCCOM, sup_dust_w, min_cut_down_let_w,
			sup_prob_w, info.BitPerPixel))
		return 0;

	while (comp) {
		fl_cont = FALSE;
		if (comp->h < inf_let_h) {
			prev_comp = comp;
			comp = CCOM_GetNext(comp, NULL);
			fl_cont = TRUE;
		}
		if (fl_cont)
			continue;

		pLeftTop.rx() =  comp->left;
		pLeftTop.ry() = comp->upper - 1;
		pRightTop.rx() =  comp->left + comp->w - 1;
		pRightTop.ry() = comp->upper - 1;
		pLeftBottom.rx() =  comp->left;
		pLeftBottom.ry() = comp->upper + comp->h - 2;
		pRightBottom.rx() =  comp->left + comp->w - 1;
		pRightBottom.ry() = comp->upper + comp->h - 2;

		IDEAL_XY(pLeftTop.rx(), pLeftTop.ry());
		IDEAL_XY(pRightTop.rx(), pRightTop.ry());
		IDEAL_XY(pLeftBottom.rx(), pLeftBottom.ry());
		IDEAL_XY(pRightBottom.rx(), pRightBottom.ry());

		if (IsInPoly(pLeftTop, pBlock) || IsInPoly(pRightTop, pBlock)
				|| IsInPoly(pLeftBottom, pBlock) || IsInPoly(pRightBottom,
				pBlock)) {
			if (comp->h >= cut_h && comp->h <= medium_h * 5 && comp->w
					>= inf_let_w - 1) {
				uchar Data[1000];
				memset(Data, 0, sizeof(Data));
				uchar* pmasp = Data;
				Rect16 Rc;

				Rc.top = comp->upper;
				Rc.bottom = comp->upper + comp->h - 1;
				Rc.left = comp->left;
				Rc.right = comp->left + comp->w - 1;

				int bound = GetMasP(HCPAGE, Rc, &pmasp) ? RCUTP_RSelStr_CP(
						comp, &type_let, pmasp) : comp->h / medium_h;

				if (bound > 0) {
					if (CutComp(HCPAGE, (CCOM_handle) HCCOM, comp, bound, 1)) {
						comp = prev_comp;
						fl_cont = TRUE;
					}
				}
				if (!fl_cont)
					comp = CCOM_GetNext(comp, NULL);
			} else
				comp = CCOM_GetNext(comp, NULL);
		} else
			comp = CCOM_GetNext(comp, NULL);
	}

	//Andrey: снятие действия установки переменных в RCUTP
	RCUTP_RSelStr_UnsetEnv();

	return 1;
}
RNEG_FUNC(void) RNEG_RecogNeg(CCOM_handle hCCOM, Handle hCPage,uchar* pImageName,int skew)
{

 MainWindowD=NULL;
 MainWindowD=LDPUMA_GetWindowHandle ("Изображение после разворота");
 if(!MainWindowD)
    MainWindowD=LDPUMA_GetWindowHandle ("Main");

 dpTime=!LDPUMA_Skip(hTime);
 dpPrintResConsole=!LDPUMA_Skip(PrintResConsole);
 dpNegResD=!LDPUMA_Skip(NegResD);
 dpNegRecD=!LDPUMA_Skip(NegRecD);
 dpRecOneLetter=!LDPUMA_Skip(RecOneLetter);

// LDPUMA_ConsoleN("");
 if(dpTime)
     LDPUMA_ConsoleN("Активизируется функция поиска и разпознования негативов");
 int time=clock();
 if(!(LDPUMA_Skip (NegSearch)) )
	 return;

 uint32_t code_sersized=(512<<16);
 uint32_t code_normd=(512<<17);
 uint32_t code_colord=(512<<17)+(512<<16);
 uint32_t code_cutd=(512<<18);
 uint32_t code_cutstrd=(512<<18)+(512<<16);
 uint32_t code_sized=(512<<18)+(512<<17);

 #define NEGA   1<<14
 #define VERTICA 1<<13


 inf_neg_h=30;
 inf_neg_w=100;
 neg_cut_black=.95;
 neg_cut_white=.3;
 neg_cut_str=.8;
 min_let_h=2;
 min_let_w=2;
 inf_betw_str_h=10;
 sup_square=500000;

 PAGEINFO info = {0};
 GetPageInfo(hCPage,&info);
 DPIX=info.DPIX;
 DPIY=info.DPIY;
 inf_neg_h=inf_neg_h*((int)(DPIY)+1)/300;
 inf_neg_w=inf_neg_w*((int)(DPIX)+1)/300;
 inf_betw_str_h=inf_betw_str_h*((int)(DPIY)+1)/300;
 sup_square=(int)(((double)sup_square*(double)(DPIY+1)*(double)(DPIX+1))/90000);
 min_let_w=min_let_w*((int)(DPIX)+1)/300;
 min_let_h=min_let_h*((int)(DPIY)+1)/300;

 if((info.Angle==90)||(info.Angle==270))
 {
	 Height=info.Width;
	 Width=info.Height;
 }
 else
 {
     Height=info.Height;
     Width=info.Width;
 }


 NegList* root=NULL;
 NegList* now;
 NegList* temp;
 int nRC=0;
 int i;
 Bool fl_del_mas_neg;
 Bool flag_rotate;
 Bool flag_rimage_rotate;


 if(!LDPUMA_Skip(SetSkew))
	 skew=Skew;

 for(i=0;i<CPAGE_MAXNAME&&pImageName[i]!='\0';i++)
	 ImageName[i]=pImageName[i];
 if(i<CPAGE_MAXNAME)
	 ImageName[i]='\0';

 if(!InitMyImage())
	 return;

 if(dpTime)
 {
    LDPUMA_ConsoleN("Time prep=%d",clock()-time);
	time=clock();
 }

/* Осуществляется поиск кандидатов в негативы по размеру*/

 if(LDPUMA_Skip (NegSearchSize) )
 {
  fl_del_mas_neg=SearchNegBySize(hCCOM,hCPage,&root,nRC);

  /*Прорисовка найденных кандидатов в негативы по размерам*/

  if(nRC>0)
  {
	  now=root;
   if(!(LDPUMA_Skip (NegSearchSizeD)) )
   {
	for(i=0;i<nRC;i++)
	{
     NegDrawRect(MainWindowD,code_sersized,RGB(0,0,255),(now->neg).pRc[0]);
     now=now->next;
	}
	LDPUMA_ConsoleN("По размерам");
    LDPUMA_WaitUserInput (NegSearchSizeD,MainWindowD);
    if(LDPUMA_Skip (NegSearchSizeDC) )
      LDPUMA_DeleteRects (MainWindowD,code_sersized);
   }
  }
 }

 flag_rimage_rotate=IfNeedGlobalRotate(root,skew);

 now=root;
 while(now)
 {
      while((now->neg).pRc[0].top<=0)
		  ((now->neg).pRc[0].top)++;
	  while(((now->neg).pRc[0].bottom+1)>Height )
          ((now->neg).pRc[0].bottom)--;


	  while((now->neg).pRc[0].left<0)
		  ((now->neg).pRc[0].left)++;
	  while( ((now->neg).pRc[0].right+1)>Width )
          ((now->neg).pRc[0].right)--;

      int prewide=(((now->neg).pRc[0].right-(now->neg).pRc[0].left+8)/8)*8;
      if( ((now->neg).pRc[0].left+prewide)>Width )
	    (now->neg).pRc[0].right-=8;
	  now=now->next;
 }

/* Осуществляется удаление(если повезёт) грязи, т.е. приведение
          негатива к каноническому виду*/

 if(LDPUMA_Skip (NegNorm) )
 {

/* Поворот (если необходим) негативов*/

  flag_rotate=NegRotate(hCPage,root,nRC,skew);

   now=root;
   for(i=1;i<nRC;i++)
      now=now->next;
   i=nRC-1;
   while(i>=0)
   {
	temp=now->prev;
    NormNeg(hCPage,now,&root,nRC);
    i--;
	now=temp;
   }


/*Обратное преобразование*/
   if(flag_rotate)
   {
	  now=root;
	  while(now)
	  {
		   if((now->neg).rot.pmasp)
           {
             RSELSTR_UnRotateRect(-skew,&((now->neg).pRc[0]),1,(now->neg).rot.Rc,(now->neg).rot.begx,(now->neg).rot.movey,(now->neg).rot.flmovey,(now->neg).rot.hi);
             PostRotate(now,skew);
           }
	       DeleteRotateMas(&((now->neg).rot.pmasp),&((now->neg).rot.begx),&((now->neg).rot.movey),&((now->neg).rot.flmovey),&((now->neg).rot.hi));
      now=now->next;
	  }
   }


  /* Прорисовка нормализованных кандидатов в негативы*/

  if(nRC>0)
  {
	  now=root;
   if(!(LDPUMA_Skip (NegNormD)) )
   {
	for(i=0;i<nRC;i++)
	{
     NegDrawRect(MainWindowD,code_normd,RGB(0,255,0),(now->neg).pRc[0]);
     now=now->next;
	}
	LDPUMA_ConsoleN("Нормализованные");
    LDPUMA_WaitUserInput (NegNormD,MainWindowD);
    if(LDPUMA_Skip (NegNormDC) )
      LDPUMA_DeleteRects (MainWindowD,code_normd);
   }
  }
 }



/* Резка сложных негативов*/

 if(LDPUMA_Skip (NegCut) )
 {

/* Поворот (если необходим) негативов*/
 flag_rotate=NegRotate(hCPage,root,nRC,skew);


  CutNeg(hCPage,&root,nRC,skew);


   /* Поворот (если необходим) негативов*/
  flag_rotate=NegRotate(hCPage,root,nRC,skew);


   now=root;
   for(i=1;i<nRC;i++)
      now=now->next;
   i=nRC-1;
   while(i>=0)
   {
	temp=now->prev;
    NormNeg(hCPage,now,&root,nRC);
    i--;
	now=temp;
   }

   /*Обратное преобразование*/
   if(flag_rotate)
   {
	   now=root;
       while(now)
	   {
		   if((now->neg).rot.pmasp)
           {
             RSELSTR_UnRotateRect(-skew,&((now->neg).pRc[0]),1,(now->neg).rot.Rc,(now->neg).rot.begx,(now->neg).rot.movey,(now->neg).rot.flmovey,(now->neg).rot.hi);
             PostRotate(now,skew);
           }
	       DeleteRotateMas(&((now->neg).rot.pmasp),&((now->neg).rot.begx),&((now->neg).rot.movey),&((now->neg).rot.flmovey),&((now->neg).rot.hi));
	   now=now->next;
	   }
   }


  /* Прорисовка разрезанных негативов*/

  if(nRC>0)
  {
	  now=root;
   if(!(LDPUMA_Skip (NegCutD)) )
   {
	for(i=0;i<nRC;i++)
	{
     NegDrawRect(MainWindowD,code_cutd,RGB(255,0,0),(now->neg).pRc[0]);
     now=now->next;
	}
	LDPUMA_ConsoleN("Разрезанные");
    LDPUMA_WaitUserInput (NegCutD,MainWindowD);
    if(LDPUMA_Skip (NegCutDC) )
      LDPUMA_DeleteRects (MainWindowD,code_cutd);
   }
  }

 }


  now=root;

 for(i=1;i<nRC;i++)
	 now=now->next;
 int h;
 int w;
 Rect16 Rc;

 /*Отсев по размеру*/
 if(LDPUMA_Skip (NegSize) )
 {
  while(now)
  {
	   h=(now->neg).pRc[0].bottom-(now->neg).pRc[(now->neg).nRc-1].top+1;
	   w=(now->neg).pRc[0].right-(now->neg).pRc[0].left+1;
	  if( ((h<2*w)&&(w<2*h)) || ((h*w)>sup_square) )
	  {
		  temp=now;
		  if(!temp->prev)
			  root=temp->next;
		  nRC--;
		  now=now->prev;
		  delete temp;
	  }
	  else
		  now=now->prev;
  }

  /* Прорисовка отсеянных по размеру*/

  if(nRC>0)
  {
	  now=root;
   if(!(LDPUMA_Skip (NegSizeD)) )
   {
	for(i=0;i<nRC;i++)
	{
	 Rc.left=(now->neg).pRc[0].left;
	 Rc.right=(now->neg).pRc[0].right;
	 Rc.bottom=(now->neg).pRc[0].bottom;
	 Rc.top=(now->neg).pRc[(now->neg).nRc-1].top;
     NegDrawRect(MainWindowD,code_sized,RGB(255,255,0),Rc);
     now=now->next;
	}
	LDPUMA_ConsoleN("Окончательная прорисовка");
    LDPUMA_WaitUserInput (NegSizeD,MainWindowD);
    if(LDPUMA_Skip (NegSizeDC) )
      LDPUMA_DeleteRects (MainWindowD,code_sized);
   }
  }

 }

/* Поворот (если необходим) негативов*/
 flag_rotate=NegRotate(hCPage,root,nRC,skew);


/* Осуществляется отсев кандидатов в негативы по насыщенности
            чёрного цвета*/

 if(LDPUMA_Skip (NegColor) )
 {
  SearchNegByBlack(hCPage,&root,nRC);

  /*Прорисовка кандидатов в негативы после отсева по цветовой гамме*/

  if(nRC>0)
  {
	  now=root;
   if(!(LDPUMA_Skip (NegColorD)) )
   {
	for(i=0;i<nRC;i++)
	{
     NegDrawRect(MainWindowD,code_colord,RGB(0,255,255),(now->neg).pRc[0]);
     now=now->next;
	}
	LDPUMA_ConsoleN("Отсеянные по цветовой гамме");
    LDPUMA_WaitUserInput (NegColorD,MainWindowD);
    if(LDPUMA_Skip (NegColorDC) )
      LDPUMA_DeleteRects (MainWindowD,code_colord);
   }
  }
 }

 /* Резка многострочных негативов*/


 if(LDPUMA_Skip (NegCutStr) )
 {
  CutNegStr(hCPage,&root,nRC,skew);


  /* Прорисовка разрезанных негативов*/

  if(nRC>0)
  {
	  now=root;
   if(!(LDPUMA_Skip (NegCutStrD)) )
   {
	while(now)
	{
	 for(i=0;i<(now->neg).nRc;i++)
      NegDrawRect(MainWindowD,code_cutstrd,RGB(255,0,255),(now->neg).pRc[i]);
     now=now->next;
	}
	LDPUMA_ConsoleN("Разрезанные на строки");
    LDPUMA_WaitUserInput (NegCutStrD,MainWindowD);
    if(LDPUMA_Skip (NegCutStrDC) )
      LDPUMA_DeleteRects (MainWindowD,code_cutstrd);
   }
  }

 }



/*Отсев пересекающихся*/

 DelIn(hCPage,&root,nRC);

 int time_stuff=clock();
 if(dpTime)
   LDPUMA_ConsoleN("Time stuff=%d",time_stuff-time);

/* Осуществляется распознование из массива кандидатов*/
 if(flag_rimage_rotate)
 {
	 UnRotateNeg(root,skew);
	 ResetMyImage();
	 if(!InitMyImage())
		 return;
	 CheckNega(root);
	 if(!flag_rotate)
		 flag_rotate=NegRotate(hCPage,root,nRC,skew);
 }

 if(LDPUMA_Skip (NegRec) )
 {
  NegRecog(hCPage,&root,nRC,skew);
 }

 if(dpTime)
    LDPUMA_ConsoleN("Time recog=%d",clock()-time_stuff);


 if(!(LDPUMA_Skip (NegPrintFILE) ))
 {
  FILE *f;
  f=fopen("recneg.res","a");
  if(f==NULL)
 	 f=fopen("recneg.res","w+");
  if(f!=NULL)
  {
 	 NegPrintInFile(f,root,nRC);
      fclose(f);
  }
 }

 /* Отпись в CPage*/



 now=root;
 if(1/*!(LDPUMA_Skip (PutToCPage) )*/)
 {
 POLY_ block={0};
 uint32_t size_poly=sizeof(POLY_);
  while(now)
  {
   if((now->neg).p>inf_prob)
   {
	block.com.Flags=0;
    Rc.left=(now->neg).pRc[0].left;
    Rc.right=(now->neg).pRc[0].right;
    Rc.top=(now->neg).pRc[(now->neg).nRc-1].top;
    Rc.bottom=(now->neg).pRc[0].bottom;
            block.com.type = TYPE_TEXT; //Текст, Картинка, Таблица;
			block.com.count = 4;
			block.negative=TYPE_NEGATIVE;
			block.com.Flags=NEGA;

//Andrey: moved from RBLOCK (keyword:TYPE_NEGATIVE)
//------------------------------
			block.alphabet=0;
			block.com.number=0;
//------------------------------

//commented by Andrey
/*          if(Rc.bottom-Rc.top>Rc.right-Rc.left)
			{
                   block.orient=TYPE_DOWNUP;

				   block.com.Flags|=VERTICA;
			}
			else
				block.orient=TYPE_LEFTRIGHT;
*/
            if ((now->neg).Flags&FlVert)
            {
                block.com.Flags |= VERTICA;
                block.orient = (now->neg).Flags&FlDown2Up ? TYPE_DOWNUP : TYPE_UPDOWN;
            }
            else block.orient = TYPE_LEFTRIGHT;

			block.com.Vertex[0].x = Rc.left;
			block.com.Vertex[0].y = Rc.top;
			block.com.Vertex[1].x = Rc.right;
			block.com.Vertex[1].y = Rc.top;
			block.com.Vertex[2].x = Rc.right;
			block.com.Vertex[2].y = Rc.bottom;
			block.com.Vertex[3].x = Rc.left;
			block.com.Vertex[3].y = Rc.bottom;
//Andrey: create TYPE_TEXT block
	CPAGE_CreateBlock(hCPage, TYPE_IMAGE,0,0,&block,size_poly);
//			CPAGE_CreateBlock(hCPage, TYPE_TEXT,0,0,&block,size_poly);
   }
   now=now->next;
  }
 }

 if(!(LDPUMA_Skip (PutToCHSTR) ))
 {
  now=root;

  uchar Name[CPAGE_MAXNAME];
  for (int j=0; j<CPAGE_MAXNAME; j++)
		Name[j] = ImageName[j];

  if(!(LDPUMA_Skip (TestCHSTR) ))
  {
   CHSTR_Objects Hstr;
   Hstr.Rc.top=TOP;
   Hstr.Rc.bottom=BOTTOM;
   Hstr.Rc.left=LEFT;
   Hstr.Rc.right=RIGHT;
   Hstr.block_number=1000;
   Hstr.ImageName[0]='\0';
   Hstr.type_neg=NEGATIVE;
   Hstr.type_vert=VERTICALE;
   RSELSTR_PutObjects(hCPage,(void*)hCCOM,&Hstr,1);
  }
 }

 PutTempToCPAGE(hCPage,root);

 if( (LDPUMA_Skip (NegSearchSize))&&(fl_del_mas_neg==TRUE) )
 {
	 while(root)
	 {
		 now=root;
		 root=root->next;
		 delete now;
	 }
 }

 ResetMyImage();

// LDPUMA_ConsoleN("Time work RNEG=%d",clock()-time);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//
//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;
}
Bool32 DeleteLines(Handle hCPage,void* phCLINE, const char* ImageDelLines)
{
//	LDPUMA_ConsoleN("Активизируется функция тривиального удаления линий");
	int time=clock();
	CLINE_handle* pCLINE=(CLINE_handle*)phCLINE;
    MyLine* pHorLines=NULL;
	MyLine* pVerLines=NULL;
	int nHorLines=0;
	int nVerLines=0;
	int len_hor_mas=0;
	int len_ver_mas=0;
	int add_len_mas=50;
	uint32_t size_lineinfo=sizeof(LineInfo);
	if(!LDPUMA_Skip(NotKillPointed))
		fl_not_kill_pointed=TRUE;
	else
		fl_not_kill_pointed=FALSE;
	dphNotTestAlik=!LDPUMA_Skip(hNotTestAlik);


	CIMAGEIMAGECALLBACK         cbk;
	CIMAGEIMAGECALLBACK         cbk1;
//	LinesTotalInfo          lti;
//	LineInfo			  linfo;     // собственно, что и надо
	PAGEINFO              info = {0};	 // Описание страницы
//	Handle                pBlock;
//	uint32_t				  size32;
	int					  i;
//	uint32_t    HorType;
//    uint32_t    VerType;
	Bool fl_cont;
    uchar ImageName[CPAGE_MAXNAME];
	// Получаем PAGEINFO текущей страницы
	GetPageInfo(hCPage,&info);

	// Копируем в pImage из PInfo указатель на изображение,
	// связанное со страницей
	for(i=0;i<CPAGE_MAXNAME;i++)
		ImageName[i]=info.szImageName[i];

	if (!CIMAGE_GetCallbackImage(ImageName,&cbk))
		return FALSE;

	cbk1.CIMAGE_ImageOpen  = cbk.CIMAGE_ImageOpen;
	cbk1.CIMAGE_ImageRead  = cbk.CIMAGE_ImageRead;
	cbk1.CIMAGE_ImageClose = cbk.CIMAGE_ImageClose;

	if (!CIMAGE_WriteCallbackImage((uchar*)ImageDelLines,cbk1))
	{
	    return FALSE;
	}

    Handle lpDIB;
    if(!CIMAGE_ReadDIB((uchar*)ImageDelLines,&lpDIB,1))
	{
	  CIMAGE_DeleteImage((uchar*)ImageDelLines);
	  return FALSE;
	}

    CTDIB* ctdib = new CTDIB;
	if(!ctdib)
	{
	  CIMAGE_DeleteImage((uchar*)ImageDelLines);
	  return FALSE;
	}

    ctdib->SetDIBbyPtr (lpDIB);
    const int bytewide=ctdib->GetLineWidthInBytes();
    int num_str=ctdib->GetLinesNumber ();
//   int bytesize=ctdib->GetImageSizeInBytes ();
    uchar* pmasp=(uchar*)(ctdib->GetPtrToBitFild());
//	uchar* pos=(uchar*)(ctdib->GetPtrToPixel (pHorLines[0].begx,pHorLines[0].begy));
//	uchar* pos2=(uchar*)(ctdib->GetPtrToPixel (pHorLines[0].begx,pHorLines[0].begy));

	uint32_t size_line_com=sizeof(LINE_COM);
	CLINE_handle hline;

   if(LDPUMA_Skip(ObvKillLines))
   {
	   for(hline=CLINE_GetFirstLine(*pCLINE);hline;hline=CLINE_GetNextLine(hline))
	   {
		DelLineFromInside(pmasp,bytewide,num_str,hline);
	   }
   }
   else//тривиальное снятие линий
   {
//	if(!LDPUMA_Skip(hUseCLine))
//	{
	 hline = CLINE_GetFirstLine(*pCLINE);
	 nHorLines=0;
     len_hor_mas=50;
	 nVerLines=0;
	 len_ver_mas=50;

     if(!InitLineMas(&pHorLines,len_hor_mas))
	 {
		 ctdib->ResetDIB ();
	     delete ctdib;
		 CIMAGE_DeleteImage((uchar*)ImageDelLines);
		 return FALSE;
	 }
	 if(!InitLineMas(&pVerLines,len_ver_mas))
	 {
         DelLineMas(pHorLines);
		 ctdib->ResetDIB ();
	     delete ctdib;
		 CIMAGE_DeleteImage((uchar*)ImageDelLines);
		 return FALSE;
	 }

     while(hline)
	 {
	  CPDLine cpdata;
	  fl_cont=FALSE;
	  cpdata=CLINE_GetLineData(hline);
      if(!cpdata)
	     hline=CLINE_GetNextLine(hline);
      else
	  {
        if((cpdata->Flags & LI_IsTrue)&&(!fl_not_kill_pointed||(fl_not_kill_pointed&&cpdata->Type!=NR_DT_LinePointed)))
        {
		  if(cpdata->Dir==LD_Horiz)
		  {
           if(nHorLines>=len_hor_mas)
		   {
			if(!AddLenLineMas(&pHorLines,len_hor_mas,add_len_mas))
			{
				fl_cont=TRUE;
			    hline=CLINE_GetNextLine(hline);
			}
		   }
		   if(!fl_cont)
		   {
            pHorLines[nHorLines].begx=cpdata->Line.Beg_X;
	        pHorLines[nHorLines].begy=cpdata->Line.Beg_Y;
		    pHorLines[nHorLines].endx=cpdata->Line.End_X;
		    pHorLines[nHorLines].endy=cpdata->Line.End_Y;
		    pHorLines[nHorLines].wide10=cpdata->Line.Wid10;
		    nHorLines++;
			hline=CLINE_GetNextLine(hline);
		   }
		  }
		  else
		  {
		   if(nVerLines>=len_ver_mas)
		   {
			if(!AddLenLineMas(&pVerLines,len_ver_mas,add_len_mas))
			{
				fl_cont=TRUE;
			    hline=CLINE_GetNextLine(hline);
		    }
           }
		   if(!fl_cont)
		   {
            pVerLines[nVerLines].begx=cpdata->Line.Beg_X;
	        pVerLines[nVerLines].begy=cpdata->Line.Beg_Y;
		    pVerLines[nVerLines].endx=cpdata->Line.End_X;
		    pVerLines[nVerLines].endy=cpdata->Line.End_Y;
		    pVerLines[nVerLines].wide10=cpdata->Line.Wid10;
		    nVerLines++;
			hline=CLINE_GetNextLine(hline);
		   }
		  }
		}
		else
			hline=CLINE_GetNextLine(hline);
	  }
	 }
/*	}
	else
	{
     pBlock=NULL;
	 pBlock = CPAGE_GetBlockFirst (hCPage, RLINE_BLOCK_TYPE );
	 if( pBlock==NULL)
	 {
		 info.Images|=IMAGE_DELLINE;
		 SetPageInfo(hCPage,info);
		 ctdib->ResetDIB ();
	     delete ctdib;
		 return TRUE;
	 }
	  size32 = CPAGE_GetBlockData(hCPage, pBlock, RLINE_BLOCK_TYPE, &lti, sizeof(LinesTotalInfo));
	  if (size32 != sizeof(LinesTotalInfo) )
	  {
		 ctdib->ResetDIB ();
	     delete ctdib;
		 CIMAGE_DeleteImage((uchar*)ImageDelLines);
		 return FALSE;
	  }

	 HorType = (uint32_t)lti.Hor.Lns;
	 VerType = (uint32_t)lti.Ver.Lns;


/////////////////////////////////////////////////////////////////////////////////////////////
     nHorLines=0;
     len_hor_mas=50;

     if(!InitLineMas(&pHorLines,len_hor_mas))
	 {
		 ctdib->ResetDIB ();
	     delete ctdib;
		 CIMAGE_DeleteImage((uchar*)ImageDelLines);
		 return FALSE;
	 }

     pBlock=NULL;
	 pBlock = CPAGE_GetBlockFirst(hCPage,HorType);

	 while (pBlock)
	 {
		fl_cont=FALSE;
		size32 = CPAGE_GetBlockData(hCPage,pBlock,HorType,&linfo,size_lineinfo);
		if(size32!=size_lineinfo)
		{
			fl_cont=TRUE;
			pBlock = CPAGE_GetBlockNext(hCPage,pBlock,HorType);
		}
		if(fl_cont)
		  continue;
		if(!(linfo.Flags&LI_IsTrue)||(fl_not_kill_pointed&&(linfo.Flags&LI_Pointed)))
		{
			fl_cont=TRUE;
            pBlock = CPAGE_GetBlockNext(hCPage,pBlock,HorType);
		}
		if(fl_cont)
			continue;

        if(nHorLines>=len_hor_mas)
		{
			if(!AddLenLineMas(&pHorLines,len_hor_mas,add_len_mas))
			{
				fl_cont=TRUE;
		    	pBlock = CPAGE_GetBlockNext(hCPage,pBlock,HorType);
			}
		}
		if(fl_cont)
			continue;

		pHorLines[nHorLines].begx=linfo.A.x;
		pHorLines[nHorLines].begy=linfo.A.y;
		pHorLines[nHorLines].endx=linfo.B.x;
		pHorLines[nHorLines].endy=linfo.B.y;
		pHorLines[nHorLines].wide10=(linfo.Thickness)*10;
		nHorLines++;

		pBlock = CPAGE_GetBlockNext(hCPage,pBlock,HorType);

	 }

/////////////////////////////////////////////////////////////////////////////////////////////

     nVerLines=0;
     len_ver_mas=50;

	 pBlock=NULL;
	 pBlock = CPAGE_GetBlockFirst(hCPage,VerType);

     if(!InitLineMas(&pVerLines,len_ver_mas))
	 {
		 ctdib->ResetDIB ();
	     delete ctdib;
		 CIMAGE_DeleteImage((uchar*)ImageDelLines);
		 DelLineMas(pHorLines);
		 return FALSE;
	 }

	 while (pBlock)
	 {
		fl_cont=FALSE;
		size32 = CPAGE_GetBlockData(hCPage,pBlock,VerType,&linfo,size_lineinfo);
		if(size32!=size_lineinfo)
		{
			fl_cont=TRUE;
            pBlock = CPAGE_GetBlockNext(hCPage,pBlock,VerType);
		}
		if(fl_cont)
		  continue;

		if(!(linfo.Flags&LI_IsTrue)||(fl_not_kill_pointed&&(linfo.Flags&LI_Pointed)))
		{
			fl_cont=TRUE;
            pBlock = CPAGE_GetBlockNext(hCPage,pBlock,VerType);
		}
		if(fl_cont)
			continue;

        if(nVerLines>=len_ver_mas)
		{
			if(!AddLenLineMas(&pVerLines,len_ver_mas,add_len_mas))
			{
				fl_cont=TRUE;
			    pBlock = CPAGE_GetBlockNext(hCPage,pBlock,VerType);
			}
		}
		if(fl_cont)
			continue;

		pVerLines[nVerLines].begx=linfo.A.x;
		pVerLines[nVerLines].begy=linfo.A.y;
		pVerLines[nVerLines].endx=linfo.B.x;
		pVerLines[nVerLines].endy=linfo.B.y;
		pVerLines[nVerLines].wide10=(linfo.Thickness)*10;
		nVerLines++;

		pBlock = CPAGE_GetBlockNext(hCPage,pBlock,VerType);

	 }
    }
*/

/////////////////////////////////////////////////////////////////////////////////////////////


    int time_hor=clock();
	for(i=0;i<nHorLines;i++)
	{
		if(pHorLines[i].begx>pHorLines[i].endx)
			DelOneHorLine(pmasp,bytewide,num_str,pHorLines[i].endx,pHorLines[i].endy,pHorLines[i].begx,pHorLines[i].begy,pHorLines[i].wide10);
		else
			DelOneHorLine(pmasp,bytewide,num_str,pHorLines[i].begx,pHorLines[i].begy,pHorLines[i].endx,pHorLines[i].endy,pHorLines[i].wide10);
	}
    time_hor=clock()-time_hor;
//	LDPUMA_ConsoleN("Time hor=%d",time_hor);

    int time_ver=clock();
	for(i=0;i<nVerLines;i++)
	{
		if(pVerLines[i].begy>pVerLines[i].endy)
			DelOneVerLine(pmasp,bytewide,num_str,pVerLines[i].endx,pVerLines[i].endy,pVerLines[i].begx,pVerLines[i].begy,pVerLines[i].wide10);
		else
			DelOneVerLine(pmasp,bytewide,num_str,pVerLines[i].begx,pVerLines[i].begy,pVerLines[i].endx,pVerLines[i].endy,pVerLines[i].wide10);
	}
    time_ver=clock()-time_ver;
//	LDPUMA_ConsoleN("Time ver=%d",time_ver);
    DelLineMas(pHorLines);
	DelLineMas(pVerLines);
   }//конец тривиального удаления

    ctdib->ResetDIB ();
	delete ctdib;

	info.Images|=IMAGE_DELLINE;
	SetPageInfo(hCPage,info);
	time=clock()-time;
//	LDPUMA_ConsoleN("Time work=%d",time);
	return TRUE;
}
void checkResolution(Handle hCCOM, Handle hCPAGE)
{
	PAGEINFO page_info = {0};
	const int min_res = 99;
	CCOM_comp* pcomp=NULL;
	unsigned int Masy[100], Masx[100], i, Jy_m = 0, My_m = 0, Jx_m = 0, Mx_m = 0, M_t;
	bool flag_set = false;

	if (!GetPageInfo(hCPAGE, &page_info)) return;

	if (page_info.DPIX > min_res && page_info.DPIY > min_res) return;

	for (i=0; i<100; i++) Masx[i] = Masy[i] = 0;

	pcomp = CCOM_GetFirst(hCCOM, NULL);

	while (pcomp)
	{
		if (pcomp->h > 9 && pcomp->h < 100) Masy[pcomp->h]++;

		if (pcomp->w > 9 && pcomp->w < 100) Masx[pcomp->w]++;

		pcomp = CCOM_GetNext(pcomp, NULL);
	}

	for (i=11; i < 99; i++)
	{
		M_t = Masy[i-1] + Masy[i] + Masy[i+1];

		if (M_t > My_m)
		{
			Jy_m = i;
			My_m = M_t;
		}

		M_t = Masx[i-1] + Masx[i] + Masx[i+1];

		if (M_t > Mx_m)
		{
			Jx_m = i;
			Mx_m = M_t;
		}
	}

	if (Jy_m > 10 && My_m > 100 && !(page_info.DPIY*22 < 2*300*Jy_m && 2*page_info.DPIY*22 > 300*Jy_m))
	{
		page_info.DPIY = (300*Jy_m+11)/22;
		flag_set = true;
	}

	if (Jx_m > 10 && Mx_m > 100 && !(page_info.DPIX*22 < 2*300*Jx_m && 2*page_info.DPIX*22 > 300*Jx_m))
	{
		page_info.DPIX = (300*Jx_m+11)/22;
		flag_set = true;
	}

	if (flag_set)
	{
		SetPageInfo(hCPAGE, page_info);

		if (!LDPUMA_Skip(hDebugPrintResolution))
			LDPUMA_ConsoleN("новое разрешение: DPIX=%d, DPIY=%d", page_info.DPIX, page_info.DPIY);
	}
}
////////////////////////////////////////////////////////////////////////////////
// Предварительная обработка
// (07.07.2000) Изначально взято из puma.dll без изменений
// сильно привязана к пуме
// в начале окучиваем выделение компонент
Bool32 PreProcessImage( PRSPreProcessImage Image )
{

	Bool32 gbAutoRotate          = Image->gbAutoRotate;
	puchar *gpRecogDIB           = Image->pgpRecogDIB;
	Handle hCPAGE                = Image->hCPAGE;
	const char * glpRecogName    = *Image->pglpRecogName;
	PCIMAGEBITMAPINFOHEADER info = (PCIMAGEBITMAPINFOHEADER)Image->pinfo;
	/////////////////////////////////
	Bool32 rc = TRUE;
	//char * lpRecogName = NULL;
	uint32_t Angle = 0;

	hWndTurn = 0;

	if(InitPRGTIME())
		ProgressStart();

	if(!ProgressStep(1,5))
		rc = FALSE;

	// Andrey 12.11.01
	// Проинициализируем контейнер CPAGE
	//
	if(rc)
	{
		PAGEINFO           PInfo = {0};
		GetPageInfo(hCPAGE,&PInfo);
		strcpy((char*)PInfo.szImageName, glpRecogName);
		PInfo.BitPerPixel = info->biBitCount;
		PInfo.DPIX = info->biXPelsPerMeter*254L/10000;
//		PInfo.DPIX = PInfo.DPIX < 200 ? 200 : PInfo.DPIX;
		PInfo.DPIY = info->biYPelsPerMeter*254L/10000;
//		PInfo.DPIY = PInfo.DPIY < 200 ? 200 : PInfo.DPIY;
		PInfo.Height = info->biHeight;
		PInfo.Width = info->biWidth;
//		PInfo.X = 0; Уже установлено
//		PInfo.Y = 0;
		PInfo.Incline2048 = 0;
		PInfo.Page = 1;
		PInfo.Angle = Angle;

		SetPageInfo(hCPAGE,PInfo);
	}

	////////////////////////////////////////////////////////
	// Выделим компоненты
	//
	if(!ProgressStep(2,65))
		rc = FALSE;

	if(rc)
	{
		if(LDPUMA_Skip(Image->hDebugCancelComponent)/*DPumaSkipComponent()*/)
		{
//			uchar ori;
			PRGTIME prev = StorePRGTIME(65, 85);
			rc = ExtractComponents( gbAutoRotate, NULL, (puchar)glpRecogName, Image);
			RestorePRGTIME(prev);
/*			if(rc && gbAutoRotate)
			{
				//if(!REXC_GetOrient(&ori))
				//if(!REXC_GetOrient(&ori) && db_spec_prj!=SPEC_PRJ_GIP )
				if(!RNORM_GetOrient(&ori, *(Image->phCCOM)) && db_spec_prj!=SPEC_PRJ_GIP )
				{
					SetReturnCode_rstuff(RNORM_GetReturnCode());
					rc = FALSE;
				}
				else
				{
					//if(ori)
					if(ori && !(db_spec_prj==SPEC_PRJ_GIP&&ori==4))
					{
						uint32_t dwTurn = 0;
						switch(ori)
						{
						case 1:
							Angle = 270;
							dwTurn = RIMAGE_TURN_270;
							break;
						case 2:
							Angle = 90;
							dwTurn = RIMAGE_TURN_90;
							break;
						case 3:
							Angle = 180;
							dwTurn = RIMAGE_TURN_180;
							break;
						}

						if( LDPUMA_Skip(Image->hDebugCancelTurn) /*umaSkipTurn()*/ /*)
						{
							if(!RIMAGE_Turn((puchar)glpRecogName,(puchar)PUMA_IMAGE_TURN,dwTurn,0))
							{
								SetReturnCode_rstuff_rstuff(RIMAGE_GetReturnCode());
								rc = FALSE;
							}
							else
							{

								if(!CIMAGE_ReadDIB((puchar)PUMA_IMAGE_TURN,(Handle*)gpRecogDIB,TRUE))
								{
									SetReturnCode_rstuff_rstuff(CIMAGE_GetReturnCode());
									rc = FALSE;
								}
								else
								{
									//
									//  удалим общий контейнер
									//
									glpRecogName = PUMA_IMAGE_TURN;
									hWndTurn = LDPUMA_CreateWindow(PUMA_IMAGE_TURN,(*gpRecogDIB));
									PRGTIME prev = StorePRGTIME(85, 100);
									rc = ExtractComponents( FALSE, NULL, (puchar)glpRecogName, Image);
									PAGEINFO info = {0};
		                            GetPageInfo(hCPAGE,&info);
									info.Images|=IMAGE_TURN;
//									strcpy((char*)info.szImageName,PUMA_IMAGE_TURN);
		                            SetPageInfo(hCPAGE,info);
                                    RestorePRGTIME(prev);
								}
							}
						}
					}
				}
			}*/

			//проверим наличие разрешения и попытаемся определить по компонентам, если его нет
			checkResolution(*(Image->phCCOM), hCPAGE);
			if(!ProgressStep(2,100))
				rc = FALSE;

		}
		else
			LDPUMA_Console("Пропущен этап выделения компонент.\n");
	}
	//
	// Переинициализируем контейнер CPAGE
	//
	if(rc)
	{
		PAGEINFO           PInfo = {0};
		GetPageInfo(hCPAGE,&PInfo);
		strcpy((char*)PInfo.szImageName, glpRecogName);
		PInfo.BitPerPixel = info->biBitCount;
//		PInfo.DPIX = info->biXPelsPerMeter*254L/10000;
		PInfo.DPIX = PInfo.DPIX < 200 ? 200 : PInfo.DPIX;
//		PInfo.DPIY = info->biYPelsPerMeter*254L/10000;
		PInfo.DPIY = PInfo.DPIY < 200 ? 200 : PInfo.DPIY;
		PInfo.Height = info->biHeight;
		PInfo.Width = info->biWidth;
//		PInfo.X = 0; Уже установлено
//		PInfo.Y = 0;
		PInfo.Incline2048 = 0;
		PInfo.Page = 1;
		PInfo.Angle = Angle;

		SetPageInfo(hCPAGE,PInfo);
	}

	if(DonePRGTIME())
		ProgressFinish();

	return rc;
}
Bool32 RemoveLines(PRSPreProcessImage Image, puchar * lppDIB)
{
	Handle hccom = *Image->phCCOM;
	Handle hcpage = Image->hCPAGE;
	Handle *hLinesCCOM = Image->phLinesCCOM;

	puchar hDIB = NULL;
	Bool32 rc = TRUE;
    *hLinesCCOM = NULL;
    CCOM_comp   *victim[100];
    int32_t       nvict,i;
    Bool32      yes_victim = FALSE;
	//
	// Удалим линии
	//
	if(!LDPUMA_Skip(ObvKillLines)||(LDPUMA_Skip(hNewLine)&&LDPUMA_Skip(Image->hDebugCancelVerifyLines)))
		rc=DeleteLines(hcpage,Image->phCLINE,PUMA_IMAGE_DELLINE);
	else
	{
	 if(rc && !RLINE_DeleteLines(hcpage,PUMA_IMAGE_DELLINE))
	 {
		SetReturnCode_rstuff(RLINE_GetReturnCode());
		rc = FALSE;
	 }
     if (rc && LDPUMA_Skip(NotKillPointed) && LDPUMA_Skip(Image->hDebugCancelSearchDotLines))
         rc = DeleteDotLines(Image->phCLINE, PUMA_IMAGE_DELLINE);
	}

	LDPUMA_Skip(hPrep2);
	//
	// Получим изображение с удаленными линиями
	//
	if(rc && !CIMAGE_ReadDIB((puchar)PUMA_IMAGE_DELLINE,(Handle*)&hDIB,TRUE))
	{
		SetReturnCode_rstuff(CIMAGE_GetReturnCode());
		rc = FALSE;
	}
	if(hDIB)
	{
		//
		// Удалим компоненты и выделим их заново.
		//
		*lppDIB = (puchar)hDIB;
		if(rc)
		{
		//if( CCOM_GetContainerVolume((CCOM_handle)*Image->phCCOM)>30000 )
		//	CCOM_CompressContatiner((CCOM_handle)*Image->phCCOM);
        if( CCOM_GetContainerVolume((CCOM_handle)*Image->phCCOM)<60000 &&
            MyGetZher ((void**)victim, &nvict, 100, hcpage) && nvict )
            yes_victim = TRUE;

        if( !yes_victim )
            {
            CCOM_DeleteContainer((CCOM_handle)*Image->phCCOM);
            *Image->phCCOM = 0;
            }

		if(!ExtractComponents(FALSE, hLinesCCOM, (puchar)PUMA_IMAGE_DELLINE, Image))
		{
				rc = FALSE;
		}
        else
        {
            PAGEINFO inf = {0};
            GetPageInfo(Image->hCPAGE,&inf);
            strcpy((char*)inf.szImageName,PUMA_IMAGE_DELLINE);
			inf.Images|=IMAGE_DELLINE;
            SetPageInfo(Image->hCPAGE,inf);
        }

		if(rc)
		{

			*Image->phCCOM = (Handle)REXCGetContainer();
			if(*Image->phCCOM == 0)
			{
				SetReturnCode_rstuff(REXC_GetReturnCode());
				rc = FALSE;
			}
			hccom = *Image->phCCOM;
            if( *hLinesCCOM )
                {
                //
                // Refersh CCOM
                //
                CCOM_comp   *exa=CCOM_GetFirst((CCOM_handle)*hLinesCCOM,NULL);

                if( yes_victim )
                {
                /*
                Rect16 rect1;
	            uint32_t key = 111;
                for(i=0;i<nvict;i++)
                    {
                    exa = victim[i];
                    rect1.top = exa->upper;
		            rect1.left = exa->left;
		            rect1.bottom = exa->upper+exa->h;
		            rect1.right = exa->left+exa->w;
		            LDPUMA_DrawRect(NULL, &rect1, 0, 23635, 1, key);
                    }

                if(!LDPUMA_Skip(hShowCheckLetters))
	                {
		                LDPUMA_Console("Puma_Коробки жертв  \n");
		                LDPUMA_WaitUserInput(NULL, NULL);
		                LDPUMA_DeleteRects(NULL, key);
	                }
                    */
                for(i=0;i<nvict;i++)
                    {
                    exa = victim[i];
                    if( remove_overlayed(exa,(CCOM_handle)*Image->phCCOM) )
                        {
                        CCOM_comp   *dup=CCOM_New((CCOM_handle)*Image->phCCOM,exa->upper,exa->left,exa->w,exa->h);
                        if( dup )
                            {
                            CCOM_Store(dup,0,
                                exa->size_linerep,
                                exa->linerep,  exa->nl,
                                exa->begs, exa->ends,
                                exa->vers,   NULL);
                            dup->scale= exa->scale;
                            dup->type = exa->type;
                            dup->cs   = exa->cs;
                            }
                        }
                    }
                }
                CCOM_DeleteContainer((CCOM_handle)*hLinesCCOM);
                }
			}
			else
				LDPUMA_Console("Пропущен этап выделения компонент после удаления линий.\n");
		}
	}
return rc;
}
Exemple #23
0
void __fastcall TTiffBook::FlipCurPage(int n) {
//-------------------------------------------------------------------------------
//               Переворачивает текущую страницу вверх ногами                   |
// n - номер страницы, который надо нанести. <= 0 - только убрать ном стр       |
//-------------------------------------------------------------------------------
    stop++;
    Gdiplus::Graphics *g32;
    TTiffImage *img = GetImagePage(GetPage());
    Gdiplus::Bitmap *fbm = img->fbm;
    Gdiplus::Rect r;
    int w = fbm->GetWidth(), h = fbm->GetHeight();

    // g = new Gdiplus::Graphics(fbm);

    Gdiplus::Bitmap *b32 = new Gdiplus::Bitmap(w, h, PixelFormat32bppARGB);
    g32 = new Gdiplus::Graphics(b32);

    Gdiplus::Matrix matr;
    matr.Rotate(180.0f);                // поворачиваем его на 270 градусов
    g32->SetTransform(&matr);

    //r.X = 0;
    //r.Y = 0;
    //r.Width = w;
    //r.Height = h;

    //r.X = -SaveBitmapH;
    //r.Y = -30;
    //r.Width = SaveBitmapH - 30;
    //r.Height = SaveBitmapW - 30;

    r.X = -w;
    r.Y = -h;
    r.Width = w;
    r.Height = h;

    sres = g32->DrawImage(fbm, r, 0, 0, w, h, Gdiplus::UnitPixel, 0, 0, 0);

    matr.Reset();
    g32->SetTransform(&matr);

    // Удаляем черные полосы сверху и снизу
    Gdiplus::Pen whitePen2(Gdiplus::Color(255, 255, 255, 255), 2);
    g32->DrawLine(&whitePen2, 0, 0, w, 0);
    g32->DrawLine(&whitePen2, 0, h-1, w, h-1);

    // Удаляем старый номер страницы - он теперь внизу
    // Gdiplus::Pen whitePen40(Gdiplus::Color(255, 0, 0, 0), 45);   // ??? Пока черный - для отладки!
    Gdiplus::Pen whitePen40(Gdiplus::Color(255, 255, 255, 255), 45);
    g32->DrawLine(&whitePen40, 0, h - 50, 200, h - 50);

    if (n > 0) {                        // Здесь выводим номер страницы
        AnsiString snum;
        wchar_t wnum[20];
        snum.printf("%d", n);
        snum.WideChar(wnum, 20);
        Gdiplus::Font myFont(L"Arial", 40, Gdiplus::FontStyleBold);
        Gdiplus::PointF origin(w - 160, 20.0f);
        Gdiplus::SolidBrush blackBrush(Gdiplus::Color(255, 0, 0, 0));
        g32->DrawLine(&whitePen40, w - 200, 50, w, 50);
        sres = g32->DrawString(wnum, -1, &myFont, origin, &blackBrush);
    }

    //if (npage > 0) {            // Здесь выводим номер страницы
    //    AnsiString snum;
    //    wchar_t wnum[20];
    //    snum.printf("%d", npage);
    //    snum.WideChar(wnum, 20);
    //    Gdiplus::Font myFont(L"Arial", 40, Gdiplus::FontStyleBold);
    //    Gdiplus::PointF origin(SaveBitmapW - 160, 20.0f);
    //    Gdiplus::SolidBrush blackBrush(Gdiplus::Color(255, 0, 0, 0));
    //    SaveBitmap2TiffGraphics->DrawString(wnum, -1, &myFont, origin, &blackBrush);
    //}

    // ------- строим SaveBitmap2TiffBitmap1
    UINT *pix;
    unsigned char byte, bit, *pix1;

    Gdiplus::Bitmap *b1 = new Gdiplus::Bitmap(w, h, PixelFormat1bppIndexed);
    Gdiplus::Rect BitsRect(0, 0, w, h);
    Gdiplus::BitmapData *bits = new Gdiplus::BitmapData;
    Gdiplus::BitmapData *bits1 = new Gdiplus::BitmapData;
    sres = b32->LockBits(&BitsRect, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, bits);
    sres = b1->LockBits(&BitsRect, Gdiplus::ImageLockModeWrite, PixelFormat1bppIndexed, bits1);

    for (int y = 0; y < h; y++) {
        pix = (UINT *)((int)bits->Scan0 + bits->Stride * y);
        pix1 = (unsigned char *)((int)bits1->Scan0 + bits1->Stride * y);
        byte = 0;
        for (int x = 0; x < w; x++, pix++) {
            if ((*pix & 0xFF) > 0xD8) {
                bit = 1;
            }
            else bit = 0;
            byte <<= 1; byte |= bit;
            if ((x & 7) == 7) {
                *pix1++ = byte;
                byte = 0;
            }
        }
    }

    b32->UnlockBits(bits); delete bits;
    b1->UnlockBits(bits1); delete bits1;

    delete g32;
    delete b32;

    TTiffPageInfo *pi = GetPageInfo(GetPage());
    if (img->Filn.Length() == 0) {                  // Это уже временный файл!
        delete img->fbm;
        img->fbm = b1;
    } else {                                        // Надо будет заменить страницу на временный файл
        img = new TTiffImage(b1);
        pi->ImageIndex = AppendImage(img);
        pi->PageIndex = 0;
    }

    changed = true;
}