void serbian_J2j(void) { B_LINES my_bases; cell *c,*e; int16_t n; char bb[90]; get_b_lines(NULL,&my_bases); for(c=cell_f()->nextl,e=cell_l();c!=e;c=c->nextl) if( (c->flg&c_f_let) && c->nvers && c->w*3<=c->h && (c->vers[0].let=='J' || memchr("[]!",c->vers[0].let,3)&& c->row<(my_bases.b2 + my_bases.b1)/2&& c->row+c->h>(my_bases.b3 + my_bases.b4)/2) ) { if( (n=geom_neck((int16_t)(my_bases.b2 - my_bases.b1),c))!=0 ) { if( db_status && snap_activity('c') ) { sprintf (bb,"serbian reverse J-->>j. bs= %d %d (%d). find neck on %d", my_bases.b1, my_bases.b2, my_bases.b2 - my_bases.b1, n); snap_show_text(bb); snap_monitor(); } c->vers[0].let='j'; } if( c->nvers && c->vers[0].let=='j' && check_let(c, '/') ) del_version( c,'/'); } return; }
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; } }
uchar erection_one_incline_word(cell *b, cell *e) { Bool inc ; B_LINES bl ; if( !setup_incline_word(b,e, FALSE) ) // without statistic making { if( db_status && snap_activity('i') ) { snap_show_text("ERECT : No erection images"); snap_monitor(); } clear_incline_word(b,e); return 0; } get_b_lines(b,&bl); inc = erection_incline_word_set(b, e); return (uchar)inc; }
int16_t Alik_define_cut_points( pchar raster_frag, struct own_cut *ans, int16_t dx, /* рабочая ширина растра */ int16_t dy, /* рабочая высота растра */ int16_t row ) { int16_t hor_byte, ver_byte, nshort, CP, i, j, bl_up, bl_dw, tret_h; pint16_t penalty, cut_points, adr_cut_points, my_penalty; pchar adrw, adrw_two, product, product_two, trace, adr_raster, stek, adr_ras_two, SourceRaster; puchar IntBuf, CountCut, UpBlackPoint; struct own_cut *ans_ptr; #ifdef AlikBl char snap[380], *buf = snap; #endif Z = Z; bl_up = bbs2; bl_dw = bbs3; adr_cut_points = (pint16_t)RCUTP_ForRaster3; ans_ptr = ans; hor_byte = (dx + 7) >> 3; ver_byte = (dy + 7) >> 3; CP = ver_byte * dx; i = hor_byte * dy; tret_h = (dy << 1) / 3; adr_raster = (pchar)RCUTP_MemForCutPoints; /* под исходный транспонированный растр */ adrw = adr_raster + CP; /* под обработанный транспонированный растр */ trace = adrw + (CP > i ? CP : i); /* под обход */ penalty = (pint16_t)trace + dx; /* под штрафы */ product = (pchar)(penalty + dx); /* под произведения последовательных столбцов */ cut_points = (pint16_t)(product + dx); /* под точки разрезания */ adrw_two = (pchar)RCUTP_MemForCutPointsTwo; adr_ras_two = adrw_two + (CP > i ? CP : i); product_two = adr_ras_two + (CP > i ? CP : i); /* под произведения последовательных столбцов слева и справа*/ UpBlackPoint = (puchar)(product_two + dx); CountCut = (puchar)(UpBlackPoint + dx); SourceRaster = (pchar)(CountCut + dx); my_penalty = (pint16_t)(SourceRaster + (CP > i ? CP : i)); IntBuf = (puchar)(my_penalty + dx); CP = (dx < 3 || dy < 3) ? 0 : 1; /* резать не будем, если растр мал по одному из направлений */ if (CP) { memcpy(SourceRaster, raster_frag, hor_byte*dy); memset((puchar)adr_cut_points, 0, R_S); memset(CountCut, 0, dx); Alik_tr_bit_matr(ver_byte, dy, raster_frag, adr_raster, hor_byte, dx); /* транспонирование исходного растра */ memset((pint16_t)trace, 0, sizeof(int16_t)*dx); /* зануление двух байтовых массивов */ memset(penalty, 0, sizeof(int16_t)*dx); /* зануление массива штрафов */ CP = Alik_del_detail(raster_frag, dx, (int16_t)(dy * hor_byte), penalty); if (!CP && dx > 20 && dx <= 128) CP = 1; //10-09-96 03:24pm Alik cten33.tif if (!CP) { /* растр распался */ memset(penalty, 0, sizeof(int16_t)*dx); /* зануление массива штрафов */ memcpy(adr_raster, adrw, ver_byte*dx); } else Alik_tr_bit_matr(ver_byte, dy, raster_frag, adrw, hor_byte, dx); /* транспонирование битовой матрицы */ if (CP) CP = Alik_search_bound_point_in_raster(adrw, ver_byte, dx); if (CP) { /* растр непуст */ Alik_form_bound(adrw, dx, dy, ver_byte, trace, 0); memcpy(adr_ras_two, adrw, ver_byte*dx); memcpy(adrw_two, adrw, ver_byte*dx); memcpy(my_penalty, penalty, sizeof(int16_t)*dx); Alik_CountCut(adrw, dy, dx, CountCut, IntBuf); Alik_UpBlackPoint(adrw, dy, dx, UpBlackPoint); Alik_cut_short(adrw, adrw_two, dx, ver_byte, product, penalty, cut_points, product_two); nshort = *cut_points; Alik_cut_hole(trace, dx, cut_points, nshort, dy, product, penalty, 0x00); Alik_del_equal_hole(cut_points, product, (pint16_t)penalty, dx, dy, nshort); #ifdef AlikBl if ( db_status && snap_activity('j') && snap_activity('a')) Alik_snap_show_raster(raster_frag, SourceRaster, "raster mode", dy, dx, product, product_two, penalty); #endif if (language == LANGUAGE_RUSSIAN) Alik_find_brus(raster_frag, SourceRaster, adr_ras_two, (int16_t)(bl_dw - bl_up), dy, dx, product, product_two, penalty, cut_points, CountCut, UpBlackPoint); #ifdef AlikBl buf = snap; buf += sprintf(buf, "bl_up=%2d,bl_dw=%2d ", bl_up, bl_dw); #endif Alik_my_correct_base_lines(&bl_up, &bl_dw, dy, dx, row, (puchar)adr_ras_two, (uint16_t*)penalty, IntBuf); #ifdef AlikBl buf += sprintf(buf, "bl_up=%2d,bl_dw=%2d ", bl_up, bl_dw); #endif Alik_correct_base_lines(trace, dx, dy, &bl_up, &bl_dw); #ifdef AlikBl buf += sprintf(buf, "bl_up=%2d,bl_dw=%2d \n", bl_up, bl_dw); //,up_position); // Bound buf += sprintf(buf, "bbs1=%2d, bbs2=%2d, bbs3=%2d, bbs4=%2d, minrow=%2d, row=%2d \n", bbs1, bbs2, bbs3, bbs4, minrow, row); buf += sprintf(buf, "Nb1=%2d, Nb2=%2d, Nb3=%2d, Nb4=%2d, up=%2d, dw=%2d", Nb1, Nb2, Nb3, Nb4, up_position, dw_position); if ( db_status && snap_activity('j')) Alik_snap_show_raster(raster_frag, SourceRaster, snap, dy, dx, product, product_two, penalty); #endif if (bl_up >= 0 && bl_dw <= dy) { Alik_double_serif(cut_points, trace, product, dx, dy, bl_up, bl_dw, penalty, (puchar)adr_ras_two, IntBuf); Alik_cut_d(trace + dx, cut_points, product, dx, dy, bl_up, bl_dw, (pchar)penalty); Alik_defis(trace, cut_points, dx, dy, bl_up, bl_dw, penalty); if (language == LANGUAGE_ENGLISH) Alik_cut_l(cut_points, trace, dx, bl_dw, penalty); } if (language == LANGUAGE_RUSSIAN) Alik_cut_y(raster_frag, SourceRaster, adr_ras_two, dy, dx, cut_points, IntBuf, row, product, product_two, penalty, CountCut); if (language == LANGUAGE_RUSSIAN) Alik_rus_bad_c(raster_frag, SourceRaster, dy, dx, product, product_two, penalty, cut_points, CountCut, UpBlackPoint); Alik_del_equal(cut_points); Alik_del_3_cut(adrw, cut_points, nshort, ver_byte, dx, CountCut); if (abs((row + dy) - (minrow + bbs3)) > 3) Alik_del_p_cut(adrw, cut_points, dx, dy, nshort, (char)(bl_dw - bl_up - 3)); if (language == LANGUAGE_RUSSIAN) Alik_Check_Rus_D(raster_frag, SourceRaster, dy, dx, cut_points, IntBuf, row, product, product_two, penalty, CountCut); Alik_del_equal(cut_points); CP = *cut_points; if (CP) { CP = Alik_sort(cut_points, (pint16_t)adr_cut_points, dx); if (CP) CP = Alik_del_doubl_cut((pint16_t)adr_cut_points, product, penalty, CP); } CP = MIN(STK_H - 2, CP); } if (!CP) Alik_tr_bit_matr(hor_byte, dx, adr_raster, raster_frag, ver_byte, dy); if (CP) { Alik_cor_pnt((pint16_t)adr_cut_points, penalty, cut_points, CP, dx, dy, ver_byte, (pchar)adrw, (pchar)trace); Alik_form_bound(adr_raster, dx, dy, ver_byte, trace, 1); stek = (pchar)(penalty + ((CP + 1) << 2) - (CP + 1)); /* переписываем фрагменты трассы обхода */ cut_points = penalty + 3 * (CP - 1) + 1; for (j = CP; j > 0; j--, cut_points -= 4, stek++) { *stek = (char) * cut_points++; if (*stek) (*stek)--; *++stek = dy - *cut_points; if (*stek) (*stek)--; } trace = (pchar)(penalty + ((CP + 1) << 2) - (CP + 1)); for (j = CP - 1, i = 0; j >= 0; j--, i += 2) { ans_ptr->x = (char) * ((pint16_t)adr_cut_points + j); ans_ptr->h = dy - *(trace + i); ans_ptr->dh = dy + 1 - *(trace + i + 1) - *(trace + i); ans_ptr->dh = (char)MIN(ans_ptr->dh, dy); ans_ptr->dh = MIN(ans_ptr->dh, ans_ptr->h); if (ans_ptr->dh < tret_h) ans_ptr->var = 1; else ans_ptr->var = 8; ans_ptr++; } ans_ptr->x = 127; qsort((void *)(ans), CP, sizeof(struct own_cut), Alik_sort_function); Alik_set_method_for_cut_points(ans, dy, dx, CountCut); Alik_cor_height_and_var(CP, ans, my_penalty, dx, dy); Alik_new_points(&CP, ans, ans_ptr, dy, dx, my_penalty, product); //AK! posible stack crash there when ans pointed to last vector element! qsort((void *)(ans), CP, sizeof(struct own_cut), Alik_sort_function); } } return CP; }
int16_t Alik_define_cut_points( pchar raster_frag, struct own_cut *ans, int16_t dx, /* ࠡ��� �ਭ� ���� */ int16_t dy, /* ࠡ��� ���� ���� */ int16_t row ) { int16_t hor_byte,ver_byte,nshort,CP,i,j,bl_up,bl_dw,tret_h; pint16_t penalty,cut_points,adr_cut_points,my_penalty; pchar adrw,adrw_two,product,product_two,trace,adr_raster,stek,adr_ras_two, SourceRaster; puchar IntBuf,CountCut,UpBlackPoint; struct own_cut *ans_ptr; #ifdef AlikBl char snap[380],*buf=snap; #endif Z=Z; bl_up=bbs2; bl_dw=bbs3; adr_cut_points=(pint16_t)ForRaster3; ans_ptr=ans; hor_byte=(dx+7)>>3; ver_byte=(dy+7)>>3; CP=ver_byte*dx; i=hor_byte*dy; tret_h = (dy<<1)/3; adr_raster=(pchar)MemForCutPoints; /* ��� ��室�� �࠭ᯮ������ ���� */ adrw=adr_raster+CP; /* ��� ��ࠡ�⠭�� �࠭ᯮ������ ���� */ trace=adrw+(CP>i?CP:i); /* ��� ��室 */ penalty=(pint16_t)trace+dx; /* ��� ����� */ product=(pchar)(penalty+dx); /* ��� �ந�������� ������⥫��� �⮫�殢 */ cut_points=(pint16_t)(product+dx); /* ��� �窨 ࠧ१���� */ adrw_two=(pchar)MemForCutPointsTwo; adr_ras_two = adrw_two+(CP>i?CP:i); product_two = adr_ras_two+(CP>i?CP:i); /* ��� �ந�������� ������⥫��� �⮫�殢 �� � �ࠢ�*/ UpBlackPoint= (puchar)(product_two+dx); CountCut = (puchar)(UpBlackPoint+dx); SourceRaster= (pchar)(CountCut+dx); my_penalty = (pint16_t)(SourceRaster+(CP>i?CP:i)); IntBuf = (puchar)(my_penalty+dx); CP = (dx<3||dy<3)? 0 : 1; /* १��� �� �㤥�, � ���� ��� �� ������ �� ���ࠢ����� */ if(CP) { memcpy(SourceRaster,raster_frag,hor_byte*dy); memset((puchar)adr_cut_points,0,R_S); memset(CountCut,0,dx); Alik_tr_bit_matr(ver_byte,dy,raster_frag,adr_raster,hor_byte,dx); /* �࠭ᯮ������ ��室���� ���� */ memset((pint16_t)trace,0,sizeof(int16_t)*dx); /* ���㫥��� ���� ���⮢�� ���ᨢ�� */ memset(penalty,0,sizeof(int16_t)*dx); /* ���㫥��� ���ᨢ� ���䮢 */ CP=Alik_del_detail(raster_frag,dx,(int16_t)(dy*hor_byte),penalty); if(!CP && dx>20 && dx<=128) CP=1; //10-09-96 03:24pm Alik cten33.tif if(!CP) /* ���� �ᯠ��� */ { memset(penalty,0,sizeof(int16_t)*dx); /* ���㫥��� ���ᨢ� ���䮢 */ memcpy(adr_raster,adrw,ver_byte*dx); } else Alik_tr_bit_matr(ver_byte,dy,raster_frag,adrw,hor_byte,dx); /* �࠭ᯮ������ ��⮢�� ������ */ if(CP) CP=Alik_search_bound_point_in_raster(adrw,ver_byte,dx); if(CP) /* ���� ������ */ { Alik_form_bound(adrw,dx,dy,ver_byte,trace,0); memcpy(adr_ras_two,adrw,ver_byte*dx); memcpy(adrw_two,adrw,ver_byte*dx); memcpy(my_penalty,penalty,sizeof(int16_t)*dx); Alik_CountCut(adrw,dy,dx,CountCut,IntBuf); Alik_UpBlackPoint(adrw,dy,dx,UpBlackPoint); Alik_cut_short(adrw,adrw_two,dx,ver_byte,product,penalty,cut_points,product_two); nshort=*cut_points; Alik_cut_hole(trace,dx,cut_points,nshort,dy,product,penalty,0x00); Alik_del_equal_hole(cut_points,product,(pint16_t)penalty,dx,dy,nshort); #ifdef AlikBl if( db_status && snap_activity('j') && snap_activity('a')) Alik_snap_show_raster(raster_frag,SourceRaster,"raster mode",dy,dx, product,product_two,penalty); #endif if(language==LANG_RUSSIAN) Alik_find_brus(raster_frag,SourceRaster,adr_ras_two,(int16_t)(bl_dw-bl_up),dy,dx, product,product_two,penalty,cut_points,CountCut, UpBlackPoint); #ifdef AlikBl buf=snap; buf+=sprintf(buf,"bl_up=%2d,bl_dw=%2d ",bl_up,bl_dw); #endif Alik_my_correct_base_lines(&bl_up,&bl_dw,dy,dx,row,(puchar)adr_ras_two, (PWORD)penalty,IntBuf); #ifdef AlikBl buf+=sprintf(buf,"bl_up=%2d,bl_dw=%2d ",bl_up,bl_dw); #endif Alik_correct_base_lines(trace,dx,dy,&bl_up,&bl_dw); #ifdef AlikBl buf+=sprintf(buf,"bl_up=%2d,bl_dw=%2d \n",bl_up,bl_dw); //,up_position); // Bound buf+=sprintf(buf,"bbs1=%2d, bbs2=%2d, bbs3=%2d, bbs4=%2d, minrow=%2d, row=%2d \n", bbs1,bbs2,bbs3,bbs4,minrow,row); buf+=sprintf(buf,"Nb1=%2d, Nb2=%2d, Nb3=%2d, Nb4=%2d, up=%2d, dw=%2d", Nb1,Nb2,Nb3,Nb4,up_position,dw_position); if( db_status && snap_activity('j')) Alik_snap_show_raster(raster_frag,SourceRaster,snap,dy,dx, product,product_two,penalty); #endif if(bl_up>=0 && bl_dw<=dy) { Alik_double_serif(cut_points,trace,product,dx,dy,bl_up,bl_dw,penalty, (puchar)adr_ras_two,IntBuf); Alik_cut_d(trace+dx,cut_points,product,dx,dy,bl_up,bl_dw,(pchar)penalty); Alik_defis(trace,cut_points,dx,dy,bl_up,bl_dw,penalty); if(language==LANG_ENGLISH) Alik_cut_l(cut_points,trace,dx,bl_dw,penalty); } if(language==LANG_RUSSIAN) Alik_cut_y(raster_frag,SourceRaster,adr_ras_two,dy,dx,cut_points, IntBuf,row,product,product_two,penalty,CountCut); if(language==LANG_RUSSIAN) Alik_rus_bad_c(raster_frag,SourceRaster,dy,dx,product,product_two, penalty,cut_points,CountCut,UpBlackPoint); Alik_del_equal(cut_points); Alik_del_3_cut(adrw,cut_points,nshort,ver_byte,dx,CountCut); if(abs((row+dy)-(minrow+bbs3))>3) Alik_del_p_cut(adrw,cut_points,dx,dy,nshort,(char)(bl_dw-bl_up-3)); if(language==LANG_RUSSIAN) Alik_Check_Rus_D(raster_frag,SourceRaster,dy,dx,cut_points,IntBuf,row, product,product_two,penalty,CountCut); Alik_del_equal(cut_points); CP=*cut_points; if(CP) { CP=Alik_sort(cut_points,(pint16_t)adr_cut_points,dx); if(CP) CP=Alik_del_doubl_cut((pint16_t)adr_cut_points,product,penalty,CP); } CP=MIN(STK_H-2,CP); } if (!CP) Alik_tr_bit_matr(hor_byte,dx,adr_raster,raster_frag,ver_byte,dy); if(CP) { Alik_cor_pnt((pint16_t)adr_cut_points,penalty,cut_points,CP,dx,dy,ver_byte,(pchar)adrw,(pchar)trace); Alik_form_bound(adr_raster,dx,dy,ver_byte,trace,1); stek=(pchar)(penalty+((CP+1)<<2)-(CP+1)); /* ��९��뢠�� �ࠣ����� ����� ��室� */ cut_points=penalty+3*(CP-1)+1; for (j=CP; j>0; j--, cut_points-=4,stek++) { *stek=(char)*cut_points++; if (*stek) (*stek)--; *++stek=dy-*cut_points; if (*stek) (*stek)--; } trace=(pchar)(penalty+((CP+1)<<2)-(CP+1)); for(j=CP-1,i=0; j>=0; j--,i+=2) { ans_ptr->x = (char)*((pint16_t)adr_cut_points+j); ans_ptr->h = dy - *(trace+i); ans_ptr->dh = dy+1 - *(trace+i+1)-*(trace+i); ans_ptr->dh = (char)MIN(ans_ptr->dh,dy); ans_ptr->dh = MIN(ans_ptr->dh,ans_ptr->h); if (ans_ptr->dh < tret_h) ans_ptr->var=1; else ans_ptr->var=8; ans_ptr++; } ans_ptr->x=127; qsort((void *)(ans),CP,sizeof(struct own_cut),Alik_sort_function); Alik_set_method_for_cut_points(ans,dy,dx,CountCut); Alik_cor_height_and_var(CP,ans,my_penalty,dx,dy); Alik_new_points(&CP,ans,ans_ptr,dy,dx,my_penalty,product); //AK! posible stack crash there when ans pointed to last vector element! qsort((void *)(ans),CP,sizeof(struct own_cut),Alik_sort_function); } } return CP; }
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*/
void save_alphabet_information_pass2(str_info *str,int16_t column,CSTR_line ln) { uchar buf[256]={0}; if( db_status && snap_activity('n') ) { snap_show_text("DIG : start selection"); snap_monitor(); } //str[column].all++; /* fs.nStyle = LS_PRINT; buf['0']=buf['1']=buf['2']=buf['3']=buf['4']= buf['5']=buf['6']=buf['7']=buf['8']=buf['9']=1; memcpy(fs.AlphaTable,buf,256); #ifdef _USE_LEO_ LEOSetupField(&fs); for(c=cell_f()->nextl;c!=cell_l();c=c->nextl) { if( c->nvers==0 && c->w*2>c->h && c->h*2>c->w ) { puchar wr; // to work_rst wr=save_raster_align8(c); // rst -->> rrst rrst.lnPixHeight = c->h; rrst.lnPixWidth = c->w; rrst.lnRasterBufSize = REC_MAX_RASTER_SIZE; memcpy(rrst.Raster,wr,((c->w+63)/64)*8*c->h); memcpy(&ro.recData.recRaster,&rrst,REC_MAX_RASTER_SIZE); LEORecogPrnMethod( &ro , REC_METHOD_3X5, 1); memcpy(&ver,&ro.recResults,sizeof(ver)); if( ver.lnAltCnt && ver.Alt[0].Prob>220 ) { c->nvers=1; c->vers[0].let=ver.Alt[0].Code; c->vers[0].prob=ver.Alt[0].Prob; c->vers[1].let=0; c->flg=c_f_let; } } } #endif */ setup_digital_mode_pass2(&str[column], 1); if( digital_mode==2 ) { str[column].dig++; if( db_status && snap_activity('n') ) { sprintf(buf,"DIG : digital str, col %d, all %d, dig %d, plus_minus %d" , column, str[column].all,str[column].dig,str[column].pm); snap_show_text(buf); snap_monitor(); } } return; }
void save_alphabet_information(str_info *str,int16_t column,CSTR_line ln) { uchar buf[256]={0}; cell * c; RecObject ro={0}; CSTR_rast rst; RecRaster rrst; RecVersions ver; LeoFieldSetup fs={0}; CSTR_attr lattr; CSTR_rast_attr attr; UniVersions uvs; if( db_status && snap_activity('n') ) { snap_show_text("DIG : start selection"); snap_monitor(); } str[column].all++; fs.nStyle = LS_PRINT; buf['0']=buf['1']=buf['2']=buf['3']=buf['4']= buf['5']=buf['6']=buf['7']=buf['8']=buf['9']=1; memcpy(fs.AlphaTable,buf,256); #ifdef _USE_LEO_ LEOSetupField(&fs); for(c=cell_f()->nextl;c!=cell_l();c=c->nextl) { if( c->nvers==0 && c->w*2>c->h && c->h*2>c->w ) { puchar wr; // to work_rst wr=save_raster_align8(c); // rst -->> rrst rrst.lnPixHeight = c->h; rrst.lnPixWidth = c->w; rrst.lnRasterBufSize = REC_MAX_RASTER_SIZE; memcpy(rrst.Raster,wr,((c->w+63)/64)*8*c->h); memcpy(&ro.recData.recRaster,&rrst,REC_MAX_RASTER_SIZE); LEORecogPrnMethod( &ro , REC_METHOD_3X5, 1); memcpy(&ver,&ro.recResults,sizeof(ver)); if( ver.lnAltCnt && ver.Alt[0].Prob>220 ) { c->nvers=1; c->vers[0].let=ver.Alt[0].Code; c->vers[0].prob=ver.Alt[0].Prob; c->vers[1].let=0; c->flg=c_f_let; } } } #endif setup_digital_mode(&str[column], 1); for(c=cell_f()->next;c!=cell_l();c=c->next) if( c->nvers>0 && c->vers[0].let=='$' && c->vers[0].prob>220 ) { str[column].dollars++; break; } if( digital_mode==2 ) { str[column].dig++; if( db_status && snap_activity('n') ) { sprintf(buf,"DIG : digital str, col %d, all %d, dig %d, plus_minus %d" , column, str[column].all,str[column].dig,str[column].pm); snap_show_text(buf); snap_monitor(); } } else if( digital_mode==1 ) { str[column].fuzzy_dig++; if( db_status && snap_activity('n') ) { sprintf(buf,"DIG : fuzzy digital str, col %d, all %d, dig %d, plus_minus %d" , column, str[column].all,str[column].dig,str[column].pm); snap_show_text(buf); snap_monitor(); } } else { plusminus_mode=0; if( cell_f()->next && cell_f()->next==cell_l()->prev ) { c=cell_f()->next; rst=CSTR_GetNextRaster(CSTR_GetFirstRaster(ln),CSTR_f_bad|CSTR_f_let); if( rst && CSTR_GetImage(rst,(uchar *)&rrst,CSTR_TYPE_IMAGE_RS)) { if( c->w>c->h*5 || c->w>c->h*3 && c->env && c->env->nl == 1 // Nick 18.01.2002 ) { c->nvers=1; c->vers[0].let='-'; c->vers[0].prob=254; ver.Alt[0].Code='-'; ver.Alt[0].Prob=255; ver.lnAltCnt =1; CSTR_StoreCollection(rst,&ver); CSTR_GetAttr(rst,&attr); //attr.keg=Ps<<line_scale; CSTR_SetAttr(rst,&attr); CSTR_GetLineAttr(ln,&lattr); lattr.Flags |= CSTR_STR_ReadyResults ; CSTR_SetLineAttr(ln,&lattr); plusminus_mode=1; } else if( abs(c->w-c->h)<5 ) { #ifdef _USE_LEO_ fs.nStyle = LS_PRINT; buf['+']=1; memcpy(fs.AlphaTable,buf,256); LEOSetupField(&fs); memcpy(&ro.recData.recRaster,&rrst,REC_MAX_RASTER_SIZE); LEORecogPrnMethod( &ro , REC_METHOD_3X5, 1); memcpy(&ver,&ro.recResults,sizeof(ver)); if( ver.lnAltCnt && ver.Alt[0].Code=='+' && ver.Alt[0].Prob>220 ) { c->nvers=1; c->vers[0].let='+'; c->vers[0].prob=254; ver.lnAltCnt =1; CSTR_StoreCollection(rst,&ver); CSTR_GetAttr(rst,&attr); //attr.keg=Ps<<line_scale; CSTR_SetAttr(rst,&attr); CSTR_GetLineAttr(ln,&lattr); lattr.Flags |= CSTR_STR_ReadyResults ; CSTR_SetLineAttr(ln,&lattr); plusminus_mode=1; } #endif } } } if( plusminus_mode ) { str[column].pm++; rst=CSTR_GetNextRaster(CSTR_GetFirstRaster(ln),CSTR_f_bad|CSTR_f_let); CSTR_GetCollectionUni(rst,&uvs); if( uvs.lnAltCnt ) { uvs.Alt[0].Charset=CodePages[language]; CSTR_StoreCollectionUni(rst,&uvs); } if( db_status && snap_activity('n') ) { sprintf(buf,"DIG : plus_minus str , col %d, all %d, dig %d, plus_min %d" , column, str[column].all,str[column].dig,str[column].pm); snap_show_text(buf); snap_monitor(); } } else { if( db_status && snap_activity('n') ) { sprintf(buf,"DIG : unknown alphabet , col %d, all %d, dig %d, plus_min %d" , column, str[column].all,str[column].dig,str[column].pm); snap_show_text(buf); snap_monitor(); } } } return; }
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; }
// // main erection function : // find and erected incline words // uchar erection_incline_words(int16_t pass) { cell *c, *e, *tmp, *sc ; uchar buf[MAX_LEN_WORD+40] ; uchar wrd[MAX_LEN_WORD+40], word_len ; Bool inc, incline, no_res ; B_LINES bl ; #ifdef STEND_INC static char oldstr[256]="c:\\"; char str[256] ; static int16_t oldline=-1 ; FILE *fp ; static int16_t first=1 ; #endif int16_t av_inc=0, n_inc=0; local_pass=pass; if( !setup_incline_word(cell_f()->nextl,cell_l(), TRUE) ) { if( db_status && snap_activity('i') ) { snap_show_text("ERECT : No erection images"); snap_monitor(); } clear_incline_word(cell_f()->nextl,cell_l()); return 0; } if( db_status && snap_activity('i') ) { snap_show_text("ERECT : Begin erection words"); snap_monitor(); } c = cell_f() ; incline = FALSE ; while(1) { if( (c = erect_next_word(c))==NULL )break; no_res=1; inc =0; strcpy(buf,"ERECT : Word : "); get_b_lines(c,&bl); e = erect_end_word(c, wrd, &word_len, (int16_t)(bl.ps/2) ); strcpy(&buf[14],wrd); erect_page_words++; sc = snap_stopcell(c,e)?snap_get_stopcell():NULL; tmp = c->prev; inc = erection_incline_word(c, e, bl.b3, 0); if( inc && !local_pass ) { incline = 1; av_inc+=inc; n_inc++; erect_page_incline[inc/16]++; } #ifdef STEND_INC if( inc && !(db_status && snap_activity('i')) ) { set_page_name(str); if( strcmp(str, oldstr) ) { strcpy(oldstr, str); fp = fopen("erection.txt",first?"wt":"at"); if( fp==NULL ) fp = fopen("erection.txt","wt"); if( first) first=0; fprintf(fp,"\nfile : %s", str); fclose(fp); } if( oldline!=line_number) { oldline=line_number; fp = fopen("erection.txt","at"); fprintf(fp,"\nline %d : ", line_number+1); fclose(fp); } sprintf(wrd,"(%d)",inc); no_res=0; strcat(buf,wrd) ; fp = fopen("erection.txt","at"); fprintf(fp," %s ", &buf[14]); fclose(fp); } #endif if( db_status && snap_activity('i') ) { if( inc || sc ) { if( inc ) sprintf(wrd,"(%d)",inc); else sprintf(wrd,"(no erection)"); if( no_res ) strcat(buf,wrd) ; snap_newcell(sc?sc:tmp->next) ; snap_show_text(buf) ; snap_monitor() ; } } if( e==NULL ) break; c = e; } if( n_inc ) erection_inc = av_inc / n_inc; clear_incline_word(cell_f()->nextl,cell_l()); if( db_status && snap_activity('i') ) { snap_show_text("ERECT : End erection words "); snap_monitor(); } return(uchar) incline ; }