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());
}
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;
}
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;
}
////////////////////////////////////////////////////////////////////////////////
// Предварительная обработка
// (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;
}
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);
	}
}