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); }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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); }
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; }
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; }
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); }
// // 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; }
// // 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; }