Example #1
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 #2
0
Bool32 CheckAreaForComps(CCOM_handle hCCOM, CCOM_handle hCCOM_big, Rect32 rect,
		int32_t Height, uint32_t *Result1, uint32_t *Result2) {
	CCOM_comp * comp;
	uint32_t i;
	comp = NULL;

	Rect16 rect1;
	uint32_t key = 111;
	uint32_t color = 23000;

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

	*Result1 = 0;
	*Result2 = 0;

	if (!LDPUMA_Skip(hShowCheckLetters)) {
		rect1.top = (uint16_t) rect.top;
		rect1.left = (uint16_t) rect.left;
		rect1.bottom = (uint16_t) rect.bottom;
		rect1.right = (uint16_t) rect.right;
		LDPUMA_DrawRect(MainWindowD, &rect1, 0, 23635, 4, key);
	}

	//stepa_am
	comp = CCOM_GetFirst(hCCOM_big, NULL);
	while (comp) {
		if (comp->h < Height / 6)
			goto lNextComp_big;
		if (comp->h > Height * 1.5)
			goto lNextComp_big;
		if (comp->upper < rect.top)
			goto lNextComp_big;
		if (comp->left < rect.left)
			goto lNextComp_big;
		if (comp->upper + comp->h > rect.bottom)
			goto lNextComp_big;
		if (comp->left + comp->w > rect.right)
			goto lNextComp_big;
		if ((comp->h < Height / 3) && (comp->upper < rect.top))
			goto lNextComp_big;
		for (i = 0; i < nPics; i++) {
			if ((comp->upper >= pPics[i].upper)
					&& (comp->left >= pPics[i].left) && (comp->upper + comp->h
					< pPics[i].upper + pPics[i].h) && (comp->left + comp->w
					<= pPics[i].left + pPics[i].w)) {
				goto lNextComp_big;
			}
		}

		if ((comp->h > Height * 0.5) && (comp->h < Height * 1.5)) {
			(*Result1)++;
			if (!LDPUMA_Skip(hShowCheckLetters)) {
				rect1.left = comp->left;
				rect1.top = comp->upper;
				rect1.right = comp->left + comp->w;
				rect1.bottom = comp->upper + comp->h;
				LDPUMA_DrawRect(MainWindowD, &rect1, 0, color, 8, key);
			}
			goto lNextComp_big;
		}

		if ((comp->h > Height / 3 * 0.5) && (comp->h < Height / 3* 1.5 )) {
			(*Result2)++;
			if (!LDPUMA_Skip(hShowCheckLetters)) {
				rect1.left = comp->left;
				rect1.top = comp->upper;
				rect1.right = comp->left + comp->w;
				rect1.bottom = comp->upper + comp->h;
				LDPUMA_DrawRect(MainWindowD, &rect1, 0, color, 2, key);
			}
			goto lNextComp_big;
		}

		lNextComp_big: comp = CCOM_GetNext(comp, NULL);
	}
	//end stepa_am

	comp = CCOM_GetFirst(hCCOM, NULL);
	while (comp) {
		if (comp->h < Height / 6)
			goto lNextComp;
		if (comp->h > Height * 1.5)
			goto lNextComp;
		if (comp->upper < rect.top)
			goto lNextComp;
		if (comp->left < rect.left)
			goto lNextComp;
		if (comp->upper + comp->h > rect.bottom)
			goto lNextComp;
		if (comp->left + comp->w > rect.right)
			goto lNextComp;
		if ((comp->h < Height / 3) && (comp->upper < rect.top))
			goto lNextComp;
		for (i = 0; i < nPics; i++) {
			if ((comp->upper >= pPics[i].upper)
					&& (comp->left >= pPics[i].left) && (comp->upper + comp->h
					< pPics[i].upper + pPics[i].h) && (comp->left + comp->w
					<= pPics[i].left + pPics[i].w)) {
				goto lNextComp;
			}
		}

		if ((comp->h > Height * 0.5) && (comp->h < Height * 1.5)) {
			(*Result1)++;
			if (!LDPUMA_Skip(hShowCheckLetters)) {
				rect1.left = comp->left;
				rect1.top = comp->upper;
				rect1.right = comp->left + comp->w;
				rect1.bottom = comp->upper + comp->h;
				LDPUMA_DrawRect(MainWindowD, &rect1, 0, color, 8, key);
			}
			goto lNextComp;
		}

		if ((comp->h > Height / 3* 0.5 )&&(comp->h < Height/3*1.5)) { (*Result2)++;
		if(!LDPUMA_Skip(hShowCheckLetters))
		{
			rect1.left = comp->left;
			rect1.top = comp->upper;
			rect1.right = comp->left + comp->w;
			rect1.bottom = comp->upper + comp->h;
			LDPUMA_DrawRect(MainWindowD, &rect1, 0, color, 2, key);
		}
		goto lNextComp;
	}

	lNextComp:
	comp = CCOM_GetNext(comp,NULL);
}

if(!LDPUMA_Skip(hShowCheckLetters))
{
	LDPUMA_Console("RPIC_Анализ на заголовки  \n");
	LDPUMA_WaitUserInput(hShowCheckLetters, MainWindowD);
	LDPUMA_DeleteRects(MainWindowD, key);
}

return TRUE;
}
Example #3
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);
}