示例#1
0
void del_retain_cell(cell *c)
{
 //  AFTER TESTS PROTECT MYSELF: if (c->prev == (cell*)(0xffff0000)) return;
	//AK add c/g

	// 17.06.2002 E.P.
	if (c->prev == NoNextPrev)
		return;

	if ( c->next )
	{
		(c->prev)->next=c->next;
		(c->next)->prev=c->prev;

		if ( ( c->flg&(c_f_let|c_f_bad) && !(c->flg&(c_f_dust|c_f_punct)) ) ||
			  c->nextl && c->nextl != NoNextPrev &&
			  c->prevl && c->prevl != NoNextPrev
		   )
		{
			(c->prevl)->nextl=c->nextl;
			(c->nextl)->prevl=c->prevl;
		}
	}

	err_pnlet(c);  // AL 940319
	err_pncell(c);
}
示例#2
0
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// crash attention!
void insert_cell1(cell *c,cell *ci)
{
	int16_t col=c->col;

	if( !(ci->flg & c_f_space)) // Valdemar 02-15-96 00:17am
		if ( col <= ci->col)
			while ( (ci->prev)->col >= col )
				ci=ci->prev;
		else
			while ( (ci=ci->next)->col < col);

	(ci->prev)->next=c;
	c->prev=ci->prev;
	c->next=ci;
	ci->prev=c;

	if (c->flg & (c_f_let+c_f_bad) && !(c->flg & c_f_dust) )
	{
		ci=c->next;
		while ( !(ci->flg & (c_f_fict+c_f_let+c_f_bad)) || ci->flg & c_f_dust )
			ci=ci->next;
		(ci->prevl)->nextl=c;
		c->prevl=ci->prevl;
		c->nextl=ci;
		ci->prevl=c;
	}
	else  // AL 940318
		err_pnlet (c);
}
示例#3
0
cell * new_cell()
{
 cell * c;
 if ((c=free_cell_chain) != NULL)
	 free_cell_chain=c->next;
 else
	 c=empty_cell++;
 //assert(c < cell_boundary); // Valdemar
 if( c >= cell_boundary )
    ErrorExit (RSTR_ERR_NOPLACE);
 c->difflg = 0;
 c->bas1=c->bas2=c->bas3=c->bas4=c->basflg=0;
 c->recsource = 0;
 c->history=0;
 c->flg = 0;
 c->flg_new = 0;
 c->font = 0;
 c->n_baton=NO_BATONS;
 c->pos_inc = erect_no;
 c->accent_leader = 0;
 c->bottom_accent = 0;
 c->language = language;
 err_pnlet(c);
 err_pncell(c);
 c->clink = -1;
 c->clu_attr = 0;
 c->nClust   = 0;
 c->dup = dup_default;
 c->dupstart    =   0;
 c->dupend      =   0;
 c->dlang_dup   =   0;  // Nick 17.02.2001 - was error!
 c->cg_flag_fine = 0;
 c->pr_vers.let=bad_char;   c->pr_vers.prob=0;
 return c;
}
示例#4
0
文件: tools.cpp 项目: nctan/quneiform
void free_cell(cell *c) {
	c->next = free_cell_chain;
	err_pnlet(c); // AL 940319
	err_pnprevcell(c); // AL 940319
	c->flg = 0xff; // AL 940319   0xff indicates: deleted
	free_cell_chain = c;
}
示例#5
0
void insert_cell(cell *c,cell *ci)
{
	int16_t col=c->col;
	if(!(ci->flg & c_f_space)) // Valdemar 02-15-96 00:17am
// Paul 10-11-96
/*
 if (col <= ci->col)  while ((ci->prev)->col > col) ci=ci->prev;
 else                 while ((ci=ci->next)->col <= col);
*/
	//AK! Crashed line when ci->prev pointed to first_cell or ci
	//    pointed to last_cell
	if (col <= ci->col)
		while ( (ci->prev && ci->prev != cell_f()) && ((ci->prev)->flg & c_f_space || (ci->prev)->col > col))
		{
			if ( ci->prev )
				ci=ci->prev;
			else
				AKCheckChain();
		}
	else
		while ((ci != cell_l() && ci->next) && (ci->flg & c_f_space || ci->col <= col))
		{
			if ( ci->next )
				ci=ci->next;
			else
				AKCheckChain();
		}
//

	(ci->prev)->next=c;
	c->prev=ci->prev;
	c->next=ci;
	ci->prev=c;

	if (c->flg & (c_f_let+c_f_bad) && !(c->flg & c_f_dust) )
	{
		ci=c->next;
		while (!(ci->flg & (c_f_fict+c_f_let+c_f_bad)) || ci->flg & c_f_dust)
			ci=ci->next;
		(ci->prevl)->nextl=c;
		c->prevl=ci->prevl;
		c->nextl=ci;
		ci->prevl=c;
	}
	else  // AL 940318
		err_pnlet (c);
}
示例#6
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;
}
示例#7
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;
}