int16_t cut_by_pos_ii(s_glue * const gl,uchar let) { B_LINES bl; int16_t pen=0,upper=32000,dis,i; get_b_lines(gl->celist[0],&bl); for(i=0; i < gl->ncell; i++) upper = MIN(upper,gl->celist[i]->row); if(let==(uchar)'\xa9' /* й */ && !is_russian_turkish_conflict(let) // 21.05.2002 E.P. ) { if((dis=upper-bl.b2) <= 0) { // letter upper than bbs2 dis = abs(dis); if(dis < 5) pen = iot_pen_lc[dis]; } else pen = 160; // letter lower than bbs2 if( gl->ncell==1 && (gl->celist[0]->recsource == c_rs_ev || gl->celist[0]->recsource == (c_rs_ev|c_rs_deskr) ))// events brought vers if((Ns1+Ns2)>0 && bl.b2-bl.b1>6) { dis=upper-bl.b1; pen += dis<3 ? 60 : 0; } } if(let==(uchar)'\x89' /* Й */) { // Capital iot if((dis=upper-bl.b1) <= 0 ) { // letter upper than bbs1 dis = abs(dis); if(dis < 5) pen = iot_pen_uc[dis]; } else pen = 160; // letter lower than bbs1 } return pen; }
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; }
static int16_t final_slash_l(cell *c) { int16_t i; uchar fnt; get_b_lines(c,&bl); if (c->row+c->h>=bl.b3+MIN(3,MAX(1,c->h/10))) return 0; if ((c->flg & (c_f_let|c_f_bad)) == 0) return 0; // AL 940318 if (c->flg & c_f_dust) return 0; // AL 940318 if ((fnt=c->prevl->font|c->nextl->font)&c_fp_ser && !(fnt&c_fp_gelv)) return 0; c->nvers-=MAX(0,c->nvers-(VERS_IN_CELL-4)); c->vers[c->nvers].let='l'; c->vers[c->nvers+1].let='I'; c->vers[c->nvers+2].let='1'; c->vers[c->nvers].prob=c->vers[c->nvers+1].prob=c->vers[c->nvers+2].prob= c->vers[0].prob; for (i=0; i<c->nvers; i++) if (memchr("lI1",c->vers[i].let,3)) c->vers[i].prob=0; c->nvers+=3; c->vers[c->nvers].let=0; if (c->env!=NULL && !is_slash(c)) c->vers[0].prob=MAX(2,c->vers[0].prob-50); sort_vers(c); return 1; }
static void final_dotcom(cell *c) { get_b_lines(c,&bl); if (c->row+c->h-bl.b3>=2) c->vers[0].let=','; }
static void final_ao_gpq(cell *c) { uchar let; int16_t nvers,i; if (c->vers[0].prob<=DAO) return; get_b_lines(c,&bl); if (c->row+c->h-bl.b3>=2) { if ((let=c->vers[0].let)=='a') { c->vers[2].let='a'; c->vers[2].prob=c->vers[0].prob-DAO; nvers=3; if (c->nvers>=2 && c->vers[1].let=='o' && c->vers[1].prob>DAO) {c->vers[3].let='o'; c->vers[3].prob=c->vers[1].prob-DAO; nvers++;} c->vers[0].let='g'; c->vers[1].let='q'; c->vers[1].prob=c->vers[0].prob; } else { nvers=3; i=1; if (c->nvers>=2 && c->vers[1].let=='o') { nvers=4; if (c->vers[1].prob>=c->vers[0].prob-DAO) i=2; else {c->vers[3].let=c->vers[1].let; c->vers[3].prob=c->vers[1].prob;} } c->vers[i].let='g'; c->vers[i+1].let='q'; c->vers[i].prob=c->vers[i+1].prob=c->vers[0].prob-DAO; } } else { if (c->row+c->h-bl.b3>=2) { c->vers[3].let='o'; c->vers[3].prob=c->vers[0].prob-DAO; nvers=4; if (c->nvers>=2 && c->vers[1].let=='a' && c->vers[1].prob>DAO) {c->vers[4].let='a'; c->vers[4].prob=c->vers[1].prob-DAO; nvers++;} c->vers[0].let='g'; c->vers[1].let='p'; c->vers[2].let='q'; c->vers[1].prob=c->vers[2].prob=c->vers[0].prob; } else { nvers=4; i=1; if (c->nvers>=2 && c->vers[1].let=='a') { nvers=5; if (c->vers[1].prob>=c->vers[0].prob-DAO) i=2; else {c->vers[4].let=c->vers[1].let; c->vers[4].prob=c->vers[1].prob;} } c->vers[i].let='g'; c->vers[i+1].let='p'; c->vers[i+2].let='q'; c->vers[i].prob=c->vers[i+1].prob=c->vers[i+2].prob=c->vers[0].prob-DAO; } } c->vers[nvers].let=0; c->nvers=nvers; }
static void final_vy(cell *c) { if (c->vers[0].prob<=DVY) return; get_b_lines(c,&bl); if (c->row+c->h-bl.b3>=2) {c->vers[0].let='y'; c->vers[1].let='v';} else c->vers[1].let='y'; c->vers[1].prob=c->vers[0].prob-DVY; c->vers[2].let=0; c->nvers=2; }
static int16_t final_back_slash(cell *c) { get_b_lines(c,&bl); if (c->row>bl.b1+2 || c->row+c->h<bl.b3 || c->env==NULL || c->env->nl!=1 || !is_back_slash(c)) return 0; c->nvers=1; c->vers[0].let='\\'; c->vers[0].prob=254; c->vers[1].let=0; return 1; }
void erection_delete_seq(cell *b,cell *e) { cell *c; B_LINES bl; get_b_lines(b,&bl); for(c=b;c!=e;c=c->next) if( erection_enable && (c->pos_inc&erect_rot) && c->stick_inc!=NO_INCLINE ) { c->save_stick_inc = c->stick_inc; erect_cell_value(c, (int16_t)(-c->stick_inc), 0, FALSE); erect_rotate_bl(c,(int16_t)((p2_active&&line_scale)?(bl.b3>>line_scale):bl.b3),(int32_t)(-c->stick_inc),+1); c->stick_inc = NO_INCLINE; c->pos_inc = erect_rest; c->left = c->col; c->right = c->col+c->w; }
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 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; }
//extern uchar pass_cut; void criteria(cell *c) { uchar let = 0, *raster = 0; cf::version *vers = 0; int16_t r = 0, flacc = 0, flon = 0, inc = 0; cf::version save[VERS_IN_CELL] = { 0 }; int16_t snvers = 0; // #define PROB_V_OK 170 if (c->nvers > 0) memcpy(save, c->vers, c->nvers); snvers = c->nvers; if (!c->nvers) return; get_b_lines(c, &bl); H = (int16_t) get_size(); if (c->nvers == 1 && c->vers[0].let == '>') test_rq(c); if (c->nvers == 1 && ((let = c->vers[0].let) == 'c' || let == 'C') || (c->nvers == 2 && (c->vers[0].let == 'c' && c->vers[1].let == 'C' || c->vers[0].let == 'C' && c->vers[1].let == 'c'))) test_c(c); if (c->nvers >= 2 && (c->vers[0].let == 'a' && c->vers[1].let == 'o' || c->vers[0].let == 'o' && c->vers[1].let == 'a')) crit_oa(c); for (vers = c->vers, flacc = flon = 0; (let = vers->let) != 0; vers++) { { //Andrew if ((let = vers->let) == liga_CC || let == liga_CR) { raster = save_raster(c); inc = AnglesCurve(raster, (int16_t) ((c->w + 7) / 8), c->h); inc = (4 - inc) * 40; if (3 * c ->w > 4 * c ->h) inc += 150; if (3 * c ->w < 2 * c ->h) inc += 150; if (c->env && c->env->nl < 4) inc += 100; if (vers->prob > inc) vers->prob -= inc; else vers->prob = 0; } } if (((language == LANGUAGE_FRENCH || language == LANGUAGE_ITALIAN) && memchr( "ACEIOUaceiou", let, 12) || // Включая нижние акценты "c" 05.07.2002 E.P. language == LANGUAGE_SPANISH && memchr("AEINOUaeniou", let, 12) || language == LANGUAGE_GERMAN && memchr("AOUaou", let, 6) || language == LANGUAGE_RUSSIAN && memchr("Ґ…", let, 2) || language == LANGUAGE_CROATIAN && memchr("SZCszc", let, 6) /*&& !pass_cut*/|| language == LANGUAGE_POLISH && memchr("AESZCNOaeszcno", let, 14) || // Включая нижние акценты a,e 05.07.2002 E.P. language == LANGUAGE_PORTUGUESE && memchr("AEOUIaeoui", let, 10) || language == LANGUAGE_SWEDISH && memchr("AEOaeo", let, 6)) && !flacc || // 05.09.2000 E.P. language == LANGUAGE_CZECH && memchr("AaCcDdEeIiNnOoRrSsTtUuYyZz", let, 26) || language == LANGUAGE_ROMANIAN && memchr("AaIiSsTt", let, 8) || // Включая нижние акценты s,t 05.07.2002 E.P. language == LANGUAGE_HUNGARIAN && memchr("AaEeIiOoUu", let, 10) || language == LANGUAGE_SLOVENIAN && memchr("CcSsZz", let, 6) || // 09.07.2001 E.P. language == LANGUAGE_LATVIAN && memchr("AaCcEeGgIiKkLlNnSsUuZz", let, 22) || language == LANGUAGE_LITHUANIAN && memchr("AaCcEeIiSsUuZz", let, 14) || language == LANGUAGE_ESTONIAN && memchr("AaOoSsUuZz", let, 10) || // 21.05.2002 E.P. language == LANGUAGE_TURKISH && (memchr("AaCcIiGgOoSsUu", let, 14) || let == i_sans_accent) || 0) { flacc = 1; if (accent(c)) break; } // Урезание чужих букв из общих таблиц if (language == LANGUAGE_POLISH && memchr("qQ", let, 2) || // BULGAR 08.09.2000 E.P. language == LANGUAGE_RUSSIAN && langBul && (let == 155 || let == 235 || // Ыы 08.09.2000 E.P. let == 157 || let == 237 || // Ээ 08.09.2000 E.P. let == r_EE_2dot || let == r_e_2dot) || language == LANGUAGE_SLOVENIAN && isnot_slovenian(let) || // 09.07.2001 E.P. language == LANGUAGE_LATVIAN && isnot_latvian(let) || language == LANGUAGE_LITHUANIAN && isnot_lithuanian(let) || language == LANGUAGE_ESTONIAN && isnot_estonian(let) || // 21.05.2002 E.P. language == LANGUAGE_TURKISH && isnot_turkish(let) || 0) { vers->prob >>= 1; if (vers->prob & 1) vers->prob--; if (!vers->prob) vers->prob = 2; } if (c->isBadLetter()) // Oleg : 02-28-96 04:55pm : letter only if (((let = vers->let) == 'i' || let == 'j' || (language == LANGUAGE_TURKISH && let == II_dot_accent) // 17.06.2002 E.P. ) && (r = ij_dot(c)) != 0) { if (r > 0) break; vers--; continue; } // Nick 18.06.2002 if (language == LANGUAGE_TURKISH && ((let = vers->let) == i_sans_accent || let == II_dot_accent) && (r = upper_right_angle(c)) > 0) { vers->prob = MAX(2, vers->prob - r); continue; } if ((let = vers->let) == '!' || let == '?') { if (excl_dot(c) > 0) break; vers--; continue; } if (language != LANGUAGE_RUSSIAN) // refuse with ,Ў if ((let = vers->let) == invers_exm || let == invers_qm) { if (inv_dot(c) > 0) break; vers--; continue; } if ((language == LANGUAGE_FRENCH || language == LANGUAGE_TURKISH // 18.06.2002 E.P. ) && (vers->let == 'c' || vers->let == 'C')) c_to_ctail(c, 0); // AL 940321 if (vers->let == liga_rt && not_rt(c)) { vers--; continue; } if (is_liga_ff(vers->let) && not_ff(c)) { vers--; continue; } if (vers->let == 'n' || vers->let == 'o') flon = 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(); } }
// // 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 ; }