Example #1
0
void PutTempToCPAGE(Handle hCPage,NegList* root)
{
 NegList* now;
 NegTemp temp;
 Bool fl_cont;
 int size_phstr=sizeof(NegTemp);

 for(now=root;now;now=now->next)
 {
   fl_cont=FALSE;
   if((now->neg).p<=inf_prob)
	   continue;
   int i(0);
   for(i=1;i<now->neg.nRc;i++)
   {
	if(!UnifCont(now->neg.hCCOM[0],now->neg.hCCOM[i]))
		fl_cont=TRUE;
   }
   if(fl_cont)
	   continue;

  if(now->neg.nRc>Max_Str_Count)
	 continue;
  else
	  temp.nRc=now->neg.nRc;

  if(now->neg.rot.pmasp)
  {
	  temp.fl_rotate=TRUE;
	  for(int i=temp.nRc;i>=0;i--)
		 temp.phi[i]=now->neg.rot.hi[i];
  }
  else
	  temp.fl_rotate=FALSE;

  for(i=temp.nRc;i>=0;i--)
  {
	 temp.prc[i].bottom=now->neg.pRc[i].bottom;
	 temp.prc[i].top=now->neg.pRc[i].top;
	 temp.prc[i].left=now->neg.pRc[i].left;
	 temp.prc[i].right=now->neg.pRc[i].right;
  }

  temp.top=now->neg.pRc[now->neg.nRc-1].top;
  temp.oldleft=temp.left;
  temp.h=now->neg.pRc[0].bottom-temp.top+1;
  temp.left=now->neg.pRc[0].left;
  temp.w=now->neg.pRc[0].right-temp.left+1;

  if(temp.h>temp.w)
	  temp.vertical=TRUE;
  else
	  temp.vertical=FALSE;

  temp.hStrCCOM=now->neg.hCCOM[0];

  if(CPAGE_CreateBlock(hCPage,TYPE_RNEG_TEMP_PHSTR,0,0,&temp,size_phstr))
	  now->neg.hCCOM[0]=0;
 }
}
Example #2
0
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;
}
Example #3
0
Bool32 SearchNewLines( PRSPreProcessImage Image )
{
    Bool32 ret = TRUE;
    bool searchlines = LDPUMA_Skip(Image->hDebugCancelSearchDotLines) && !LDPUMA_Skip(hDotLine);
    Handle hSaveImage = CPAGE_CreateBlock(Image->hCPAGE, RSL_VERLINE, 0, 0, Image, sizeof (RSPreProcessImage));

    if(LDPUMA_Skip(Image->hDebugCancelVerifyLines))
    {
        ret=RLINE_LinesPass1(Image->hCPAGE,*(Image->phCCOM),Image->phCLINE,Image->pgneed_clean_line, searchlines, (uchar)Image->gnLanguage);

        if (ret && !gbRSLT)
            ret = RLINE_LinesPass2(*(Image->phCCOM),Image->phCLINE, Image->hCPAGE);
    }

    CPAGE_DeleteBlock(Image->hCPAGE, hSaveImage);

    return ret;
}
Example #4
0
//###########################################
// Если блоки конвертируемы один в другой, тогда имеет смысл оставить только один,
// наиболее полный тип. Именно это и делает эта функция.
//
CPAGE_FUNC(Bool32)  CPAGE_UpdateBlocks( Handle hPage, Handle type )
{
	PROLOG;
	Bool32  rc = TRUE;
	uint32_t	size = 0;
	char *	lpData = NULL;
	Handle  temporaray = 0;

	SetReturnCode_cpage(IDS_ERR_NO);
#ifdef _DEBUG
	_ASSERT(CPAGE_GetNameInternalType(type));
#endif

	SetReturnCode_cpage(IDS_ERR_NO);

	Handle hBlock = CPAGE_GetBlockFirst(hPage,type);
	if(!hBlock)
	{
		rc = TRUE;
		goto lOut;
	}
	// Создадим временные блоки и удалим старые.
	// Тем самым предотвращаем зацикливание.
	temporaray = CPAGE_GetInternalType("temporary");
	while(hBlock)
	{
		Handle hNextBlock = CPAGE_GetBlockNext(hPage,hBlock,type);// type - запрашиваемый тип блока
		Handle dwType	  = CPAGE_GetBlockType(hPage,hBlock); // dwType - Реальный тип блока
		if(dwType != type) // Была произведена конвертация из типа dwType !
		{
			uint32_t UserNum = CPAGE_GetBlockUserNum(hPage,hBlock);
			uint32_t Flags   = CPAGE_GetBlockFlags(hPage,hBlock);
			if(lpData == NULL)
			{ // Определим необходимый размер и отведем память.
				size = CPAGE_GetBlockData(hPage,hBlock,type,NULL,0);
				if(size)
				{
					lpData = (char *)myAlloc(size);
					if(!lpData)
					{
						rc = FALSE;
						SetReturnCode_cpage(IDS_ERR_NO_MEMORY);
						break;
					}
				}
				else
				{
					SetReturnCode_cpage(IDS_ERR_DISCREP);
					rc = FALSE;
					break;
				}
			}
			if(CPAGE_GetBlockData(hPage,hBlock,type,lpData,size)==size)
			{
				CPAGE_DeleteBlock(hPage,hBlock);
				if(!CPAGE_CreateBlock(hPage,temporaray, UserNum , Flags, lpData, size))
				{
					SetReturnCode_cpage(IDS_ERR_NO_MEMORY);
					rc = FALSE;
					break;
				}
			}
		}
		hBlock = hNextBlock;
	}
	// Переименуем временные блоки
	if(lpData) // Проверка на существование таких блоков
	{
		myFree(lpData);
		for(hBlock = CPAGE_GetBlockFirst(hPage,temporaray);
			hBlock;
			hBlock = CPAGE_GetBlockNext(hPage,hBlock,temporaray))
		{
			BLOCK_H_H(hPage,hBlock).SetType(type);
		}
	}
lOut:EPILOG;
return rc;
}
Example #5
0
Bool32 SearchRectanglePictures(CCOM_handle hCCOM, CCOM_handle hCCOM_big, Handle hCPAGE) {
	uint32_t i, j;
	CCOM_comp pic;
	CCOM_comp * comp;
	uint16_t pLocalHystogram[MaxHeightOfLetter];
	uint32_t nLocalComps;
	uint32_t MaxLocal, nMaxLocal;
	uint32_t Result1, Result2, Result3, Result4, tmp1, tmp2;
	Rect32 rect;
	int32_t LengthTotal, LengthByIntervals;
	Handle BlockType;
	RecRaster rec;
	RecVersions vs;
	int16_t Language;
	RPIC_Comp_Rect CompRect;

	BlockType = CPAGE_GetInternalType("pic's to letters boxes");

	for (i = 0; i < nPics; i++) {
		pic = pPics[i];
		my_upper = pic.upper;
		my_left = pic.left;
		my_bottom = pic.upper + pic.h;
		my_right = pic.left + pic.w;

		//Additional parameter - local distribution of heights
		//in case of local fragment with different (from main) height
		nLocalComps = 0;
		for (j = 0; j < MaxHeightOfLetter; j++) {
			pLocalHystogram[j] = 0;
		}

		//stepa_am
		comp = CCOM_GetFirst(hCCOM_big, &MyFiltrateIn);
		while (comp) {
			if ((comp->h < MaxHeightOfLetter) && (comp->h > MinHeightOfLetter)) {
				pLocalHystogram[comp->h]++;
				nLocalComps++;
			}
			comp = CCOM_GetNext(comp, &MyFiltrateIn);
		}
		//end stepa_am

		comp = CCOM_GetFirst(hCCOM, &MyFiltrateIn);
		while (comp) {
			if ((comp->h < MaxHeightOfLetter) && (comp->h > MinHeightOfLetter)) {
				pLocalHystogram[comp->h]++;
				nLocalComps++;
			}
			comp = CCOM_GetNext(comp, &MyFiltrateIn);
		}

		if (nLocalComps != 0) {
			MaxLocal = pLocalHystogram[0];
			for (j = 0; j < MaxHeightOfLetter; j++) {
				if (pLocalHystogram[j] > MaxLocal) {
					MaxLocal = pLocalHystogram[j];
					nMaxLocal = j;
				}
			}

			Result1 = 0;
			Result2 = 0;
			sprintf(tmp_str, " %i Result1 (must be 0)\n", Result1);
			LDPUMA_FPuts(logFile_comp, tmp_str);
			sprintf(tmp_str, " %i Result2 (must be 0)\n", Result2);
			LDPUMA_FPuts(logFile_comp, tmp_str);
			sprintf(tmp_str, " %i (nComps)\n", nComps);
			LDPUMA_FPuts(logFile_comp, tmp_str);

			//stepa_am
			comp = CCOM_GetFirst(hCCOM_big, &MyFiltrateIn);
			while (comp) {
				//sprintf(tmp_str, " %i  (comp)\n", comp);
				//LDPUMA_FPuts(hFile,tmp_str);
				if ((comp->h < MaxHeightOfLetter - 1) && (comp->h
						> MinHeightOfLetter)) {

					sprintf(tmp_str, " %i  (comp->h)\n", comp->h);
					LDPUMA_FPuts(logFile_comp, tmp_str);
					sprintf(tmp_str, " %i  (pHystogram[comp->h])\n",
							pHystogram[comp->h]);
					LDPUMA_FPuts(logFile_comp, tmp_str);

					//Result1 += OVERALL*pHystogram[comp->h];
					Result1 += pHystogram[comp->h] / 20 + pHystogram[comp->h
							- 1] / 20 + pHystogram[comp->h + 1] / 20;
					if (comp->h - nMaxLocal < DIFFERENCE1) {
						//Result2 += LOCAL*pLocalHystogram[comp->h];
						Result2 += pLocalHystogram[comp->h]
								+ pLocalHystogram[comp->h - 1]
								+ pLocalHystogram[comp->h + 1];
					}
				}
				comp = CCOM_GetNext(comp, &MyFiltrateIn);
			}
			//end stepa_am

			comp = CCOM_GetFirst(hCCOM, &MyFiltrateIn);
			while (comp) {
				//sprintf(tmp_str, " %i  (comp)\n", comp);
				//LDPUMA_FPuts(hFile,tmp_str);
				if ((comp->h < MaxHeightOfLetter - 1) && (comp->h
						> MinHeightOfLetter)) {

					sprintf(tmp_str, " %i  (comp->h)\n", comp->h);
					LDPUMA_FPuts(logFile_comp, tmp_str);
					sprintf(tmp_str, " %i  (pHystogram[comp->h])\n",
							pHystogram[comp->h]);
					LDPUMA_FPuts(logFile_comp, tmp_str);

					//Result1 += OVERALL*pHystogram[comp->h];
					Result1 += pHystogram[comp->h] / 20 + pHystogram[comp->h
							- 1] / 20 + pHystogram[comp->h + 1] / 20;
					if (comp->h - nMaxLocal < DIFFERENCE1) {
						//Result2 += LOCAL*pLocalHystogram[comp->h];
						Result2 += pLocalHystogram[comp->h]
								+ pLocalHystogram[comp->h - 1]
								+ pLocalHystogram[comp->h + 1];
					}
				}
				comp = CCOM_GetNext(comp, &MyFiltrateIn);
			}

			//Result1 = Result1/nComps;
			Result1 = Result1 / 10;
			//Result2 = Result2/nLocalComps;
			Result2 = Result2 / 20;

			sprintf(tmp_str, " Picture %i (i)\n", i);
			LDPUMA_FPuts(logFile_comp, tmp_str);
			sprintf(tmp_str, " %i (Result1)\n", Result1);
			LDPUMA_FPuts(logFile_comp, tmp_str);
			sprintf(tmp_str, " %i (Result2)\n", Result2);
			LDPUMA_FPuts(logFile_comp, tmp_str);

			if (Result1 + Result2 > CONDITION1) {
				DeleteFromPics(i);
				//i--;
				continue;
			}
		}

		/**************************************************************************/
		/*                      Analys by comp's count of begins&ends             */
		/**************************************************************************/

		CCOM_USER_BLOCK uBlock;
		uBlock.code = CCOM_UB_BEGENDS;
		if (CCOM_GetUserBlock(&pPics[i], &uBlock)) {
			if (*(uchar*) uBlock.data > 100) {
				continue;
			}
		}

		/**************************************************************************/
		/*                      Analys by comp's intervals                        */
		/**************************************************************************/

		//CCOM_USER_BLOCK uBlock;
		uBlock.code = CCOM_UB_DENSITY;
		if (CCOM_GetUserBlock(&pPics[i], &uBlock)) {
			LengthByIntervals = *(int32_t*) uBlock.data;
			LengthTotal = pPics[i].h * pPics[i].w;

			if (LengthByIntervals == 0) {
				return FALSE;
			}

			if (LengthTotal / LengthByIntervals > CONDITION2) {
				DeleteFromPics(i);
				//i--;
			}
		}

	}

	/************** final union all crossed and included pictures ******************/
	CCOM_comp common;
	for (i = 0; i < nPics; i++) {
		if (pPics[i].large & CCOM_LR_KILLED) {
			continue;
		}
		for (j = 0; j < nPics; j++) {
			if (pPics[j].large & CCOM_LR_KILLED) {
				continue;
			}
			if ((pPics[i].upper < pPics[j].upper) && (pPics[i].left
					< pPics[j].left) && (pPics[i].left + pPics[i].w
					> pPics[j].left + pPics[j].w) && (pPics[i].upper
					+ pPics[i].h > pPics[j].upper + pPics[j].h)) {
				if ((pPics[i].type != CCOM_CH_LETTER) || (pPics[j].type
						!= CCOM_CH_LETTER)) {
					pPics[i].type = CCOM_CH_MERGE;
				}
				DeleteFromPics(j);
				//j--;
			}
		}
	}

	for (i = 0; i < nPics; i++) {
		if (pPics[i].large & CCOM_LR_KILLED) {
			continue;
		}
		for (j = 0; j < nPics; j++) {
			if (pPics[j].large & CCOM_LR_KILLED) {
				continue;
			}
			if (i == j)
				continue;
			if ((pPics[i].upper < pPics[j].upper + pPics[j].h)
					&& (pPics[i].left < pPics[j].left + pPics[j].w)
					&& (pPics[i].left + pPics[i].w > pPics[j].left)
					&& (pPics[i].upper + pPics[i].h > pPics[j].upper)) {
				common = pPics[i];
				if (pPics[i].upper >= pPics[j].upper)
					common.upper = pPics[j].upper;
				if (pPics[i].left >= pPics[j].left)
					common.left = pPics[j].left;
				if (pPics[i].upper + pPics[i].h < pPics[j].upper + pPics[j].h)
					common.h = pPics[j].upper + pPics[j].h - pPics[i].upper;
				if (pPics[i].left + pPics[i].w < pPics[j].left + pPics[j].w)
					common.w = pPics[j].left + pPics[j].w - pPics[i].left;
				common.h += pPics[i].upper - common.upper;
				common.w += pPics[i].left - common.left;
				pPics[i] = common;
				/*
				 if((pPics[i].type!=CCOM_CH_LETTER)||(pPics[j].type!=CCOM_CH_LETTER))
				 {
				 pPics[i].type = CCOM_CH_MERGE;
				 }
				 */
				pPics[i].type = CCOM_CH_NOTLTR;
				DeleteFromPics(j);
				//j=0;
				//i=0;
			}
		}
	}

	for (i = 0; i < nPics; i++) {
		if (pPics[i].large & CCOM_LR_KILLED) {
			continue;
		}
		pic = pPics[i];
		my_upper = pic.upper;
		my_left = pic.left;
		my_bottom = pic.upper + pic.h;
		my_right = pic.left + pic.w;
		/*
		 Deleting from Pics, in case of Titles and "Bukvica", zero version,
		 planing CHECK (by Oleg) for Letters in case of Bukvica, else check for
		 comps with compatible heights in local area (horizontal).
		 */
		if (pPics[i].scale <= 3) {
			rect.top = pPics[i].upper;
			rect.left = pPics[i].left + pPics[i].w;
			rect.bottom = pPics[i].upper + pPics[i].h;
			rect.right = pPics[i].left + pPics[i].w + pPics[i].h;
			CheckAreaForComps(hCCOM, hCCOM_big, rect, nAverageHeight, &Result1,
					&Result2);

			if ((Result1 > 10) && (pPics[i].type != CCOM_CH_NOTLTR)) {
				if (CCOM_GetRaster(&pPics[i], &rec) && CCOM_GetLanguage(hCCOM,
						&Language) && RSTR_RecogOneLetter(&rec, (uchar)(
						Language), &vs)) {

					if ((vs.lnAltCnt > 0) && (vs.Alt[0].Prob > 240)
							&& (vs.Alt[0].Code != 'i') && (vs.Alt[0].Code
							!= '1') && (vs.Alt[0].Code != 'I')
							&& (vs.Alt[0].Code != 'l')) {
						pPics[i].type = CCOM_CH_LETTER;
						CompRect.upper = pPics[i].upper;
						CompRect.left = pPics[i].left;
						CompRect.h = pPics[i].h;
						CompRect.w = pPics[i].w;
						CPAGE_CreateBlock(hCPAGE, BlockType, 0, 0, &CompRect,
								sizeof(CompRect));

						DeleteFromPics(i);
						//i--;
						continue;
					}
				}
			}

			rect.top = pPics[i].upper - (int32_t)(0.3 * (double) (pPics[i].h));
			rect.left = pPics[i].left - 12* pPics [i].h;
			rect.bottom = pPics[i].upper + (int32_t)(1.3
					* (double) (pPics[i].h));
			//rect.right = pPics[i].left + pPics[i].w;
			rect.right = pPics[i].left;
			CheckAreaForComps(hCCOM, hCCOM_big, rect, pPics[i].h, &Result1,
					&Result2);
			if (Result2 > 7) {
				rect.top = pPics[i].upper - (int32_t)(0.3
						* (double) (pPics[i].h));
				rect.left = pPics[i].left - (int32_t)(1.5
						* (double) (pPics[i].h));
				rect.bottom = pPics[i].upper + (int32_t)(1.3
						* (double) (pPics[i].h));
				rect.right = pPics[i].left;
				CheckAreaForComps(hCCOM, hCCOM_big, rect, pPics[i].h, &tmp1,
						&tmp2);
				if (tmp2 == 0)
					Result2 = 0;
			}
			if ((Result1 > 3) || (Result2 > 7)) {
				pPics[i].type = CCOM_CH_LETTER;
				CompRect.upper = pPics[i].upper;
				CompRect.left = pPics[i].left;
				CompRect.h = pPics[i].h;
				CompRect.w = pPics[i].w;
				CPAGE_CreateBlock(hCPAGE, BlockType, 0, 0, &CompRect,
						sizeof(CompRect));

				DeleteFromPics(i);
				//i--;
				continue;
			}

			rect.top = pPics[i].upper - (int32_t)(0.3 * (double) (pPics[i].h));
			rect.left = pPics[i].left + pPics[i].w;
			rect.bottom = pPics[i].upper + (int32_t)(1.3
					* (double) (pPics[i].h));
			rect.right = pPics[i].left + pPics[i].w + 12* pPics [i].h;
			CheckAreaForComps(hCCOM, hCCOM_big, rect, pPics[i].h, &Result3,
					&Result4);
			if (Result4 > 0) {
				rect.top = pPics[i].upper - (int32_t)(0.3
						* (double) (pPics[i].h));
				rect.left = pPics[i].left + pPics[i].w;
				rect.bottom = pPics[i].upper + (int32_t)(1.3
						* (double) (pPics[i].h));
				rect.right = pPics[i].left + pPics[i].w + (int32_t)(1.5
						* (double) (pPics[i].h));
				CheckAreaForComps(hCCOM, hCCOM_big, rect, pPics[i].h, &tmp1,
						&tmp2);
				if (tmp2 == 0)
					Result4 = 0;
			}
			if ((Result3 > 3) || (Result4 > 7) || (Result1 + Result3 > 3)
					|| (Result2 + Result4 > 7)) {
				pPics[i].type = CCOM_CH_LETTER;
				CompRect.upper = pPics[i].upper;
				CompRect.left = pPics[i].left;
				CompRect.h = pPics[i].h;
				CompRect.w = pPics[i].w;
				CPAGE_CreateBlock(hCPAGE, BlockType, 0, 0, &CompRect,
						sizeof(CompRect));

				DeleteFromPics(i);
				//i--;
				continue;
			}
		}
	}

	return TRUE;
}
Example #6
0
Bool32 RPIC_SearchPictures(CCOM_handle hCCOM, CCOM_handle hCCOM_big, Handle hCPAGE) {
	CCOM_comp * comp = NULL;
	CCOM_comp common;
	PAGEINFO pInfo;
	POLY_ block;
	uint32_t i, j;

	Rect16 rect;
	uint32_t key;
	uint32_t color;
	uint32_t tmp_comp = 0;

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

	OpenLogRes();
	file_name = (char*) LDPUMA_GetFileName(NULL);
	//color = 23650;
	color = 200;
	key = 111;
	nPics = 0;
	if (pPics) {
		free(pPics);
		pPics = NULL;
	}
	nComps = 0;

	CPAGE_GetPageData(hCPAGE, PT_PAGEINFO, (void*) &pInfo, sizeof(pInfo));

	for (i = 0; i < MaxHeightOfLetter; i++) {
		pHystogram[i] = 0;
	}

	//LDPUMA_FPuts(hFile, (char*)&pInfo.szImageName);
	LDPUMA_FPuts(logFile_comp,
			"*******************************************************\n");
	LDPUMA_FPuts(logFile_comp, "new_file \n");

	if ((pInfo.Angle == 90) || (pInfo.Angle == 270)) {
		uint32_t tmp;
		tmp = pInfo.Width;
		pInfo.Width = pInfo.Height;
		pInfo.Height = tmp;
	}

	//stepa_am
	comp = CCOM_GetFirst(hCCOM_big, NULL);
	while (comp) {
		tmp_comp++;

		if ((comp->h > MinHeightOfLetter) && (comp->h < MaxHeightOfLetter)) {
			nComps++;
			pHystogram[comp->h]++;
		}
		if (comp->scale < 1)
			goto lNextComp_big;
		/*
		 if( comp->cs == 255)
		 {
		 comp->type = CCOM_CH_LETTER;
		 goto lNextComp;
		 }
		 */
		if (IsNotGoodComp(pInfo, comp)) {
			if (!LDPUMA_Skip(hShowAllCancelledGreat)) {
				rect.left = comp->left;
				rect.top = comp->upper;
				rect.right = comp->left + comp->w;
				rect.bottom = comp->upper + comp->h;
				LDPUMA_DrawRect(MainWindowD, &rect, 0, color, 4, key);
			}
			goto lNextComp_big;
		}

		if (nPics % PICS_QUANTUM == 0) {
			pPics = (CCOM_comp *) realloc(pPics, (size_t) ((nPics
					/ PICS_QUANTUM + 1) * PICS_QUANTUM * sizeof(CCOM_comp)));
		}

		pPics[nPics++] = *comp;

		lNextComp_big: comp = CCOM_GetNext(comp, NULL);

	}
	//end stepa_am

	comp = CCOM_GetFirst(hCCOM, NULL);
	while (comp) {
		tmp_comp++;

		if ((comp->h > MinHeightOfLetter) && (comp->h < MaxHeightOfLetter)) {
			nComps++;
			pHystogram[comp->h]++;
		}
		if ( /*comp->scale < */1)
			goto lNextComp;
		/*
		 if( comp->cs == 255)
		 {
		 comp->type = CCOM_CH_LETTER;
		 goto lNextComp;
		 }
		 */
		if (IsNotGoodComp(pInfo, comp)) {
			if (!LDPUMA_Skip(hShowAllCancelledGreat)) {
				rect.left = comp->left;
				rect.top = comp->upper;
				rect.right = comp->left + comp->w;
				rect.bottom = comp->upper + comp->h;
				LDPUMA_DrawRect(MainWindowD, &rect, 0, color, 4, key);
			}
			goto lNextComp;
		}

		if (nPics % PICS_QUANTUM == 0) {
			pPics = (CCOM_comp *) realloc(pPics, (size_t) ((nPics
					/ PICS_QUANTUM + 1) * PICS_QUANTUM * sizeof(CCOM_comp)));
		}

		pPics[nPics++] = *comp;

		lNextComp: comp = CCOM_GetNext(comp, NULL);

	}

	if (!LDPUMA_Skip(hShowAllCancelledGreat)) {
		LDPUMA_Console("RPIC_Отмененные большие компоненты \n");
		LDPUMA_WaitUserInput(hShowAllCancelledGreat, MainWindowD);
		LDPUMA_DeleteRects(MainWindowD, key);
	}

	if (!nComps) // OLEG
		return TRUE; // STEPA_AM
	if (!nPics)
		return TRUE;

	/**************************************************/
	for (i = 0; i < MaxHeightOfLetter; i++) {
		nAverageHeight += pHystogram[i] * i;
		/*
		 sprintf(tmp_str, " %i (i)\n", i);
		 LDPUMA_FPuts(logFile,tmp_str);
		 sprintf(tmp_str, " %i (pHystogram[i])\n", pHystogram[i]);
		 LDPUMA_FPuts(logFile,tmp_str);
		 */
	}
	nAverageHeight /= nComps;
	sprintf(tmp_str, "Average height %i (nAverageHeight)\n", nAverageHeight);
	LDPUMA_FPuts(logFile_comp, tmp_str);
	/**************************************************/

	/************** first union all crossed and included pictures ******************/
	/*
	 for (i=0; i<nPics; i++)
	 {
	 for (j=0; j<nPics; j++)
	 {
	 if ( (pPics[i].upper  < pPics[j].upper)&&
	 (pPics[i].left   < pPics[j].left)&&
	 (pPics[i].left   + pPics[i].w > pPics[j].left + pPics[j].w)&&
	 (pPics[i].upper  + pPics[i].h > pPics[j].upper + pPics[j].h) )
	 {
	 DeleteFromPics (j);
	 j--;
	 }
	 }
	 }




	 for (i=0; i<nPics; i++)
	 {
	 for (j=0; j<nPics; j++)
	 {
	 if (i==j) continue;
	 if ( (pPics[i].upper - VER_BOUND_SIZE < pPics[j].upper + pPics[j].h)&&
	 (pPics[i].left  - HOR_BOUND_SIZE < pPics[j].left  + pPics[j].w)&&
	 (pPics[i].left  + pPics[i].w + HOR_BOUND_SIZE > pPics[j].left)&&
	 (pPics[i].upper + pPics[i].h + VER_BOUND_SIZE > pPics[j].upper) )
	 {
	 common = pPics[i];
	 if (pPics[i].upper >= pPics[j].upper)
	 common.upper = pPics[j].upper;
	 if (pPics[i].left >= pPics[j].left)
	 common.left = pPics[j].left;
	 if (pPics[i].upper + pPics[i].h < pPics[j].upper + pPics[j].h)
	 common.h = pPics[j].upper + pPics[j].h - pPics[i].upper;
	 if (pPics[i].left  + pPics[i].w < pPics[j].left + pPics[j].w)
	 common.w = pPics[j].left + pPics[j].w - pPics[i].left;
	 common.h += pPics[i].upper - common.upper;
	 common.w += pPics[i].left  - common.left;
	 pPics[i] = common;
	 DeleteFromPics (j);
	 j=0;
	 i=0;
	 }
	 }
	 }
	 */
	/***********************************************************************************/

	color = 200;
	key = 111;
	if ((!LDPUMA_Skip(hShowAllGreat)) && nPics) {
		for (i = 0; i < nPics; i++) {
			rect.left = pPics[i].left;
			rect.top = pPics[i].upper;
			rect.right = pPics[i].left + pPics[i].w;
			rect.bottom = pPics[i].upper + pPics[i].h;
			LDPUMA_DrawRect(MainWindowD, &rect, 0, color, 2, key);
		}
		LDPUMA_Console("RPIC_Рассматриваемые большие компоненты \n");
		LDPUMA_WaitUserInput(hShowAllGreat, MainWindowD);
		LDPUMA_DeleteRects(MainWindowD, key);
	}

	//sprintf(tmp_str, "Amount of 'letters' on the first step %i (nComps)\n", nComps);
	//LDPUMA_FPuts(logFile_comp,tmp_str);
	//sprintf(tmp_str, "  <2 Н Страница = %d \n", page_count++);
	//LDPUMA_FPuts(resFile_comp,tmp_str);

	//char* str;
	//str = LDPUMA_GetFileName(NULL);

	LDPUMA_FPuts(resFile_comp, "  <2 Н Страница =");
	LDPUMA_FPuts(resFile_comp, file_name);
	LDPUMA_FPuts(resFile_comp, " \n");
	//LDPUMA_FPuts(resFile_comp, "  <2 Н Страница \n");
	LDPUMA_FPuts(resFile_comp, "  <3 Н Компоненты \n");
	sprintf(tmp_str, "  <4 П Перед выделением линий \n", nComps);
	LDPUMA_FPuts(resFile_comp, tmp_str);
	sprintf(tmp_str, "  <4 Р %d \n", nComps);
	LDPUMA_FPuts(resFile_comp, tmp_str);
	sprintf(tmp_str,
			"Amount of pictures on the before first step %i (nPics)\n", nPics);
	LDPUMA_FPuts(logFile_comp, tmp_str);

	/*******************************************************************/
	if (LDPUMA_Skip(hRectanglePictures))
		SearchRectanglePictures(hCCOM, hCCOM_big, hCPAGE);
	if (LDPUMA_Skip(hPolyPictures))
		SearchPolyPictures(hCCOM, hCPAGE);
	/*******************************************************************/

	/************** final union all crossed and included pictures ******************/

	for (i = 0; i < nPics; i++) {
		if (pPics[i].large & CCOM_LR_KILLED) {
			continue;
		}
		for (j = 0; j < nPics; j++) {
			if ((pPics[i].upper < pPics[j].upper) && (pPics[i].left
					< pPics[j].left) && (pPics[i].left + pPics[i].w
					> pPics[j].left + pPics[j].w) && (pPics[i].upper
					+ pPics[i].h > pPics[j].upper + pPics[j].h)) {
				/*
				 if((pPics[i].type!=CCOM_CH_LETTER)||(pPics[j].type!=CCOM_CH_LETTER))
				 {
				 pPics[i].type = CCOM_CH_MERGE;
				 }
				 */
				if (pPics[j].large & CCOM_LR_KILLED) {
					// it's bad, but will work cause pPics[].large not initialised in RPIC
					pPics[i].large |= CCOM_LR_TAKEN;
					continue;
				}
				DeleteFromPics(j);
				//j--;
			}
		}
	}

	for (i = 0; i < nPics; i++) {
		if (pPics[i].large & CCOM_LR_KILLED) {
			continue;
		}
		for (j = 0; j < nPics; j++) {
			if (pPics[j].large & CCOM_LR_KILLED) {
				continue;
			}
			if (i == j)
				continue;
			if ((pPics[i].upper - VER_BOUND_SIZE < pPics[j].upper + pPics[j].h)
					&& (pPics[i].left - HOR_BOUND_SIZE < pPics[j].left
							+ pPics[j].w) && (pPics[i].left + pPics[i].w
					+ HOR_BOUND_SIZE > pPics[j].left) && (pPics[i].upper
					+ pPics[i].h + VER_BOUND_SIZE > pPics[j].upper)) {
				common = pPics[i];
				if (pPics[i].upper >= pPics[j].upper)
					common.upper = pPics[j].upper;
				if (pPics[i].left >= pPics[j].left)
					common.left = pPics[j].left;
				if (pPics[i].upper + pPics[i].h < pPics[j].upper + pPics[j].h)
					common.h = pPics[j].upper + pPics[j].h - pPics[i].upper;
				if (pPics[i].left + pPics[i].w < pPics[j].left + pPics[j].w)
					common.w = pPics[j].left + pPics[j].w - pPics[i].left;
				common.h += pPics[i].upper - common.upper;
				common.w += pPics[i].left - common.left;
				pPics[i] = common;
				DeleteFromPics(j);
			}
		}
	}

	LastCheck(hCCOM, hCCOM_big, hCPAGE);

	LDPUMA_FPuts(resFile_pict, "  <2 Н Страница =");
	LDPUMA_FPuts(resFile_pict, file_name);
	LDPUMA_FPuts(resFile_pict, " \n");
	LDPUMA_FPuts(resFile_pict, "  <3 Н Картинки \n");
	LDPUMA_FPuts(resFile_pict, "  <4 Н После первого прохода \n");
	sprintf(tmp_str, "  <4 Р %d %d %d \n", nPics, 0, 0);
	LDPUMA_FPuts(resFile_pict, tmp_str);

	int32_t min_image_width =
			(int32_t)(100 * ((double) (pInfo.DPIX + 1) / 300));
	int32_t min_image_height = (int32_t)(100
			* ((double) (pInfo.DPIY + 1) / 300));

	for (i = 0; i < nPics; i++) {
		if (pPics[i].large & CCOM_LR_KILLED
				&& !(pPics[i].large & CCOM_LR_TAKEN)) {
			continue;
		}
		block.com.type = TYPE_TEXT;//Текст, Картинка, Таблица;
		block.com.number = 0;//порядковый номер
		block.com.count = 4;
		block.com.Flags = 0;
		block.com.Vertex[0].rx() = pPics[i].left;
		block.com.Vertex[0].ry() = pPics[i].upper;
		block.com.Vertex[1].rx() = pPics[i].left + pPics[i].w;
		block.com.Vertex[1].ry() = pPics[i].upper;
		block.com.Vertex[2].rx() = pPics[i].left + pPics[i].w;
		block.com.Vertex[2].ry() = pPics[i].upper + pPics[i].h;
		block.com.Vertex[3].rx() = pPics[i].left;
		block.com.Vertex[3].ry() = pPics[i].upper + pPics[i].h;
		block.alphabet = 0;

		sprintf(tmp_str, "  <4 О 1 %4d %4d %4d %4d %d \n", pPics[i].left,
				pPics[i].upper, pPics[i].left + pPics[i].w, pPics[i].upper,
				pPics[i].h);
		LDPUMA_FPuts(resFile_pict, tmp_str);

		if (pPics[i].large & CCOM_LR_TAKEN || pPics[i].w < min_image_width
				&& pPics[i].h < min_image_height) {
			CPAGE_CreateBlock(hCPAGE, POSSIBLE_PICTURES, 0, 0, &block,
					sizeof(POLY_));
		} else {
			CPAGE_CreateBlock(hCPAGE, TYPE_IMAGE, 0, 0, &block, sizeof(POLY_));
		}
	}

	LDPUMA_FPuts(resFile_pict, "  <4 К После первого прохода \n");
	sprintf(tmp_str, "Amount of comps on the first step %i (tmp_comp) \n",
			tmp_comp);
	LDPUMA_FPuts(logFile_comp, tmp_str);
	sprintf(tmp_str, "Amount of pictures on the first step %i (nPics) \n",
			nPics);
	LDPUMA_FPuts(logFile_comp, tmp_str);
	LDPUMA_FPuts(logFile_comp,
			"*******************************************************\n");

	if (pPics != NULL) {
		free(pPics);
		pPics = NULL;
	}
	nPics = 0;

	CloseLogRes();

	Handle h = NULL;

	if (!LDPUMA_Skip(hShowFirstAttempt)) {
		h = NULL;
		nPics = 0;
		for (h = CPAGE_GetBlockFirst(hCPAGE, TYPE_IMAGE); h != NULL; h
				= CPAGE_GetBlockNext(hCPAGE, h, TYPE_IMAGE)) {
			nPics++;
			CPAGE_GetBlockData(hCPAGE, h, TYPE_IMAGE, &block, sizeof(block));
			rect.left = block.com.Vertex[0].x();
			rect.top = block.com.Vertex[0].y();
			rect.right = block.com.Vertex[1].x();
			rect.bottom = block.com.Vertex[2].y();
			LDPUMA_DrawRect(MainWindowD, &rect, 0, color, 2, key);
		}
		if (nPics) {
			LDPUMA_Console("RPIC_Картинки после первого прохода \n");
			LDPUMA_WaitUserInput(hShowFirstAttempt, MainWindowD);
			LDPUMA_DeleteRects(MainWindowD, key);
		}
	}

	if (!LDPUMA_Skip(hShowPossiblePics)) {
		h = NULL;
		nPics = 0;
		for (h = CPAGE_GetBlockFirst(hCPAGE, POSSIBLE_PICTURES); h != NULL; h
				= CPAGE_GetBlockNext(hCPAGE, h, POSSIBLE_PICTURES)) {
			nPics++;
			CPAGE_GetBlockData(hCPAGE, h, POSSIBLE_PICTURES, &block,
					sizeof(block));
			rect.left = block.com.Vertex[0].x();
			rect.top = block.com.Vertex[0].y();
			rect.right = block.com.Vertex[1].x();
			rect.bottom = block.com.Vertex[2].y();
			LDPUMA_DrawRect(MainWindowD, &rect, 0, color, 2, key);
		}
		if (nPics) {
			LDPUMA_Console("RPIC_Неуверенные картинки после первого прохода \n");
			LDPUMA_WaitUserInput(hShowPossiblePics, MainWindowD);
			LDPUMA_DeleteRects(MainWindowD, key);
		}
	}

	Handle BlockType = CPAGE_GetInternalType("pic's to letters boxes");
	RPIC_Comp_Rect CompRect;
	if (!LDPUMA_Skip(hShowBigLetters)) {
		h = NULL;
		nPics = 0;
		for (h = CPAGE_GetBlockFirst(hCPAGE, BlockType); h != NULL; h
				= CPAGE_GetBlockNext(hCPAGE, h, BlockType)) {
			nPics++;
			CPAGE_GetBlockData(hCPAGE, h, BlockType, &CompRect,
					sizeof(CompRect));
			rect.left = CompRect.left;
			rect.top = CompRect.upper;
			rect.right = CompRect.left + CompRect.w - 1;
			rect.bottom = CompRect.upper + CompRect.h - 1;
			LDPUMA_DrawRect(MainWindowD, &rect, 0, color, 2, key);
		}
		if (nPics) {
			LDPUMA_Console("RPIC_Буквицы \n");
			LDPUMA_WaitUserInput(hShowBigLetters, MainWindowD);
			LDPUMA_DeleteRects(MainWindowD, key);
		}
	}
	return TRUE;
}
Example #7
0
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);
}