예제 #1
0
void DelIn(Handle hCPage,NegList** proot,int& nRc)
{
 NegList* root=*proot;
 NegList* nowin=root;
 NegList* nowout=root;
 NegList* temp;
 Bool fl_cont;
 Bool vert;
 uchar Data[1000];
 memset (Data, 0, sizeof (Data));
 uchar* pmasp;
 Rect16 Rc;
 double blackout;
 double blackin;
 while(nowout)
 {
	 if((nowout->neg).pRc[0].bottom-(nowout->neg).pRc[(nowout->neg).nRc-1].top>(nowout->neg).pRc[0].right-(nowout->neg).pRc[0].left)
		 vert=TRUE;
	 else
		 vert=FALSE;
	 while(nowin && nowout)
	 {
		 fl_cont=FALSE;
		 if(nowin==nowout)
		 {
			 fl_cont=TRUE;
			 nowin=nowin->next;
		 }
		 if(fl_cont)
			 continue;
		 if(vert)
			 ;
		 else
		 {
		  if(!(nowin->neg.pRc[(nowin->neg).nRc-1].top>=nowout->neg.pRc[0].bottom||nowout->neg.pRc[(nowout->neg).nRc-1].top>=nowin->neg.pRc[0].bottom))
          {
            if( ((nowout->neg).pRc[0].left<(nowin->neg).pRc[0].left)&&((nowout->neg).pRc[0].right>(nowin->neg).pRc[0].left))
			{
              Rc.bottom=(nowout->neg).pRc[0].bottom;
			  Rc.top=(nowout->neg).pRc[(nowout->neg).nRc-1].top;
			  Rc.left=(nowout->neg).pRc[0].left;
			  Rc.right=(nowin->neg).pRc[0].left;
			  pmasp=Data;
			  if(!GetMasP(&Rc,&pmasp))
				  blackout=.0;
			  else
			      blackout=NegBlack(pmasp,Rc);
              Rc.bottom=(nowin->neg).pRc[0].bottom;
			  Rc.top=(nowin->neg).pRc[(nowin->neg).nRc-1].top;
			  Rc.left=(nowout->neg).pRc[0].right;
			  Rc.right=(nowin->neg).pRc[0].right;
			  if(Rc.right<=Rc.left)
                  blackin=.0;
			  else
			  {
               pmasp=Data;
			   if(!GetMasP(&Rc,&pmasp))
				   blackin=.0;
               else
			       blackin=NegBlack(pmasp,Rc);
			  }
			  if(blackout>=blackin)
			  {
				  nRc--;
				  temp=nowin;
				  if(root==temp)
					  root=temp->next;
				  nowin=nowin->next;
				  delete temp;
				  fl_cont=TRUE;
			  }
			  else
			  {
				  nRc--;
				  temp=nowout;
				  if(root==temp)
					  root=temp->next;
				  nowout=nowout->next;
				  delete temp;
				  nowin=root;
				  fl_cont=TRUE;
			  }
			}
		  }
		 }
		 if(fl_cont)
			  ;
		 else
		     nowin=nowin->next;
	 }
	 if (nowout)
     {
        nowout=nowout->next;
	    nowin=root;
     }
 }
 (*proot)=root;
}
예제 #2
0
Bool NegRotate(Handle hCPage,NegList* root,int nRc,int skew)
{
 Bool ret=FALSE;
 int oldskew=skew;
 if(skew<0)
	 skew=-skew;
 if(skew>=2048)
	 return FALSE;
 int w;
 int h;
 int bytewide;

 uchar Data[1000];
 memset (Data, 0, sizeof (Data));
 uchar* pmasp;

 NegList* now=root;
 Rect16 Rc;
 Bool fl_cont;

 while(now)
 {
  fl_cont=FALSE;
  Rc.top=(now->neg).pRc[0].top;
  Rc.bottom=(now->neg).pRc[0].bottom;
  Rc.left=(now->neg).pRc[0].left;
  Rc.right=(now->neg).pRc[0].right;
  w=Rc.right-Rc.left+1;
  h=Rc.bottom-Rc.top+1;
  bytewide=(w+7)/8;
  if((double)(w*skew)/2048.<(double)(inf_betw_str_h))
  {
	  fl_cont=TRUE;
	  now=now->next;
  }
  if(fl_cont)
	  continue;
  if(!(GetMasP(&Rc,&pmasp)) )
  {
	  fl_cont=TRUE;
	  now=now->next;
  }
  if(fl_cont)
	  continue;
  if(!( (now->neg).rot.pmasp=new uchar[bytewide*h]))
  {
	  fl_cont=TRUE;
	  now=now->next;
  }
  if(fl_cont)
	  continue;
  if(!(InitRotateMas(w,h,&((now->neg).rot.begx),&((now->neg).rot.movey),&((now->neg).rot.flmovey),&((now->neg).rot.hi) )))
  {
	  delete[] ((now->neg).rot.pmasp);
	  (now->neg).rot.pmasp=NULL;
	  now=now->next;
	  fl_cont=TRUE;
  }
  if(fl_cont)
	  continue;
  NegCopy(pmasp,(now->neg).rot.pmasp,bytewide,h);
  (now->neg).rot.Rc.bottom=Rc.bottom;
  (now->neg).rot.Rc.top=Rc.top;
  (now->neg).rot.Rc.left=Rc.left;
  (now->neg).rot.Rc.right=Rc.right;
  if( RSELSTR_RotateRaster((now->neg).rot.pmasp,-oldskew,&((now->neg).pRc[0]),(now->neg).rot.begx,(now->neg).rot.movey,(now->neg).rot.flmovey,inf_betw_str_h) )
      ret=TRUE;
  else
  {
	  DeleteRotateMas(&((now->neg).rot.pmasp),&((now->neg).rot.begx),&((now->neg).rot.movey),&((now->neg).rot.flmovey),&((now->neg).rot.hi));
	  (now->neg).rot.pmasp=NULL;
	  (now->neg).rot.begx=NULL;
	  (now->neg).rot.movey=NULL;
	  (now->neg).rot.flmovey=NULL;
	  (now->neg).rot.hi=NULL;
  }

  now=now->next;
 }



 return ret;
}
예제 #3
0
파일: cutstr.cpp 프로젝트: nctan/quneiform
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;
}
예제 #4
0
Bool NegGetRaster(Handle hCPage,Rect16 N,RecRaster* rec,Bool vert)
{
 int i,j,k;
 uchar Data[1000];
 uchar bytep;
 int h=N.bottom-N.top+1;
 int w=N.right-N.left+1;
 int bytewide=(w)/8;
 if( ((w)%8) != 0)
	 bytewide++;
 int vbytewide=(h)/8;
 if( ((h)%8) != 0)
	 vbytewide++;
 uchar* pmasp;
 memset (Data, 0, sizeof (Data));
 pmasp=Data;
 if( !(GetMasP(&N,&pmasp)) )
	 return FALSE;
 if( ((bytewide>8)&&(!vert))||((vbytewide>8)&&vert) )
 {
	 if(!vert)
	 {
		 while(bytewide>8)
		 {
			 NegAr2(pmasp,h,w);
			 w=w/2;
			 h=h/2;
			 bytewide=(w)/8;
             if( ((w)%8) != 0)
	            bytewide++;
		 }
	 }
	 else
	 {
		 while(vbytewide>8)
		 {
			 NegAr2(pmasp,h,w);
			 w=w/2;
			 h=h/2;
			 vbytewide=(h)/8;
             if( ((h)%8) != 0)
	            vbytewide++;
		 }
	 }
 }
 uchar* pin;
 uchar* pfrom;
 uchar* pend;
 if( ((8*h> REC_MAX_RASTER_SIZE)&&(!vert))||((8*w> REC_MAX_RASTER_SIZE)&&vert) )
	 return FALSE;
 if(!vert)
 {
  pin=(*rec).Raster;
  pfrom=pmasp;
  pend=pmasp+(h*bytewide);
  switch(8-bytewide)
  {
   case 0:
	  while(pfrom<pend)
	  {
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	  }
	   break;
   case 1:
	  while(pfrom<pend)
	  {
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=0;pin++;
	  }
	   break;
   case 2:
	  while(pfrom<pend)
	  {
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	  }
	   break;
   case 3:
	  while(pfrom<pend)
	  {
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	  }
	   break;
   case 4:
	  while(pfrom<pend)
	  {
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	  }
	   break;
   case 5:
	  while(pfrom<pend)
	  {
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	  }
	   break;
   case 6:
	  while(pfrom<pend)
	  {
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	  }
	   break;
   case 7:
	  while(pfrom<pend)
	  {
	   (*pin)=(*pfrom);pin++;pfrom++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	   (*pin)=0;pin++;
	  }
	   break;
   default:break;
  }
  (*rec).lnPixHeight=h;
  (*rec).lnPixWidth=w;
  (*rec).lnRasterBufSize=REC_MAX_RASTER_SIZE;
 }
 else
 {
  int rectj;
  int delj;
  int nowbyte;
  int nowbyte2;
  for(j=0;j<w;j++)
  {
   nowbyte=j<<3;
   rectj=j%8;
   delj=j>>3;
   for(i=vbytewide;i<8;i++)
	 (*rec).Raster[nowbyte+i]=0;
   for(i=0;i<vbytewide-1;i++)
   {
	bytep=0;
	nowbyte2=h-1-(i<<3);

	   bytep|=( ( (128>>rectj) & pmasp[bytewide*(nowbyte2)+delj] )<<rectj );
	   bytep|=( ( (128>>rectj) & pmasp[bytewide*(nowbyte2-1)+delj] )<<rectj )>>1;
       bytep|=( ( (128>>rectj) & pmasp[bytewide*(nowbyte2-2)+delj] )<<rectj )>>2;
	   bytep|=( ( (128>>rectj) & pmasp[bytewide*(nowbyte2-3)+delj] )<<rectj )>>3;
	   bytep|=( ( (128>>rectj) & pmasp[bytewide*(nowbyte2-4)+delj] )<<rectj )>>4;
	   bytep|=( ( (128>>rectj) & pmasp[bytewide*(nowbyte2-5)+delj] )<<rectj )>>5;
       bytep|=( ( (128>>rectj) & pmasp[bytewide*(nowbyte2-6)+delj] )<<rectj )>>6;
	   bytep|=( ( (128>>rectj) & pmasp[bytewide*(nowbyte2-7)+delj] )<<rectj )>>7;

    (*rec).Raster[nowbyte+i]=bytep;
   }
   bytep=0;
   nowbyte2=h-1-(i<<3);
   for(k=0;k<h-((vbytewide-1)<<3);k++)
	   bytep|=( ( (128>>rectj) & pmasp[bytewide*(nowbyte2-k)+delj] )<<rectj )>>k;
	(*rec).Raster[nowbyte+i]=bytep;
  }
  (*rec).lnPixHeight=w;
  (*rec).lnPixWidth=h;
  (*rec).lnRasterBufSize=REC_MAX_RASTER_SIZE;
 }
 return TRUE;
}