Пример #1
0
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;
}
Пример #2
0
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;
    }
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
0
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*/
Пример #7
0
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;
}
Пример #8
0
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;
}
Пример #9
0
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;
}
Пример #10
0
//
// 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 ;
}