move.c: removed redundant drawing, now all areas are restored from pixmap by draw(). Postscript print: addition of (limited) unicode characters (0xC2 and 0xC3 2-byte sets are recoded to fit into the 256 slot postscript core font dictionaries). When editing multiple text objects with "preserve unchanged attrs" set do not change individual text dimensions.

This commit is contained in:
Stefan Frederik 2021-01-07 04:33:19 +01:00
parent f0256fce90
commit 5cc1f04588
5 changed files with 333 additions and 273 deletions

View File

@ -2172,11 +2172,11 @@ int text_bbox(const char *str, double xscale, double yscale,
RECTORDER((*rx1),(*ry1),(*rx2),(*ry2));
return 1;
}
int text_bbox_nocairo(const char * str,double xscale, double yscale,
int text_bbox_nocairo(const char *str,double xscale, double yscale,
short rot, short flip, int hcenter, int vcenter, double x1,double y1, double *rx1, double *ry1,
double *rx2, double *ry2, int *cairo_lines, int *cairo_longest_line)
#else
int text_bbox(const char * str,double xscale, double yscale,
int text_bbox(const char *str,double xscale, double yscale,
short rot, short flip, int hcenter, int vcenter, double x1,double y1, double *rx1, double *ry1,
double *rx2, double *ry2, int *cairo_lines, int *cairo_longest_line)
#endif

View File

@ -719,7 +719,6 @@ void edit_text_property(int x)
tclsetvar("props",xctx->text[sel].prop_ptr);
else
tclsetvar("props","");
tclsetvar("retval",xctx->text[sel].txt_ptr);
my_snprintf(property, S(property), "%.16g",xctx->text[sel].yscale);
tclsetvar("vsize",property);
@ -732,7 +731,6 @@ void edit_text_property(int x)
fprintf(errfp, "edit_text_property() : unknown parameter x=%d\n",x); exit(EXIT_FAILURE);
}
preserve = atoi(tclgetvar("preserve_unchanged_attrs"));
text_changed=0;
if(x == 0 || x == 1) {
if( strcmp(xctx->text[sel].txt_ptr, tclgetvar("retval") ) ) {
@ -752,8 +750,7 @@ void edit_text_property(int x)
{
if(xctx->sel_array[k].type!=xTEXT) continue;
sel=xctx->sel_array[k].n;
rot = xctx->text[sel].rot; /* calculate bbox, some cleanup needed here */
rot = xctx->text[sel].rot; /* calculate bbox, some cleanup needed here */
flip = xctx->text[sel].flip;
#if HAS_CAIRO==1
customfont = set_text_custom_font(&xctx->text[sel]);
@ -765,9 +762,7 @@ void edit_text_property(int x)
#if HAS_CAIRO==1
if(customfont) cairo_restore(xctx->cairo_ctx);
#endif
bbox(ADD, xx1, yy1, xx2, yy2 );
dbg(1, "edit_property(): text props: props=%s text=%s\n",
tclgetvar("props"),
tclgetvar("retval") );
@ -786,10 +781,8 @@ void edit_text_property(int x)
#if HAS_CAIRO==1
if(customfont) cairo_restore(xctx->cairo_ctx);
#endif
pcx = (xctx->rect[PINLAYER][l].x1+xctx->rect[PINLAYER][l].x2)/2.0;
pcy = (xctx->rect[PINLAYER][l].y1+xctx->rect[PINLAYER][l].y2)/2.0;
if(
/* 20171206 20171221 */
(fabs( (yy1+yy2)/2 - pcy) < cadgrid/2 &&
@ -817,29 +810,25 @@ void edit_text_property(int x)
else
my_strdup(75, &xctx->text[sel].prop_ptr,(char *) tclgetvar("props"));
my_strdup(76, &xctx->text[sel].font, get_tok_value(xctx->text[sel].prop_ptr, "font", 0));
str = get_tok_value(xctx->text[sel].prop_ptr, "hcenter", 0);
xctx->text[sel].hcenter = strcmp(str, "true") ? 0 : 1;
str = get_tok_value(xctx->text[sel].prop_ptr, "vcenter", 0);
xctx->text[sel].vcenter = strcmp(str, "true") ? 0 : 1;
str = get_tok_value(xctx->text[sel].prop_ptr, "layer", 0);
if(str[0]) xctx->text[sel].layer = atoi(str);
else xctx->text[sel].layer=-1;
xctx->text[sel].flags = 0;
str = get_tok_value(xctx->text[sel].prop_ptr, "slant", 0);
xctx->text[sel].flags |= strcmp(str, "oblique") ? 0 : TEXT_OBLIQUE;
xctx->text[sel].flags |= strcmp(str, "italic") ? 0 : TEXT_ITALIC;
str = get_tok_value(xctx->text[sel].prop_ptr, "weight", 0);
xctx->text[sel].flags |= strcmp(str, "bold") ? 0 : TEXT_BOLD;
xctx->text[sel].xscale=atof(tclgetvar("hsize"));
xctx->text[sel].yscale=atof(tclgetvar("vsize"));
if(xctx->lastsel == 1 || !preserve) {
xctx->text[sel].xscale=atof(tclgetvar("hsize"));
xctx->text[sel].yscale=atof(tclgetvar("vsize"));
}
}
/* calculate bbox, some cleanup needed here */
/* calculate bbox, some cleanup needed here */
#if HAS_CAIRO==1
customfont = set_text_custom_font(&xctx->text[sel]);
#endif
@ -852,7 +841,6 @@ void edit_text_property(int x)
#endif
bbox(ADD, xx1, yy1, xx2, yy2 );
}
bbox(SET,0.0,0.0,0.0,0.0);
draw();

View File

@ -512,18 +512,15 @@ void find_inst_to_be_redrawn(const char *node)
void copy_objects(int what)
{
int c, i, n, k /*, tmp */ ;
/* xRect tmp; */
int tmpi, c, i, n, k /*, tmp */ ;
xRect tmp;
double angle;
int newpropcnt;
double tmpx, tmpy;
int textlayer;
const char *str;
#if HAS_CAIRO==1
char *textfont;
/* int customfont; */
int customfont;
#endif
if(what & START)
@ -573,14 +570,11 @@ void copy_objects(int what)
}
if(what & END) /* copy selected objects */
{
int firstw, firsti;
int save_draw;
int l, firstw, firsti;
/* if the copy operation involved xctx->move_flip or rotations the original element bboxes were changed.
restore them now */
update_symbol_bboxes(0, 0);
save_draw = draw_window;
draw_window=1; /* temporarily re-enable draw to window together with pixmap */
draw_selection(xctx->gctiled,0);
/* draw_selection(xctx->gctiled,0); */
bbox(START, 0.0 , 0.0 , 0.0 , 0.0);
newpropcnt=0;
set_modify(1); push_undo(); /* 20150327 push_undo */
@ -588,69 +582,61 @@ void copy_objects(int what)
firstw = firsti = 1;
for(i=0;i<xctx->lastsel;i++)
{
n = xctx->sel_array[i].n;
if(xctx->sel_array[i].type == WIRE)
{
if(firstw) {
xctx->prep_hash_wires=0;
firstw = 0;
}
check_wire_storage();
/*
if(xctx->wire[n].bus){
int ov, y1, y2;
ov = INT_BUS_WIDTH(xctx->lw)> cadhalfdotsize ? INT_BUS_WIDTH(xctx->lw) : CADHALFDOTSIZE;
if(xctx->wire[n].y1 < xctx->wire[n].y2) { y1 = xctx->wire[n].y1-ov; y2 = xctx->wire[n].y2+ov; }
else { y1 = xctx->wire[n].y1+ov; y2 = xctx->wire[n].y2-ov; }
bbox(ADD, xctx->wire[n].x1-ov, y1 , xctx->wire[n].x2+ov , y2 );
} else {
int ov, y1, y2;
ov = cadhalfdotsize;
if(xctx->wire[n].y1 < xctx->wire[n].y2) { y1 = xctx->wire[n].y1-ov; y2 = xctx->wire[n].y2+ov; }
else { y1 = xctx->wire[n].y1+ov; y2 = xctx->wire[n].y2-ov; }
bbox(ADD, xctx->wire[n].x1-ov, y1 , xctx->wire[n].x2+ov , y2 );
}
*/
if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, xctx->wire[n].x1, xctx->wire[n].y1,
n = xctx->sel_array[i].n;
if(xctx->sel_array[i].type == WIRE)
{
xctx->prep_hash_wires=0;
firstw = 0;
check_wire_storage();
if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, xctx->wire[n].x1, xctx->wire[n].y1,
xctx->wire[n].x1, xctx->wire[n].y1, xctx->rx1,xctx->ry1);
ROTATION(xctx->move_rot, xctx->move_flip, xctx->wire[n].x1, xctx->wire[n].y1,
xctx->wire[n].x2, xctx->wire[n].y2, xctx->rx2,xctx->ry2);
} else {
ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1,
xctx->wire[n].x1, xctx->wire[n].y1, xctx->rx1,xctx->ry1);
ROTATION(xctx->move_rot, xctx->move_flip, xctx->wire[n].x1, xctx->wire[n].y1,
ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1,
xctx->wire[n].x2, xctx->wire[n].y2, xctx->rx2,xctx->ry2);
} else {
ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1,
xctx->wire[n].x1, xctx->wire[n].y1, xctx->rx1,xctx->ry1);
ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1,
xctx->wire[n].x2, xctx->wire[n].y2, xctx->rx2,xctx->ry2);
}
if( xctx->wire[n].sel & (SELECTED|SELECTED1) )
{
xctx->rx1+=xctx->deltax;
xctx->ry1+=xctx->deltay;
}
if( xctx->wire[n].sel & (SELECTED|SELECTED2) )
{
xctx->rx2+=xctx->deltax;
xctx->ry2+=xctx->deltay;
}
tmpx=xctx->rx1; /* used as temporary storage */
tmpy=xctx->ry1;
ORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2);
if( tmpx == xctx->rx2 && tmpy == xctx->ry2)
{
if(xctx->wire[n].sel == SELECTED1) xctx->wire[n].sel = SELECTED2;
else if(xctx->wire[n].sel == SELECTED2) xctx->wire[n].sel = SELECTED1;
}
xctx->sel_array[i].n=xctx->wires;
storeobject(-1, xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2,WIRE,0,xctx->wire[n].sel,xctx->wire[n].prop_ptr);
xctx->wire[n].sel=0;
if(xctx->wire[n].bus)
drawline(WIRELAYER, THICK, xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2, 0);
else
drawline(WIRELAYER, ADD, xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2, 0);
}
drawline(WIRELAYER, END, 0.0, 0.0, 0.0, 0.0, 0);
}
}
if( xctx->wire[n].sel & (SELECTED|SELECTED1) )
{
xctx->rx1+=xctx->deltax;
xctx->ry1+=xctx->deltay;
}
if( xctx->wire[n].sel & (SELECTED|SELECTED2) )
{
xctx->rx2+=xctx->deltax;
xctx->ry2+=xctx->deltay;
}
tmpx=xctx->rx1; /* used as temporary storage */
tmpy=xctx->ry1;
ORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2);
if( tmpx == xctx->rx2 && tmpy == xctx->ry2)
{
if(xctx->wire[n].sel == SELECTED1) xctx->wire[n].sel = SELECTED2;
else if(xctx->wire[n].sel == SELECTED2) xctx->wire[n].sel = SELECTED1;
}
xctx->sel_array[i].n=xctx->wires;
storeobject(-1, xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2,WIRE,0,xctx->wire[n].sel,xctx->wire[n].prop_ptr);
xctx->wire[n].sel=0;
l = xctx->wires -1;
if(xctx->wire[n].bus){
int ov, y1, y2;
ov = INT_BUS_WIDTH(xctx->lw)> cadhalfdotsize ? INT_BUS_WIDTH(xctx->lw) : CADHALFDOTSIZE;
if(xctx->wire[l].y1 < xctx->wire[l].y2) { y1 = xctx->wire[l].y1-ov; y2 = xctx->wire[l].y2+ov; }
else { y1 = xctx->wire[l].y1+ov; y2 = xctx->wire[l].y2-ov; }
bbox(ADD, xctx->wire[l].x1-ov, y1 , xctx->wire[l].x2+ov , y2 );
} else {
int ov, y1, y2;
ov = cadhalfdotsize;
if(xctx->wire[l].y1 < xctx->wire[l].y2) { y1 = xctx->wire[l].y1-ov; y2 = xctx->wire[l].y2+ov; }
else { y1 = xctx->wire[l].y1+ov; y2 = xctx->wire[l].y2-ov; }
bbox(ADD, xctx->wire[l].x1-ov, y1 , xctx->wire[l].x2+ov , y2 );
}
}
}
for(k=0;k<cadlayers;k++)
{
@ -661,7 +647,6 @@ void copy_objects(int what)
{
case LINE:
if(c!=k) break;
/* bbox(ADD, xctx->line[c][n].x1, xctx->line[c][n].y1, xctx->line[c][n].x2, xctx->line[c][n].y2) */
if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, xctx->line[c][n].x1, xctx->line[c][n].y1,
xctx->line[c][n].x1, xctx->line[c][n].y1, xctx->rx1,xctx->ry1);
@ -691,31 +676,38 @@ void copy_objects(int what)
if(xctx->line[c][n].sel == SELECTED1) xctx->line[c][n].sel = SELECTED2;
else if(xctx->line[c][n].sel == SELECTED2) xctx->line[c][n].sel = SELECTED1;
}
if(xctx->line[c][n].bus)
drawline(k, THICK, xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2, xctx->line[c][n].dash);
else
drawline(k, ADD, xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2, xctx->line[c][n].dash);
xctx->sel_array[i].n=xctx->lines[c];
storeobject(-1, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2, LINE, c,
xctx->line[c][n].sel, xctx->line[c][n].prop_ptr);
xctx->line[c][n].sel=0;
l = xctx->lines[c] - 1;
if(xctx->line[c][l].bus){
int ov, y1, y2;
ov = INT_BUS_WIDTH(xctx->lw)> cadhalfdotsize ? INT_BUS_WIDTH(xctx->lw) : CADHALFDOTSIZE;
if(xctx->line[c][l].y1 < xctx->line[c][l].y2)
{ y1 = xctx->line[c][l].y1-ov; y2 = xctx->line[c][l].y2+ov; }
else { y1 = xctx->line[c][l].y1+ov; y2 = xctx->line[c][l].y2-ov; }
bbox(ADD, xctx->line[c][l].x1-ov, y1 , xctx->line[c][l].x2+ov , y2 );
} else {
int ov, y1, y2;
ov = cadhalfdotsize;
if(xctx->line[c][l].y1 < xctx->line[c][l].y2)
{ y1 = xctx->line[c][l].y1-ov; y2 = xctx->line[c][l].y2+ov; }
else { y1 = xctx->line[c][l].y1+ov; y2 = xctx->line[c][l].y2-ov; }
bbox(ADD, xctx->line[c][l].x1-ov, y1 , xctx->line[c][l].x2+ov , y2 );
}
break;
case POLYGON:
if(c!=k) break;
{
xPoly *p = &xctx->poly[c][n];
/* double bx1, by1, bx2, by2; */
double bx1, by1, bx2, by2;
double *x = my_malloc(227, sizeof(double) *p->points);
double *y = my_malloc(228, sizeof(double) *p->points);
int j;
for(j=0; j<p->points; j++) {
/*
if(j==0 || p->x[j] < bx1) bx1 = p->x[j];
if(j==0 || p->y[j] < by1) by1 = p->y[j];
if(j==0 || p->x[j] > bx2) bx2 = p->x[j];
if(j==0 || p->y[j] > by2) by2 = p->y[j];
*/
if( p->sel==SELECTED || p->selected_point[j]) {
if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, p->x[0], p->y[0], p->x[j], p->y[j], xctx->rx1,xctx->ry1);
@ -728,9 +720,12 @@ void copy_objects(int what)
x[j] = p->x[j];
y[j] = p->y[j];
}
if(j==0 || x[j] < bx1) bx1 = x[j];
if(j==0 || y[j] < by1) by1 = y[j];
if(j==0 || x[j] > bx2) bx2 = x[j];
if(j==0 || y[j] > by2) by2 = y[j];
}
/* bbox(ADD, bx1, by1, bx2, by2); */
drawpolygon(k, NOW, x, y, p->points, p->fill, p->dash); /* 20180914 added fill */
bbox(ADD, bx1, by1, bx2, by2);
xctx->sel_array[i].n=xctx->polygons[c];
store_poly(-1, x, y, p->points, c, p->sel, p->prop_ptr);
p->sel=0;
@ -740,11 +735,6 @@ void copy_objects(int what)
break;
case ARC:
if(c!=k) break;
/*
arc_bbox(xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->arc[c][n].r, xctx->arc[c][n].a, xctx->arc[c][n].b,
&tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
bbox(ADD, tmp.x1, tmp.y1, tmp.x2, tmp.y2);
*/
if(xctx->rotatelocal) {
/* rotate center wrt itself: do nothing */
xctx->rx1 = xctx->arc[c][n].x;
@ -761,20 +751,25 @@ void copy_objects(int what)
}
angle = fmod(angle, 360.);
if(angle<0.) angle+=360.;
xctx->arc[c][n].sel=0;
drawarc(k, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay,
xctx->arc[c][n].r, angle, xctx->arc[c][n].b, xctx->arc[c][n].fill, xctx->arc[c][n].dash);
xctx->sel_array[i].n=xctx->arcs[c];
store_arc(-1, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay,
xctx->arc[c][n].r, angle, xctx->arc[c][n].b, c, SELECTED, xctx->arc[c][n].prop_ptr);
l = xctx->arcs[c] - 1;
if(xctx->arc[c][l].fill)
arc_bbox(xctx->arc[c][l].x, xctx->arc[c][l].y, xctx->arc[c][l].r, 0, 360,
&tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
else
arc_bbox(xctx->arc[c][l].x, xctx->arc[c][l].y, xctx->arc[c][l].r,
xctx->arc[c][l].a, xctx->arc[c][n].b,
&tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
bbox(ADD, tmp.x1, tmp.y1, tmp.x2, tmp.y2);
break;
case xRECT:
if(c!=k) break;
/* bbox(ADD, xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rect[c][n].x2, xctx->rect[c][n].y2); */
if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1,
xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rx1,xctx->ry1);
@ -788,32 +783,16 @@ void copy_objects(int what)
}
RECTORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2);
xctx->rect[c][n].sel=0;
drawrect(k, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay,
xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay, xctx->rect[c][n].dash);
filledrect(k, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay,
xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay);
xctx->sel_array[i].n=xctx->rects[c];
storeobject(-1, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay,
xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay,xRECT, c, SELECTED, xctx->rect[c][n].prop_ptr);
l = xctx->rects[c] - 1;
bbox(ADD, xctx->rect[c][l].x1, xctx->rect[c][l].y1, xctx->rect[c][l].x2, xctx->rect[c][l].y2);
break;
case xTEXT:
if(k!=TEXTLAYER) break;
check_text_storage();
/*
#if HAS_CAIRO==1
customfont = set_text_custom_font(&xctx->text[n]);
#endif
text_bbox(xctx->text[n].txt_ptr, xctx->text[n].xscale,
xctx->text[n].yscale, xctx->text[n].rot,xctx->text[n].flip,
xctx->text[n].hcenter, xctx->text[n].vcenter,
xctx->text[n].x0, xctx->text[n].y0,
&xctx->rx1,&xctx->ry1, &xctx->rx2,&xctx->ry2, &tmp, &tmp);
#if HAS_CAIRO==1
if(customfont) cairo_restore(xctx->cairo_ctx);
#endif
bbox(ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2 );
*/
if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, xctx->text[n].x0, xctx->text[n].y0,
xctx->text[n].x0, xctx->text[n].y0, xctx->rx1,xctx->ry1);
@ -837,7 +816,6 @@ void copy_objects(int what)
my_strdup(230, &xctx->text[xctx->texts].prop_ptr, xctx->text[n].prop_ptr);
my_strdup(231, &xctx->text[xctx->texts].font, get_tok_value(xctx->text[xctx->texts].prop_ptr, "font", 0));
str = get_tok_value(xctx->text[xctx->texts].prop_ptr, "hcenter", 0);
xctx->text[xctx->texts].hcenter = strcmp(str, "true") ? 0 : 1;
str = get_tok_value(xctx->text[xctx->texts].prop_ptr, "vcenter", 0);
@ -857,51 +835,29 @@ void copy_objects(int what)
xctx->text[xctx->texts].xscale=xctx->text[n].xscale;
xctx->text[xctx->texts].yscale=xctx->text[n].yscale;
textlayer = xctx->text[xctx->texts].layer;
if(textlayer < 0 || textlayer >= cadlayers) textlayer = TEXTLAYER;
l = xctx->texts;
#if HAS_CAIRO==1 /* bbox after copy */
customfont = set_text_custom_font(&xctx->text[l]);
#endif
text_bbox(xctx->text[l].txt_ptr, xctx->text[l].xscale,
xctx->text[l].yscale, xctx->text[l].rot,xctx->text[l].flip,
xctx->text[l].hcenter, xctx->text[l].vcenter,
xctx->text[l].x0, xctx->text[l].y0,
&xctx->rx1,&xctx->ry1, &xctx->rx2,&xctx->ry2, &tmpi, &tmpi);
#if HAS_CAIRO==1
textfont = xctx->text[xctx->texts].font;
if((textfont && textfont[0]) || xctx->text[xctx->texts].flags) {
char *font = xctx->text[xctx->texts].font;
int flags = xctx->text[xctx->texts].flags;
cairo_font_slant_t slant;
cairo_font_weight_t weight;
textfont = (font && font[0]) ? font : cairo_font_name;
weight = ( flags & TEXT_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL;
slant = CAIRO_FONT_SLANT_NORMAL;
if(flags & TEXT_ITALIC) slant = CAIRO_FONT_SLANT_ITALIC;
if(flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE;
cairo_save(xctx->cairo_ctx);
cairo_save(xctx->cairo_save_ctx);
cairo_select_font_face (xctx->cairo_ctx, textfont, slant, weight);
cairo_select_font_face (xctx->cairo_save_ctx, textfont, slant, weight);
}
#endif
draw_string(textlayer, ADD, xctx->text[xctx->texts].txt_ptr, /* draw moved txt */
xctx->text[xctx->texts].rot, xctx->text[xctx->texts].flip,
xctx->text[xctx->texts].hcenter, xctx->text[xctx->texts].vcenter,
xctx->rx1+xctx->deltax,xctx->ry1+xctx->deltay,
xctx->text[xctx->texts].xscale, xctx->text[xctx->texts].yscale);
#if HAS_CAIRO!=1
drawrect(textlayer, END, 0.0, 0.0, 0.0, 0.0, 0);
drawline(textlayer, END, 0.0, 0.0, 0.0, 0.0, 0);
#endif
#if HAS_CAIRO==1
if( (textfont && textfont[0]) || xctx->text[xctx->texts].flags) {
cairo_restore(xctx->cairo_ctx);
cairo_restore(xctx->cairo_save_ctx);
}
if(customfont) cairo_restore(xctx->cairo_ctx);
#endif
bbox(ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2 );
xctx->sel_array[i].n=xctx->texts;
xctx->texts++;
dbg(2, "copy_objects(): done copy string\n");
break;
case ELEMENT:
if(k==0) {
if(firsti) {
xctx->prep_hash_inst = 0;
firsti = 0;
}
xctx->prep_hash_inst = 0;
firsti = 0;
check_inst_storage();
if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, xctx->inst[n].x0, xctx->inst[n].y0,
@ -943,8 +899,6 @@ void copy_objects(int what)
} /* end switch(xctx->sel_array[i].type) */
} /* end for(i=0;i<xctx->lastsel;i++) */
if(k == 0 ) {
/* force these vars to 0 to trigger a prepare_netlist_structs(0) needed by symbol_bbox->translate
* to translate @#n:net_name texts */
@ -979,10 +933,6 @@ void copy_objects(int what)
}
if(show_pin_net_names) find_inst_hash_clear();
filledrect(k, END, 0.0, 0.0, 0.0, 0.0);
drawarc(k, END, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0);
drawrect(k, END, 0.0, 0.0, 0.0, 0.0, 0);
drawline(k, END, 0.0, 0.0, 0.0, 0.0, 0);
} /* end for(k=0;k<cadlayers;k++) */
check_collapsing_objects();
if(autotrim_wires) trim_wires();
@ -993,7 +943,6 @@ void copy_objects(int what)
draw();
bbox(END , 0.0 , 0.0 , 0.0 , 0.0);
xctx->rotatelocal=0;
draw_window = save_draw;
}
draw_selection(gc[SELLAYER], 0);
}
@ -1006,14 +955,10 @@ void move_objects(int what, int merge, double dx, double dy)
xRect tmp;
double angle;
double tx1,ty1; /* temporaries for swapping coordinates 20070302 */
int textlayer;
#if HAS_CAIRO==1
int customfont;
#endif
#if HAS_CAIRO==1
char *textfont;
#endif
xInstance * const inst = xctx->inst;
xLine ** const line = xctx->line;
xWire * const wire = xctx->wire;
@ -1064,11 +1009,8 @@ void move_objects(int what, int merge, double dx, double dy)
if(what & END) /* move selected objects */
{
int firsti, firstw;
int save_draw;
save_draw = draw_window;
draw_window=1; /* temporarily re-enable draw to xctx->window together with pixmap */
draw_selection(xctx->gctiled,0);
/* draw_selection(xctx->gctiled,0); */
bbox(START, 0.0 , 0.0 , 0.0 , 0.0);
set_modify(1);
if( !(xctx->ui_state & (STARTMERGE | PLACE_SYMBOL)) ) { /* no undo push for MERGE ad PLACE, already done before */
@ -1109,12 +1051,11 @@ void move_objects(int what, int merge, double dx, double dy)
switch(xctx->sel_array[i].type)
{
case WIRE:
if(firstw) {
xctx->prep_hash_wires=0;
firstw = 0;
}
xctx->prep_hash_wires=0;
firstw = 0;
if(k == 0) {
if(wire[n].bus){
if(wire[n].bus){ /* bbox before move */
int ov, y1, y2;
ov = INT_BUS_WIDTH(xctx->lw)> cadhalfdotsize ? INT_BUS_WIDTH(xctx->lw) : CADHALFDOTSIZE;
if(wire[n].y1 < wire[n].y2) { y1 = wire[n].y1-ov; y2 = wire[n].y2+ov; }
@ -1127,6 +1068,7 @@ void move_objects(int what, int merge, double dx, double dy)
else { y1 = wire[n].y1+ov; y2 = wire[n].y2-ov; }
bbox(ADD, wire[n].x1-ov, y1 , wire[n].x2+ov , y2 );
}
if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, wire[n].x1, wire[n].y1,
wire[n].x1, wire[n].y1, xctx->rx1,xctx->ry1);
@ -1161,16 +1103,42 @@ void move_objects(int what, int merge, double dx, double dy)
wire[n].y1=xctx->ry1;
wire[n].x2=xctx->rx2;
wire[n].y2=xctx->ry2;
} else if(k == WIRELAYER) {
if(wire[n].bus)
drawline(WIRELAYER, THICK, wire[n].x1, wire[n].y1, wire[n].x2, wire[n].y2, 0);
else
drawline(WIRELAYER, ADD, wire[n].x1, wire[n].y1, wire[n].x2, wire[n].y2, 0);
if(wire[n].bus){ /* bbox after move */
int ov, y1, y2;
ov = INT_BUS_WIDTH(xctx->lw)> cadhalfdotsize ? INT_BUS_WIDTH(xctx->lw) : CADHALFDOTSIZE;
if(wire[n].y1 < wire[n].y2) { y1 = wire[n].y1-ov; y2 = wire[n].y2+ov; }
else { y1 = wire[n].y1+ov; y2 = wire[n].y2-ov; }
bbox(ADD, wire[n].x1-ov, y1 , wire[n].x2+ov , y2 );
} else {
int ov, y1, y2;
ov = cadhalfdotsize;
if(wire[n].y1 < wire[n].y2) { y1 = wire[n].y1-ov; y2 = wire[n].y2+ov; }
else { y1 = wire[n].y1+ov; y2 = wire[n].y2-ov; }
bbox(ADD, wire[n].x1-ov, y1 , wire[n].x2+ov , y2 );
}
}
break;
case LINE:
if(c!=k) break;
bbox(ADD, line[c][n].x1, line[c][n].y1, line[c][n].x2, line[c][n].y2);
if(xctx->line[c][n].bus){ /* bbox before move */
int ov, y1, y2;
ov = INT_BUS_WIDTH(xctx->lw)> cadhalfdotsize ? INT_BUS_WIDTH(xctx->lw) : CADHALFDOTSIZE;
if(xctx->line[c][n].y1 < xctx->line[c][n].y2)
{ y1 = xctx->line[c][n].y1-ov; y2 = xctx->line[c][n].y2+ov; }
else { y1 = xctx->line[c][n].y1+ov; y2 = xctx->line[c][n].y2-ov; }
bbox(ADD, xctx->line[c][n].x1-ov, y1 , xctx->line[c][n].x2+ov , y2 );
} else {
int ov, y1, y2;
ov = cadhalfdotsize;
if(xctx->line[c][n].y1 < xctx->line[c][n].y2)
{ y1 = xctx->line[c][n].y1-ov; y2 = xctx->line[c][n].y2+ov; }
else { y1 = xctx->line[c][n].y1+ov; y2 = xctx->line[c][n].y2-ov; }
bbox(ADD, xctx->line[c][n].x1-ov, y1 , xctx->line[c][n].x2+ov , y2 );
}
if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, line[c][n].x1, line[c][n].y1,
line[c][n].x1, line[c][n].y1, xctx->rx1,xctx->ry1);
@ -1205,12 +1173,23 @@ void move_objects(int what, int merge, double dx, double dy)
line[c][n].y1=xctx->ry1;
line[c][n].x2=xctx->rx2;
line[c][n].y2=xctx->ry2;
if(line[c][n].bus)
drawline(k, THICK, line[c][n].x1, line[c][n].y1,
line[c][n].x2, line[c][n].y2, line[c][n].dash);
else
drawline(k, ADD, line[c][n].x1, line[c][n].y1,
line[c][n].x2, line[c][n].y2, line[c][n].dash);
if(xctx->line[c][n].bus){ /* bbox after move */
int ov, y1, y2;
ov = INT_BUS_WIDTH(xctx->lw)> cadhalfdotsize ? INT_BUS_WIDTH(xctx->lw) : CADHALFDOTSIZE;
if(xctx->line[c][n].y1 < xctx->line[c][n].y2)
{ y1 = xctx->line[c][n].y1-ov; y2 = xctx->line[c][n].y2+ov; }
else { y1 = xctx->line[c][n].y1+ov; y2 = xctx->line[c][n].y2-ov; }
bbox(ADD, xctx->line[c][n].x1-ov, y1 , xctx->line[c][n].x2+ov , y2 );
} else {
int ov, y1, y2;
ov = cadhalfdotsize;
if(xctx->line[c][n].y1 < xctx->line[c][n].y2)
{ y1 = xctx->line[c][n].y1-ov; y2 = xctx->line[c][n].y2+ov; }
else { y1 = xctx->line[c][n].y1+ov; y2 = xctx->line[c][n].y2-ov; }
bbox(ADD, xctx->line[c][n].x1-ov, y1 , xctx->line[c][n].x2+ov , y2 );
}
break;
case POLYGON:
@ -1242,21 +1221,28 @@ void move_objects(int what, int merge, double dx, double dy)
}
}
bbox(ADD, bx1, by1, bx2, by2);
drawpolygon(k, NOW, p->x, p->y, p->points, p->fill, p->dash);
bbox(ADD, bx1, by1, bx2, by2); /* bbox before move */
for(j=0; j<p->points; j++) {
if(j==0 || p->x[j] < bx1) bx1 = p->x[j];
if(j==0 || p->y[j] < by1) by1 = p->y[j];
if(j==0 || p->x[j] > bx2) bx2 = p->x[j];
if(j==0 || p->y[j] > by2) by2 = p->y[j];
}
bbox(ADD, bx1, by1, bx2, by2); /* bbox after move */
}
break;
case ARC:
if(c!=k) break;
if(xctx->arc[c][n].fill)
if(xctx->arc[c][n].fill) /* bbox before move */
arc_bbox(xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->arc[c][n].r, 0, 360,
&tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
else
arc_bbox(xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->arc[c][n].r,
xctx->arc[c][n].a, xctx->arc[c][n].b,
&tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
dbg(1, "move_objects(): arc_bbox: %g %g %g %g\n", tmp.x1, tmp.y1, tmp.x2, tmp.y2);
bbox(ADD, tmp.x1, tmp.y1, tmp.x2, tmp.y2);
if(xctx->rotatelocal) {
@ -1299,12 +1285,21 @@ void move_objects(int what, int merge, double dx, double dy)
xctx->arc[c][n].y = xctx->ry1;
xctx->arc[c][n].b = angle;
}
drawarc(k, ADD, xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->arc[c][n].r,
xctx->arc[c][n].a, xctx->arc[c][n].b, xctx->arc[c][n].fill, xctx->arc[c][n].dash);
if(xctx->arc[c][n].fill) /* bbox after move */
arc_bbox(xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->arc[c][n].r, 0, 360,
&tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
else
arc_bbox(xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->arc[c][n].r,
xctx->arc[c][n].a, xctx->arc[c][n].b,
&tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
bbox(ADD, tmp.x1, tmp.y1, tmp.x2, tmp.y2);
break;
case xRECT:
if(c!=k) break;
/* bbox before move */
bbox(ADD, xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rect[c][n].x2, xctx->rect[c][n].y2);
if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1,
@ -1378,16 +1373,17 @@ void move_objects(int what, int merge, double dx, double dy)
xctx->rect[c][n].y1 = xctx->ry1;
xctx->rect[c][n].x2 = xctx->rx2;
xctx->rect[c][n].y2 = xctx->ry2;
drawrect(k, ADD, xctx->rect[c][n].x1, xctx->rect[c][n].y1,
xctx->rect[c][n].x2, xctx->rect[c][n].y2, xctx->rect[c][n].dash);
filledrect(c, ADD, xctx->rect[c][n].x1, xctx->rect[c][n].y1,
xctx->rect[c][n].x2, xctx->rect[c][n].y2);
/* bbox after move */
bbox(ADD, xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rect[c][n].x2, xctx->rect[c][n].y2);
break;
case xTEXT:
if(k!=TEXTLAYER) break;
#if HAS_CAIRO==1
#if HAS_CAIRO==1 /* bbox before move */
customfont = set_text_custom_font(&xctx->text[n]);
#endif
text_bbox(xctx->text[n].txt_ptr, xctx->text[n].xscale,
@ -1399,6 +1395,8 @@ void move_objects(int what, int merge, double dx, double dy)
#endif
bbox(ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2 );
if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, xctx->text[n].x0, xctx->text[n].y0,
xctx->text[n].x0, xctx->text[n].y0, xctx->rx1,xctx->ry1);
@ -1413,46 +1411,24 @@ void move_objects(int what, int merge, double dx, double dy)
( (xctx->move_flip && (xctx->text[n].rot & 1) ) ? xctx->move_rot+2 : xctx->move_rot) ) & 0x3;
xctx->text[n].flip=xctx->move_flip^xctx->text[n].flip;
textlayer = xctx->text[n].layer;
if(textlayer < 0 || textlayer >= cadlayers) textlayer = TEXTLAYER;
#if HAS_CAIRO==1 /* bbox after move */
customfont = set_text_custom_font(&xctx->text[n]);
#endif
text_bbox(xctx->text[n].txt_ptr, xctx->text[n].xscale,
xctx->text[n].yscale, xctx->text[n].rot,xctx->text[n].flip, xctx->text[n].hcenter,
xctx->text[n].vcenter, xctx->text[n].x0, xctx->text[n].y0,
&xctx->rx1,&xctx->ry1, &xctx->rx2,&xctx->ry2, &tmpint, &tmpint);
#if HAS_CAIRO==1
textfont = xctx->text[n].font;
if((textfont && textfont[0]) || xctx->text[n].flags) {
cairo_font_slant_t slant;
cairo_font_weight_t weight;
textfont = (xctx->text[n].font && xctx->text[n].font[0]) ? xctx->text[n].font : cairo_font_name;
weight = ( xctx->text[n].flags & TEXT_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL;
slant = CAIRO_FONT_SLANT_NORMAL;
if(xctx->text[n].flags & TEXT_ITALIC) slant = CAIRO_FONT_SLANT_ITALIC;
if(xctx->text[n].flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE;
cairo_save(xctx->cairo_ctx);
cairo_save(xctx->cairo_save_ctx);
cairo_select_font_face (xctx->cairo_ctx, textfont, slant, weight);
cairo_select_font_face (xctx->cairo_save_ctx, textfont, slant, weight);
}
#endif
draw_string(textlayer, ADD, xctx->text[n].txt_ptr, /* draw moved txt */
xctx->text[n].rot, xctx->text[n].flip, xctx->text[n].hcenter, xctx->text[n].vcenter,
xctx->text[n].x0, xctx->text[n].y0,
xctx->text[n].xscale, xctx->text[n].yscale);
#if HAS_CAIRO!=1
drawrect(textlayer, END, 0.0, 0.0, 0.0, 0.0, 0);
drawline(textlayer, END, 0.0, 0.0, 0.0, 0.0, 0);
#endif
#if HAS_CAIRO==1
if( (textfont && textfont[0]) || xctx->text[n].flags) {
cairo_restore(xctx->cairo_ctx);
cairo_restore(xctx->cairo_save_ctx);
}
if(customfont) cairo_restore(xctx->cairo_ctx);
#endif
bbox(ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2 );
break;
case ELEMENT:
if(k==0) {
if(firsti) {
xctx->prep_hash_inst=0;
firsti = 0;
}
xctx->prep_hash_inst=0;
firsti = 0;
if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, inst[n].x0, inst[n].y0,
inst[n].x0, inst[n].y0, xctx->rx1,xctx->ry1);
@ -1502,10 +1478,6 @@ void move_objects(int what, int merge, double dx, double dy)
}
if(show_pin_net_names) find_inst_hash_clear();
filledrect(k, END, 0.0, 0.0, 0.0, 0.0);
drawarc(k, END, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0);
drawrect(k, END, 0.0, 0.0, 0.0, 0.0, 0);
drawline(k, END, 0.0, 0.0, 0.0, 0.0, 0);
} /*end for(k=0;k<cadlayers;k++) */
check_collapsing_objects();
if(autotrim_wires) trim_wires();
@ -1515,11 +1487,9 @@ void move_objects(int what, int merge, double dx, double dy)
xctx->ui_state &= ~STARTMERGE;
xctx->x1=xctx->y_1=xctx->x2=xctx->y_2=xctx->move_rot=xctx->move_flip=xctx->deltax=xctx->deltay=0;
bbox(SET , 0.0 , 0.0 , 0.0 , 0.0);
dbg(2, "move_objects(): bbox= %d %d %d %d\n", xctx->areax1, xctx->areay1, xctx->areaw, xctx->areah);
draw();
bbox(END , 0.0 , 0.0 , 0.0 , 0.0);
xctx->rotatelocal=0;
draw_window =save_draw;
}
draw_selection(gc[SELLAYER], 0);
}

View File

@ -66,7 +66,7 @@ void clear_expandlabel_data(void)
my_free(868, &dest_string.str);
}
void strreplace(char s[], char chr, char repl_chr)
void str_char_replace(char s[], char chr, char repl_chr)
{
int i=0;
while(s[i]!='\0')
@ -119,8 +119,8 @@ const char *expandlabel(const char *s, int *m)
*m=-1;
if(dest_string.str) {
if(netlist_type == CAD_SPICE_NETLIST && bus_char[0] && bus_char[1]) {
strreplace(dest_string.str, '[', bus_char[0]);
strreplace(dest_string.str, ']', bus_char[1]);
str_char_replace(dest_string.str, '[', bus_char[0]);
str_char_replace(dest_string.str, ']', bus_char[1]);
}
return dest_string.str;
} else {

View File

@ -24,6 +24,68 @@
#define X_TO_PS(x) ( (x+xctx->xorigin)* xctx->mooz )
#define Y_TO_PS(y) ( (y+xctx->yorigin)* xctx->mooz )
#if 0
/* FIXME: overflow check. Not used, BTW */
static char *strreplace(char s[], char token[], char replace[])
{
static char res[200];
char *p1, *p2;
int l;
res[0] = '\0';
l = strlen(token);
p1 = p2 = s;
while( (p2 = strstr(p1, token)) ) {
strncat(res, p1, p2 - p1);
strcat(res, replace);
p1 = p2 = p2 + l;
}
strcat(res, p1);
return res;
}
#endif
char *utf8_enc[]={
"/recodedict 24 dict def\n",
"/recode {recodedict begin /nco&na exch def\n",
"/nfnam exch def /basefontname exch def /basefontdict basefontname findfont def\n",
"/newfont basefontdict maxlength dict def basefontdict {exch dup /FID ne\n",
"{dup /Encoding eq {exch dup length array copy newfont 3 1 roll put} {exch\n",
"newfont 3 1 roll put} ifelse} {pop pop} ifelse } forall newfont\n",
"/FontName nfnam put nco&na aload pop nco&na length 2 idiv {newfont\n",
"/Encoding get 3 1 roll put} repeat nfnam newfont definefont pop end } def\n",
};
char *utf8[]={
"/chararr [\n",
/* 0xC2 2-byte characters */
" 161 /exclamdown\n", " 162 /cent\n", " 163 /sterling\n", " 164 /currency\n",
" 165 /yen\n", " 166 /bar\n", " 167 /section\n", " 168 /dieresis\n",
" 169 /copyright\n", " 170 /ordfeminine\n", " 171 /guillemotleft\n", " 172 /logicalnot\n",
" 173 /emdash\n", " 174 /registered\n", " 175 /macron\n", " 176 /degree\n",
" 177 /plusminus\n", " 178 /twosuperior\n", " 179 /threesuperior\n", " 180 /acute\n",
" 181 /mu\n", " 182 /paragraph\n", " 183 /periodcentered\n", " 184 /cedilla\n",
" 185 /onesuperior\n", " 186 /ordmasculine\n", " 187 /guillemotright\n", " 188 /onequarter\n",
" 189 /onehalf\n", " 190 /threequarters\n", " 191 /questiondown\n",
/* 0xC3 2-byte characters */
" 192 /Agrave\n", " 193 /Aacute\n", " 194 /Acircumflex\n", " 195 /Atilde\n",
" 196 /Adieresis\n", " 197 /Aring\n", " 198 /AE\n", " 199 /Ccedilla\n",
" 200 /Egrave\n", " 201 /Eacute\n", " 202 /Ecircumflex\n", " 203 /Edieresis\n",
" 204 /Igrave\n", " 205 /Iacute\n", " 206 /Icircumflex\n", " 207 /Idieresis\n",
" 208 /Eth\n", " 209 /Ntilde\n", " 210 /Ograve\n", " 211 /Oacute\n",
" 212 /Ocircumflex\n", " 213 /Otilde\n", " 214 /Odieresis\n", " 215 /multiply\n",
" 216 /Oslash\n", " 217 /Ugrave\n", " 218 /Uacute\n", " 219 /Ucircumflex\n",
" 220 /Udieresis\n", " 221 /Yacute\n", " 222 /Thorn\n", " 223 /germandbls\n",
" 224 /agrave\n", " 225 /aacute\n", " 226 /acircumflex\n", " 227 /atilde\n",
" 228 /adieresis\n", " 229 /aring\n", " 230 /ae\n", " 231 /ccedilla\n",
" 232 /egrave\n", " 233 /eacute\n", " 234 /ecircumflex\n", " 235 /edieresis\n",
" 236 /igrave\n", " 237 /iacute\n", " 238 /icircumflex\n", " 239 /idieresis\n",
" 240 /eth\n", " 241 /ntilde\n", " 242 /ograve\n", " 243 /oacute\n",
" 244 /ocircumflex\n", " 245 /otilde\n", " 246 /odieresis\n", " 247 /divide\n",
" 248 /oslash\n", " 249 /ugrave\n", " 250 /uacute\n", " 251 /ucircumflex\n",
" 252 /udieresis\n", " 253 /yacute\n", " 254 /thorn\n", " 255 /ydieresis\n",
" ] def\n"};
static FILE *fd;
typedef struct {
@ -33,8 +95,8 @@ typedef struct {
} Ps_color;
static Ps_color *ps_colors;
static char ps_font_name[80] = "Helvetica"; /* Courier Times Helvetica */
static char ps_font_family[80] = "Helvetica"; /* Courier Times Helvetica */
static char ps_font_name[80] = "Helvetica"; /* Courier Times Helvetica Symbol */
static char ps_font_family[80] = "Helvetica"; /* Courier Times Helvetica Symbol */
static void set_lw(void)
@ -206,7 +268,8 @@ static void ps_draw_string_line(int layer, char *s, double x, double y, double s
{
double ix, iy;
short rot1;
int line_delta;
unsigned char c;
int line_delta, offset;
double lines;
set_ps_colors(layer);
if(s==NULL) return;
@ -231,7 +294,8 @@ static void ps_draw_string_line(int layer, char *s, double x, double y, double s
else if(rot==3 && flip==1) {ix+=line_delta+fontascent;}
fprintf(fd, "GS\n");
fprintf(fd, "/%s FF\n", ps_font_family);
fprintf(fd, "/%s", ps_font_family);
fprintf(fd, " FF\n");
fprintf(fd, "%g SCF\n", size * xctx->mooz);
fprintf(fd, "SF\n");
fprintf(fd, "NP\n");
@ -239,8 +303,15 @@ static void ps_draw_string_line(int layer, char *s, double x, double y, double s
if(rot1) fprintf(fd, "%d rotate\n", rot1*90);
fprintf(fd, "1 -1 scale\n");
fprintf(fd, "(");
while(*s) {
switch(*s) {
offset = 0;
while( (c = (unsigned char) *s) ) {
if(c > 127) {
if(c == 195) {offset = 64;s++; continue;}
if(c == 194) {s++; continue;}
fprintf(fd, "\\%03o", c + offset);
offset = 0;
} else
switch(c) {
case '(':
fputs("\\(", fd);
break;
@ -248,7 +319,7 @@ static void ps_draw_string_line(int layer, char *s, double x, double y, double s
fputs("\\)", fd);
break;
default:
fputc(*s, fd);
fputc(c, fd);
}
s++;
}
@ -531,11 +602,16 @@ static void ps_draw_symbol(int n,int layer, short tmp_flip, short rot, double xo
my_snprintf(ps_font_family, S(ps_font_family), textfont);
my_snprintf(ps_font_name, S(ps_font_name), textfont);
}
if( symptr->text[j].flags & TEXT_BOLD)
my_snprintf(ps_font_family, S(ps_font_family), "%s-Bold", ps_font_name);
if( symptr->text[j].flags & TEXT_ITALIC)
if( symptr->text[j].flags & TEXT_BOLD) {
if( (symptr->text[j].flags & TEXT_ITALIC) || (symptr->text[j].flags & TEXT_OBLIQUE) ) {
my_snprintf(ps_font_family, S(ps_font_family), "%s-BoldOblique", ps_font_name);
} else {
my_snprintf(ps_font_family, S(ps_font_family), "%s-Bold", ps_font_name);
}
}
else if( symptr->text[j].flags & TEXT_ITALIC)
my_snprintf(ps_font_family, S(ps_font_family), "%s-Oblique", ps_font_name);
if( symptr->text[j].flags & TEXT_OBLIQUE)
else if( symptr->text[j].flags & TEXT_OBLIQUE)
my_snprintf(ps_font_family, S(ps_font_family), "%s-Oblique", ps_font_name);
if(text_ps) {
ps_draw_string(textlayer, txtptr,
@ -644,6 +720,27 @@ void ps_draw(void)
fprintf(fd, "%%%%Pages: 1\n");
fprintf(fd, "%%%%EndComments\n");
fprintf(fd, "%%%%BeginProlog\n\n");
for(i = 0; i < sizeof(utf8_enc)/sizeof(char *); i++) {
fprintf(fd, utf8_enc[i]);
}
for(i = 0; i < sizeof(utf8)/sizeof(char *); i++) {
fprintf(fd, utf8[i]);
}
fprintf(fd, "/Times /Times chararr recode\n");
fprintf(fd, "/Times-Bold /Times-Bold chararr recode\n");
fprintf(fd, "/Times-Oblique /Times-Oblique chararr recode\n");
fprintf(fd, "/Times-BoldOblique /Times-BoldOblique chararr recode\n");
fprintf(fd, "/Helvetica /Helvetica chararr recode\n");
fprintf(fd, "/Helvetica-Bold /Helvetica-Bold chararr recode\n");
fprintf(fd, "/Helvetica-Oblique /Helvetica-Oblique chararr recode\n");
fprintf(fd, "/Helvetica-BoldOblique /Helvetica-BoldOblique chararr recode\n");
fprintf(fd, "/Courier /Courier chararr recode\n");
fprintf(fd, "/Courier-Bold /Courier-Bold chararr recode\n");
fprintf(fd, "/Courier-Oblique /Courier-Oblique chararr recode\n");
fprintf(fd, "/Courier-BoldOblique /Courier-BoldOblique chararr recode\n");
fprintf(fd,"/cm {28.346457 mul} bind def\n");
fprintf(fd,"/LT {lineto} bind def\n");
fprintf(fd,"/MT {moveto} bind def\n");
@ -695,11 +792,16 @@ void ps_draw(void)
my_snprintf(ps_font_family, S(ps_font_family), textfont);
my_snprintf(ps_font_name, S(ps_font_name), textfont);
}
if( xctx->text[i].flags & TEXT_BOLD)
my_snprintf(ps_font_family, S(ps_font_family), "%s-Bold", ps_font_name);
if( xctx->text[i].flags & TEXT_ITALIC)
if( xctx->text[i].flags & TEXT_BOLD) {
if( (xctx->text[i].flags & TEXT_ITALIC) || (xctx->text[i].flags & TEXT_OBLIQUE) ) {
my_snprintf(ps_font_family, S(ps_font_family), "%s-BoldOblique", ps_font_name);
} else {
my_snprintf(ps_font_family, S(ps_font_family), "%s-Bold", ps_font_name);
}
}
else if( xctx->text[i].flags & TEXT_ITALIC)
my_snprintf(ps_font_family, S(ps_font_family), "%s-Oblique", ps_font_name);
if( xctx->text[i].flags & TEXT_OBLIQUE)
else if( xctx->text[i].flags & TEXT_OBLIQUE)
my_snprintf(ps_font_family, S(ps_font_family), "%s-Oblique", ps_font_name);
if(text_ps) {