예제 #1
0
파일: belarus.cpp 프로젝트: nctan/quneiform
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;
}
예제 #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
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;
  }
 }
예제 #4
0
파일: iot.cpp 프로젝트: nctan/quneiform
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;
}
예제 #5
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*/
예제 #6
0
파일: iot.cpp 프로젝트: nctan/quneiform
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;
}
예제 #7
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;
}
예제 #8
0
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();
  }
 }
예제 #9
0
//
// 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;
}
예제 #10
0
//
// 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;
}