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; }
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; }
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; }
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; }