static int rec_shortu(cell* c, cell * cap) { cell * clist[8]; uchar let = c->vers[0].let; if(cap->row > c->row) return 0; // not a cap if(cap->width() * 3 < c->width()) return 0; // not so wide as need if(cap->width() < 4 || cap->height() < 3) return 0; // just dot if(cap->col < c->col - 2) return 0; // left dust if(c->row > cap->row + cap->height() && (c->row - (cap->row + cap->height())) > c->height() / 2 ) return 0; // dust lay so high if((let == (uchar)'\xE3') && (c->pos_inc & erect_rot)) // 'u' with cap if(c->col + c->width() / 2 < cap->col || c->col + c->width() / 2 > cap->col + cap->width()) return 0; // not centered dust clist[0] = c; clist[1] = cap; if(!compose_cell(2, clist, c)) return -1; //OLEG:new return style of composed let = is_lower(let) ? (uchar) u_bel : (uchar) U_bel; c->vers[0].let = let; c->vers[0].prob = MIN(254, c->vers[0].prob + 2); c->recsource = 0; // artifact c->dens = 255; // undef c->nvers = 1; c->vers[1].let = c->vers[1].prob = 0; return 1; }
void check_contekst_shevron() { cell *nextc,*clist[2]; while((clend->nextl!=0) && (clend->nextl)->flg & c_f_let) { nextc=clend->nextl; if(clend->vers[0].let=='<' && clend->vers[0].prob>MAX_PROB && nextc->vers[0].let=='<' && nextc->vers[0].prob>MAX_PROB) { if(db_status && snap_activity('e') ) { snap_show_text("<< І†ђ•≠п•вбп ≠† и•¢аЃ≠"); snap_monitor(); } clist[0]=clend; clist[1]=nextc; compose_cell(2,clist,clend); clend->vers[0].let=left_quocket; clend->vers[0].prob=254; clend->vers[1].let=0; clend->nvers=1; } else if(clend->vers[0].let=='>' && clend->vers[0].prob>MAX_PROB && nextc->vers[0].let=='>' && nextc->vers[0].prob>MAX_PROB) { if(db_status && snap_activity('e') ) { snap_show_text(">> І†ђ•≠п•вбп ≠† и•¢аЃ≠"); snap_monitor(); } clist[0]=clend; clist[1]=nextc; compose_cell(2,clist,clend); clend->vers[0].let=right_quocket; clend->vers[0].prob=254; clend->vers[1].let=0; clend->nvers=1; } clend=clend->nextl; } }
static void final_ii_u(cell *c) { cell *c1; uchar lett = u_2dot_accent; c1=c->nextl; if (c->vers[0].let=='i' || language == LANG_TURKISH && ( c->vers[0].let==i_sans_accent || c->vers[0].let==II_dot_accent) // Nick 14.06.02 ) { if( language == LANG_TURKISH) { // don't glue if( c->vers[0].let==i_sans_accent && !(c1->cg_flag&c_cg_cutl) ) return; if( c->vers[0].let==i_sans_accent && c1->vers[0].let==i_sans_accent) // Nick 14.06.02 lett = 'u'; // if no points } clist[0]=c; clist[1]=c1; compose_cell(2,clist,c); c->vers[0].let = lett; // u_2dot_accent; c->vers[0].prob=254; c->nvers=1; c->vers[1].let=0; c->right=c->col+c->w; } else { c->vers[0].let=(c->vers[0].let==liga_fi)?'f':liga_fi; c->vers[0].prob=254; c->nvers=1; c->vers[1].let=0; c1->vers[0].let=u_2dot_accent; c1->vers[0].prob=254; c1->nvers=1; c1->vers[1].let=0; c1->left-=5; } }
int16_t rec_ii(cell* c,cell * cap) { cell *clist[8]; uchar let; let = c->vers[0].let; if( cap->row > c->row ) return 0; // not a cap if( cap->w*3 < c->w ) return 0; // not so wide as need if( cap->w < 4 || cap->h < 3 ) return 0; // just dot if( cap->col < c->col-2 ) return 0; // left dust if(c->row > cap->row+cap->h && (c->row-(cap->row+cap->h)) > c->h/2 ) return 0; // dust lay so high if( let != r_cu_u || (let == r_cu_u&&(c->pos_inc&erect_rot)) ) // 'u' with cap if( c->col+c->w/2 < cap->col || c->col+c->w/2 > cap->col+cap->w) return 0; // not centered dust if( let == r_cu_u) // 'u' with cap if( c->col+c->w < cap->col || c->col > cap->col+cap->w) return 0; // not centered dust if(0&&!p2_active) // OLEG if( let==r_cu_u || let==(uchar)'\xa8' /* и */ ) { B_LINES bl; get_b_lines(c,&bl); if( cap->row+cap->h<=bl.b1+1 ) return 0; } clist[0]=c; clist[1]=cap; if( !compose_cell(2,clist,c) ) return -1; //OLEG:new return style of composed let = is_lower(let) ? (uchar)'\xa9' /* й */ : (uchar)'\x89' /* Й */; c->vers[0].let = let; c->vers[0].prob=MIN(254,c->vers[0].prob+2); c->recsource = 0; // artifact c->dens = 255; // undef c->nvers=1; c->vers[1].let=c->vers[1].prob=0; return 1; }
Bool proc_UKR_I( cell *c ) { cell *cc,*clist[3]; uchar one,Ione,let; int16_t i,ii=0; if( c->flg & (c_f_dust|c_f_punct) ) return FALSE; if( c->vers[0].let == '|' || c->vers[0].let == liga_i ){ c->vers[0].let = 'i'; } if( ((let=c->vers[0].let)=='i' || let=='I' || let=='1') ){ workI.c = c; workI.ld = NULL; workI.rd = NULL; workI.twoDot = 0; one = Ione = 0; for(i=0;i<c->nvers;i++){ if( c->vers[i].let == '1' ) one = c->vers[i].prob; if( c->vers[i].let == 'I' ) Ione = c->vers[i].prob; } cc = dot_ij(c); ii = 0; if( workI.ld ){ ii++; clist[ii] = workI.ld; if( 2*clist[ii]->w > 3*clist[ii]->h && 3*clist[ii]->w > 2*c->w ) workI.twoDot = 1; else if( clist[ii]->w > c->w && clist[ii]->w > clist[ii]->h ) workI.twoDot = 1; } if( workI.rd ){ ii++; clist[ii] = workI.rd; if( 2*clist[ii]->w > 3*clist[ii]->h && 3*clist[ii]->w > 1+2*c->w ) workI.twoDot = 1; else if( clist[ii]->w > 1+c->w && clist[ii]->w > 1+clist[ii]->h ) workI.twoDot = 1; } if( ii ){ clist[0]=c; compose_cell((int16_t)(ii+1),clist,c); } if( let != 'i' ){ // upper c->vers[0].let = UKR_I; c->vers[1].let = UKR_II; c->vers[1].prob = c->vers[0].prob; c->nvers = 2; dif_II(); if( one ){ int16_t i,dl=0,dr=0; c->vers[c->nvers].let = 0; c->vers[c->nvers].prob = 0; promote('b',c,'1',0); if( c->prevl->flg & c_f_let ){ for(i=0;i<c->prevl->nvers;i++) if( is_digit(c->prevl->vers[i].let) && c->prevl->vers[i].prob > 100 ){ dl = 1; break; } } if( c->nextl->flg & c_f_let ){ for(i=0;i<c->nextl->nvers;i++) if( is_digit(c->nextl->vers[i].let) && c->nextl->vers[i].prob > 100 ){ dr = 1; break; } } if( dr == 0 && dl == 0 ){ promote('b',c,'1',-10); } else{ promote('b',c,UKR_I,-10); promote('b',c,UKR_II,-10); } if( (int16_t)Ione-one < 0 ){ promote('b',c,UKR_I,(int16_t)(Ione-one)); promote('b',c,UKR_II,(int16_t)(Ione-one)); } } } else{ // lower c->vers[0].let = UKR_i; c->vers[1].let = UKR_ii; c->vers[1].prob = c->vers[0].prob; c->nvers = 2; dif_II(); if( c->prevl->vers[0].let == UKR_i || c->prevl->vers[0].let == UKR_ii ){ int16_t ldis,rdis,mdis; ldis = c->prevl->col - c->prevl->prevl->col - c->prevl->prevl->w; rdis = c->nextl->col - c->col - c->w; mdis = c->col - c->prevl->col - c->prevl->w; if( mdis < 2*MIN(ldis,rdis) ){ if( 2*ldis <= rdis ){ promote('b',c->prevl,UKR_ii,-30); promote('b',c ,UKR_i, -30); } else{ if( 4*MIN(ldis,rdis) > c->w ){ promote('b',c->prevl,UKR_i,-30); promote('b',c ,UKR_i,-30); } } } } } c->vers[c->nvers].let = 0; c->vers[c->nvers].prob = 0; if( db_status && snap_activity('b') ){ snap_newcell(c); snap_show_text("delete dot for UKR i"); snap_monitor(); } } return FALSE; }/*proc_UKR_I*/
int16_t rec_ii_halo(cell * c) { #define n_pieces 48 cell *cap,*caplist[n_pieces]; uchar let; int16_t i,cap_row,cap_col,cap_h,cap_w,cap_rt,cap_bt,ncaps; i=0; cap = c; while((cap=cap->next)!=NULL && cap != c->nextLetter() && i < n_pieces-1) if(cap->isDust()) caplist[i++] = cap; cap = c; while((cap=cap->prev)!=NULL && cap != c->previousLetter() && i < n_pieces-1) if(cap->isDust()) caplist[i++] = cap; caplist[i]=NULL; ncaps=i; i=0; while(cap=caplist[i]) { // validate halo if(cap->row > c->row ) goto delcap; // inproper place if(cap->h==1 && cap->w==1) goto delcap; // just dot i++; continue; delcap: memmove(&caplist[i],&caplist[i+1],(ncaps-i)*sizeof(cell*)); ncaps--; } if(ncaps < 2) return 0; cap_row=cap_col=32000; cap_rt=cap_bt=0; i=0; while(cap=caplist[i]) { i++; cap_row=MIN(cap_row,cap->row); cap_col=MIN(cap_col,cap->col); cap_rt =MAX(cap_rt,cap->col+cap->w); cap_bt =MAX(cap_bt,cap->row+cap->h); } cap_h = cap_bt-cap_row; cap_w = cap_rt-cap_col; let = c->vers[0].let; if( cap_row > c->row ) return 0; // not a cap if( cap_w*3 < c->w ) return 0; // not so wide as need if( cap_w > c->w ) return 0; // too wide if( cap_w < 4 || cap_h < 3 ) return 0; // just dot if( cap_col < c->col-2 ) return 0; // left dust if(c->row > cap_row+cap_h && (c->row-(cap_row+cap_h)) > c->h/2 ) return 0; // dust lay so high if( let != r_cu_u || (let == r_cu_u&&(c->pos_inc&erect_rot)) ) // 'u' with cap if( c->col+c->w/2 < cap_col || c->col+c->w/2 > cap_col+cap_w) return 0; // not centered dust if( let == r_cu_u) // 'u' with cap if( c->col+c->w < cap_col || c->col > cap_col+cap_w) return 0; // not centered dust memmove(&caplist[1],caplist,i*sizeof(cell*)); caplist[0]=c; if( !compose_cell((int16_t)(i+1),caplist,c) ) return 0; //OLEG:new return style of composed let = is_lower(let) ? (uchar)'\xa9' /* й */ : (uchar)'\x89' /* Й */; c->vers[0].let = let; c->vers[0].prob=MIN(254,c->vers[0].prob+2); c->recsource = 0; // artifact c->dens = 255; // undef c->nvers=1; c->vers[1].let=c->vers[1].prob=0; return 1; }
Bool digital_last_context(void) { cell *curr,*tmp; char punct_list[]="'\"=:"; char sign_list[]="+-_"; int16_t l = strlen(punct_list),num,num_dig,num_bad,num_broken; uchar c,p; if( db_status && snap_activity('c') ) { snap_show_text("DIG : Digital last context"); snap_monitor(); } tmp = cell_f(); while( (tmp=tmp->next)->next ) { if( tmp->nvers && tmp->vers[0].prob==2 ) set_bad_cell(tmp); } num=num_dig=num_bad=num_broken=0; tmp = cell_f(); while( (tmp=tmp->next)->next && !(tmp->flg&(c_f_let|c_f_bad)) ); /* find let */ curr = cell_f(); if( tmp->next ) { while( (curr=curr->next)!=tmp ) if( (curr->flg&c_f_punct) && !(curr->nvers>0 && memchr(sign_list,curr->vers[0].let,sizeof(sign_list))) ) { curr = del_cell(curr); /* kill first punctuation-cell */ if( curr->next==NULL )break; } } curr = cell_l(); while( (curr=curr->prev)->prev && !(curr->flg&(c_f_let|c_f_bad)) ); /* find let */ if( curr->next ) { while( (curr=curr->next)->next ) if( (curr->flg&c_f_punct) ) { curr = del_cell(curr); /* kill last punctuation-cell */ if( curr->next==NULL )break; } } curr = cell_f(); while( (curr=curr->next)->next ) { if( curr->flg&c_f_bad ) num_bad++; if( !(curr->flg&(c_f_let|c_f_punct))) continue; c = curr->vers[0].let; if( memchr(punct_list,c,l) || c==left_quocket || c==right_quocket || c==low_quotes // macros E.P. ) { curr = del_cell(curr); if( curr->next==NULL )break; continue; } /* if( !enable_setup_alphabet && !test_alphabet_elem(c) ) { curr = del_cell(curr); if( curr->next==NULL )break; continue; } */ if( (curr->flg&c_f_let) ) { //if( memchr("0123456789ОЃ°ЗІТВшl",c,19) && if( isLikeDigit(c) && // 21.05.2002 E.P. curr->vers[0].prob > 150 // Nick 26.02.2001 ) num_dig++; if( memchr("С",c,1) )num_broken++; if( curr->flg&c_f_let )num++; } } if( digital_mode==2 || num_dig*4>=num*3 || num_dig==2 && num==3 || num_dig==1 && num==1 && num_bad==1 ) { /* digital string */ curr = cell_f(); if( digital_mode==2 ) while( (curr=curr->next)->next ) { if( !(curr->flg&(c_f_let|c_f_punct))) continue; c = curr->vers[0].let; if ( c==liga_exm || c=='!' ) curr=del_cell(curr); } curr = cell_f(); while( (curr=curr->next)->next ) { if( curr->nvers<1 ) continue; c = curr->vers[0].let; p = curr->vers[0].prob; if( c==(uchar)'_' ) curr->vers[0].let='-' ; if( c==(uchar)'ш' ) curr->vers[0].let='2' ; if( c==(uchar)'О' || // 21.05.2002 E.P. ( c==(uchar)'Ѓ')&& !is_russian_turkish_conflict(c) ) curr->vers[0].let='0' ; if( c==(uchar)'°' ) curr->vers[0].let='6' ; if( c==(uchar)'З' || c==(uchar)'І') curr->vers[0].let='3' ; if( c==(uchar)'В' ) curr->vers[0].let='8' ; if( c==(uchar)'С' && (p<190 || num_broken+num_dig==num ) ) curr->vers[0].let='0' ; if( c==(uchar)'Т' || c==liga_exm || c=='!' || c=='|' ) curr->vers[0].let='1' ; if( c==(uchar)'l' ) curr->vers[0].let='1' ; if( c=='$' && curr->nvers==1 ) { curr->vers[0].let='5'; curr->vers[1].let='$'; curr->vers[1].prob=curr->vers[0].prob-10; curr->nvers=2; } if( c=='5' && curr->nvers>2 && curr->vers[1].let==(uchar)'°' && p==curr->vers[1].prob && curr->vers[2].let=='6' && curr->vers[2].prob>150 ) { /* alternates : °56 -->>CONTEXT-->> 5°6 */ curr->vers[0].let='6'; curr->vers[2].let='5'; } } } digital_mode=0; set_all_alphabet(); for(curr=cell_f()->nextl;curr!=cell_l();curr=curr->nextl) { if( curr->flg&c_f_bad ) { s_glue GL={0}; short_recog_cell(curr); if( curr->nvers<1 ) { GL.celist[0]=curr; GL.maxlist[0]=curr; GL.complist[0]=curr->env; GL.maxlist[1]=GL.celist[1]=NULL; GL.complist[1]=NULL; GL.ncell=1; GL.row = curr->row; GL.col = curr->col; GL.width = curr->w; GL.height = curr->h; if( crecell(curr,&GL,3)>=0) dmBOX(curr,&GL); } criteria(curr); levcut(curr,1); if( curr->nvers<1 || curr->vers[0].prob<220 ) { // restore bad sybmol set_bad_cell(curr); } if( curr->nvers && curr->vers[0].let=='|' ) { curr->vers[0].let='1'; // Nick add 26.02.2001 - test artificial '1' levcut(curr,1); if( curr->nvers<1 || curr->nvers==1 && curr->vers[0].let!='1' || curr->vers[0].prob<220 ) { // restore bad sybmol set_bad_cell(curr); } } } } for(curr=cell_f()->nextl;curr!=cell_l();curr=curr->nextl) { if( curr->nvers && curr->vers[0].let=='(' && curr->next && curr->next->nvers && curr->next->vers[0].let==')' ) { clist[0]=curr; clist[1]=curr->next; compose_cell(2,clist,curr); curr->vers[0].let='0'; curr->vers[1].prob=220; curr->nvers=1; } } if( db_status && snap_activity('c') ) { snap_show_text("DIG : Digital last context end"); snap_monitor(); } num_dig = 0; // Nick 26.02.2001 num = 0; for(curr=cell_f()->nextl;curr!=cell_l();curr=curr->nextl,num++) { // 21.05.2002 E.P. Bool likeDigit = isLikeDigit(curr->vers[0].let); if( curr->nvers<1 || curr->vers[0].prob<150 && likeDigit) return 0; // bad symbols or small propability if( likeDigit ) num_dig++; } if( num_dig*2 <= num ) // Nick 26.02.2001 return 0; return 1; }
void final_crit() { cell *c; uchar let,let1; int16_t cnt; for (cnt=0,c=cell_f()->next; c->next!=NULL; c=c->next) { if (c->flg&c_f_space) continue; let=c->vers[0].let; if(final_crit_russian(c)) cnt++; if (c->font&c_fp_undrln) { if (let=='v') final_vy(c); if (let=='e' || let=='u') final_eg(c); if (let=='o' || let=='a' && c->nvers>=2 && c->vers[1].let=='o') final_ao_gpq(c); if (let=='O') final_OQ(c); if (let=='.') final_dotcom(c); } if (let=='/') cnt+=final_slash_l(c); else { if ((c->font|c->font_new)&c_fp_it && memchr("Il1",let,3)) cnt+=final_no_slash(c); if (c->flg&c_f_bad || c->vers[0].prob<PROBL) cnt+=final_back_slash(c); } if ((let=='c' || let=='C') && c->vers[1].let=='<') { c->nvers=1; c->vers[1].let=0; } if ((let=='b' || let=='h') && (c->font|c->font_new)&c_fp_it) final_bh(c); if ( (language==LANG_GERMAN || language==LANG_SPANISH || language==LANG_FRENCH || language==LANG_ESTONIAN || // 19.07.2001 E.P. language==LANG_TURKISH // 30.05.2002 E.P. ) && ((c->font|c->font_new)&c_fp_it || let=='i' || let==liga_i || language == LANG_TURKISH && // 30.05.2002 E.P. (let==i_sans_accent||let==II_dot_accent) ) && (let=='i' || let==liga_i || language == LANG_TURKISH && // 30.05.2002 E.P. (let==i_sans_accent||let==II_dot_accent) || let==liga_fi || let==liga_ffi ) && ( (let1=c->nextl->vers[0].let)=='i' || let1==liga_i || language == LANG_TURKISH && // 30.05.2002 E.P. (let1==i_sans_accent||let1==II_dot_accent) ) && (c->cg_flag&c_cg_cutr && c->nextl->cg_flag&c_cg_cutl || ((c->font|c->font_new)&c_fp_str) && c->nextl->col-(c->col+c->w)<=1 ) ) final_ii_u(c); if (language==LANG_GERMAN && memchr("0AOU",let,4) || language==LANG_SWEDISH && memchr("0AO",let,3) || language==LANG_SPANISH && let=='U' || language==LANG_ESTONIAN && memchr("0AOU",let,4) // 19.07.2001 E.P. ) { get_b_lines(c,&bl); if (bl.b1>c->row) final_AOU_2dot(c); } if (language==LANG_SWEDISH && c->vers[0].let=='A') { get_b_lines(c,&bl); if (bl.b1>c->row+MAX(4,bl.ps/4)) final_A_circle(c); } if (let=='-' && 3*c->h<c->w && (c->prev->flg&(c_f_fict|c_f_space) && c->prev->vers[0].let!=0x1e || memchr(".,:;",c->prev->vers[0].let,4)) && (c->next->flg&(c_f_fict|c_f_space) && c->next->vers[0].let!=0x1e || memchr(".,:;",c->next->vers[0].let,4))) c->vers[0].let='_'; if (let=='F' && c->cg_flag&c_cg_cutr && memchr(".,",c->next->vers[0].let,2) && c->next->cg_flag&c_cg_cutl && c->col+c->w>c->next->col) { clist[0]=c; clist[1]=c->next; compose_cell(2,clist,c); c->vers[0].let='E'; c->left=c->col; c->right=c->col+c->w; } if (memchr("Vv",let,2) && c->cg_flag&c_cg_cutr && c->next->vers[0].let==let && c->next->cg_flag&c_cg_cutl) final_vv_w(c); if (let=='d' && c->vers[0].prob>=PROBD && memchr("cistx",c->next->vers[0].let,5) && c->next->vers[0].prob<=PROBB && c->next->col-(c->col+c->w)<=1) final_d_chck(c); if (let==0x27 && c->cg_flag&c_cg_cutr && memchr("Il",c->next->vers[0].let,2) && c->next->cg_flag&c_cg_cutl) { c=c->next; // AL 940321 final_Il_1(c); cnt++; } if (let=='7' && c->cg_flag&c_cg_cutr && c->next->vers[0].let==0x27 && c->next->cg_flag&c_cg_cutl) {final_7_T(c); cnt++;} } if (cnt) { delspace(); space_size((int16_t)get_size()); space_cell(); context_proc_line(); cont_space(); } }
// // incline is TABLE, shave - enable shaving // not use for back rotating // cell * erect_cell_table (cell *c, int16_t tab_angle[], int16_t shave, Bool cutting) { int16_t dx=c->w, dy=c->h, le, ri ; int16_t lminx, lminsx, lminy, lminsy ; MN *sh_mn ; cell *sh_cell[MAX_CELLS_IN_LIST+1],res_cell ; puchar raster ; uchar sh_raster[1024] ; int16_t i, d_x, n, inc ; cell *cret = c ; if( !c->env ) return c; le = ri = 0; for (i=0; i<dy; i++) tab_angle[i] >>= 2; inc = (tab_angle[0] != tab_angle[dy-1]); if( shave || inc) { raster = save_raster (c); le = diff_left_limit_rast(raster,dx,dy,tab_angle); d_x = shift_raster (raster, dy, dx, tab_angle, (int16_t)(MAX (tab_angle[0], tab_angle[dy-1])), sh_raster, 1); if( (sh_mn = c_locomp (sh_raster, (int16_t)bytlen(d_x), dy, 0, 0))==NULL ) return NULL; for(i=0; sh_mn && i<MAX_CELLS_IN_LIST; i++, sh_mn = sh_mn->mnnext) { if( (sh_cell[i]=create_cell (sh_mn, c, c->bdiff, (char)(c->difflg&0xf0)))==NULL ) return NULL; sh_cell[i]->stick_inc = NO_INCLINE; // rotate disabled } sh_cell[i] = NULL; n = i; for(lminx=lminy=c->w,i=0;i<n;i++) { if( lminx>sh_cell[i]->env->left ) lminx=sh_cell[i]->env->left; if( lminy>sh_cell[i]->env->upper ) lminy=sh_cell[i]->env->upper; } for(i=0;i<n;i++) pimpleshave( sh_cell[i], shave, inc ); for(lminsx=lminsy=c->w,i=0;i<n;i++) { if( lminsx>sh_cell[i]->env->left ) lminsx=sh_cell[i]->env->left; if( lminsy>sh_cell[i]->env->upper ) lminsy=sh_cell[i]->env->upper; } memcpy( &res_cell, c , sizeof(cell)); compose_cell(n, sh_cell, &res_cell); if( n<2 ) c->cg_flag &= 0xFB ; // clear compose flag for normal comp else c->cg_flag |= c_cg_comp ; // set composed flag c->env = res_cell.env ; c->env->upper = c->r_row ; c->env->left = c->r_col ; if( n>1 || c->dens==255 ) c->dens = 255 ; // undef else { int32_t dens = calc_dens(c); c->dens = (dens*32)/(res_cell.w*res_cell.h); } c->w = res_cell.w ; c->h = res_cell.h ; c->recsource = 0 ; // artifact if( lminsx>lminx ) { lminsx -= lminx; c->env->left += lminsx; c->col += lminsx; c->r_col += lminsx; } if( lminsy>lminy ) { lminsy -= lminy; c->env->upper += lminsy; c->row += lminsy; c->r_row += lminsy; } if( c->flg!=c_f_dust && c->w<MAX_DUST_WIDTH && c->h<MAX_DUST_HEIGHT ) { cell *wc; c->flg = c_f_dust; c->nvers = 0; c->vers[0].let=c->vers[0].prob=0; (wc=c->prevl)->nextl = c->nextl; c->nextl->prevl = c->prevl; err_pnlet(c); } if( le<0 && c->col+le>=0 && c->r_col+le>=0 && c->env->left+le>=0 ) { c->env->left += le; c->col += le; c->r_col += le; } c->pos_inc=erect_rot; if( n>1 && cutting) cret = convert_to_cells(c); } return cret; }
// // incline is VALUE, shave - enable shaving // use for back rotating too // cell * erect_cell_value (cell *c, int16_t inc, int16_t shave, Bool cutting) { int16_t dx=c->w, dy=c->h, le, ri, sinc=inc ; int16_t lminx, lminsx, lminy, lminsy ; MN *sh_mn ; cell *sh_cell[MAX_CELLS_IN_LIST+1],res_cell ; puchar raster ; uchar sh_raster[1024*2] ; int16_t i, d_x, n ; int16_t tab_angle[256] ; cell *cret = c ; if ( dy >= 256 ) dy = 255; //AK! add for crash steck protection if( !c->env ) return c; if( c->flg&c_f_dust) shave = 0; // dust can't shave ri = le = 0; if( ((long)(dy-1)*abs(inc))<2048 ) inc=0; if( inc!=0 ) for (i=0; ( i < dy ) && ( i < 256 ); i++) //AK add c/g 06.03.98 tab_angle[i] = ((long)(dy-1-i)*inc)/2048; else memset(tab_angle,0,dy*2); if( shave || inc ) { // если слишком мал буфер - уходим // иначе возможен вылет и т.п. Nick 07.04.2002 if( (long)dy * ( (dx + (long)(MAX (abs(tab_angle[0]), abs(tab_angle[dy-1]))+7))>>3) > sizeof(sh_raster) ) return c; raster = save_raster (c); le = diff_left_limit_rast(raster,dx,dy,tab_angle); if( inc<0 ) // inc<0 - clear rotating ri = diff_left_limit_cell(c, tab_angle, c->w); d_x = shift_raster (raster, dy, dx, tab_angle, (int16_t)(MAX (abs(tab_angle[0]), abs(tab_angle[dy-1]))), sh_raster, inc); /* if( line_number == 16 && c->col == 462) { char qq[64]; MessageBox(GetActiveWindow(),itoa(dx,qq,10),"old",MB_OK); MessageBox(GetActiveWindow(),itoa(dy,qq,10),"dy",MB_OK); MessageBox(GetActiveWindow(),itoa(inc,qq,10),"inc",MB_OK); MessageBox(GetActiveWindow(),itoa(d_x,qq,10),"new",MB_OK); } */ if( (sh_mn = c_locomp (sh_raster, (int16_t)bytlen(d_x), dy, 0, 0))==NULL ) return c; for(i=0; sh_mn && i<MAX_CELLS_IN_LIST; i++, sh_mn = sh_mn->mnnext) { if( (sh_cell[i]=create_cell (sh_mn, c, c->bdiff, (char)(c->difflg&0xf0)))==NULL ) return c; if( sh_cell[i]->w>RASTER_MAX_WIDTH || sh_cell[i]->h>RASTER_MAX_HEIGHT || !sh_cell[i]->env ) { for(;i>=0;i--) del_cell(sh_cell[i]); return c; } sh_cell[i]->stick_inc = NO_INCLINE; // rotate disabled } sh_cell[i] = NULL; n=i; for(lminx=lminy=c->w,i=0;i<n;i++) { if( lminx>sh_cell[i]->env->left ) lminx=sh_cell[i]->env->left; if( lminy>sh_cell[i]->env->upper ) lminy=sh_cell[i]->env->upper; } for(i=0;i<n;i++) pimpleshave( sh_cell[i], shave, inc ); for(lminsx=lminsy=c->w,i=0;i<n;i++) { if( lminsx>sh_cell[i]->env->left ) lminsx=sh_cell[i]->env->left; if( lminsy>sh_cell[i]->env->upper ) lminsy=sh_cell[i]->env->upper; } memcpy( &res_cell, c , sizeof(cell)); compose_cell(n, sh_cell, &res_cell); if( n<2 ) c->cg_flag &= 0xFB ; // clear compose flag for normal comp else c->cg_flag |= c_cg_comp ; // set composed flag c->env = res_cell.env ; c->env->upper = c->r_row ; c->env->left = c->r_col ; if( n>1 || c->dens==255 ) c->dens = 255 ; // undef else { int32_t dens = calc_dens(c); c->dens = (dens*32)/(res_cell.w*res_cell.h); } c->w = res_cell.w ; c->h = res_cell.h ; c->recsource = 0 ; // artifact if( le<0 && c->col+le>=0 && c->r_col+le>=0 && c->env->left+le>=0 ) { c->env->left += le; c->col += le; c->r_col += le; } if( ri>0 ) { c->env->left += ri; c->col += ri; c->r_col += ri; } if( lminsx>lminx ) { lminsx -= lminx; c->env->left += lminsx; c->col += lminsx; c->r_col += lminsx; } if( lminsy>lminy ) { lminsy -= lminy; c->env->upper += lminsy; c->row += lminsy; c->r_row += lminsy; } if( (c->flg&(c_f_bad|c_f_let)) && c->w<MAX_DUST_WIDTH && c->h<MAX_DUST_HEIGHT ) { cell *wc; c->flg = c_f_dust; c->nvers = 0; c->vers[0].let=c->vers[0].prob=0; (wc=c->prevl)->nextl = c->nextl; c->nextl->prevl = c->prevl; err_pnlet(c); } if( !(inc==0 && shave!=0) ) // not shaving without erection c->stick_inc = inc; if( inc!=0 ) c->pos_inc=erect_rot; if( n>1 && cutting) cret = convert_to_cells(c); } // Nick 7.04.2002 c->cret - с может быть удален в convert_to_cells! if( !inc && (cret->flg&c_f_dust) ) { cret->stick_inc = sinc; cret->pos_inc=erect_rot; } return cret; }