From 1e3ac96085c17a5a55b45a5a7ca1927bb8a9b95a Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Tue, 27 Feb 2024 10:24:21 +0100 Subject: [PATCH] table_read(): read csv files --- src/actions.c | 12 ++--- src/draw.c | 130 ++++++++++++++++++++++++++++-------------------- src/editprop.c | 7 ++- src/move.c | 4 +- src/save.c | 9 ++-- src/scheduler.c | 4 +- src/select.c | 14 ++++-- src/xschem.h | 5 +- 8 files changed, 112 insertions(+), 73 deletions(-) diff --git a/src/actions.c b/src/actions.c index 344158d7..3e6979ab 100644 --- a/src/actions.c +++ b/src/actions.c @@ -3299,7 +3299,7 @@ void new_polygon(int what) /* closed poly */ if(what & END) { /* delete last rubber */ - drawtemppolygon(xctx->gctiled, NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points+1); + drawtemppolygon(xctx->gctiled, NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points+1, 0); xctx->nl_polyx[xctx->nl_points] = xctx->nl_polyx[0]; xctx->nl_polyy[xctx->nl_points] = xctx->nl_polyy[0]; /* add point */ @@ -3321,12 +3321,12 @@ void new_polygon(int what) ((what & ADD) && xctx->nl_polyx[xctx->nl_points-1] == xctx->nl_polyx[0] && xctx->nl_polyy[xctx->nl_points-1] == xctx->nl_polyy[0]) ) { xctx->push_undo(); - drawtemppolygon(xctx->gctiled, NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points+1); + drawtemppolygon(xctx->gctiled, NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points+1, 0); store_poly(-1, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points, xctx->rectcolor, 0, NULL); /* fprintf(errfp, "new_poly: finish: nl_points=%d\n", xctx->nl_points); */ - drawtemppolygon(xctx->gc[xctx->rectcolor], NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points); + drawtemppolygon(xctx->gc[xctx->rectcolor], NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points, 0); xctx->ui_state &= ~STARTPOLYGON; - drawpolygon(xctx->rectcolor, NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points, 0, 0); + drawpolygon(xctx->rectcolor, NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points, 0, 0, 0); my_free(_ALLOC_ID_, &xctx->nl_polyx); my_free(_ALLOC_ID_, &xctx->nl_polyy); xctx->nl_maxpoints = xctx->nl_points = 0; @@ -3334,10 +3334,10 @@ void new_polygon(int what) if(what & RUBBER) { /* fprintf(errfp, "new_poly: RUBBER\n"); */ - drawtemppolygon(xctx->gctiled, NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points+1); + drawtemppolygon(xctx->gctiled, NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points+1, 0); xctx->nl_polyy[xctx->nl_points] = xctx->mousey_snap; xctx->nl_polyx[xctx->nl_points] = xctx->mousex_snap; - drawtemppolygon(xctx->gc[xctx->rectcolor], NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points+1); + drawtemppolygon(xctx->gc[xctx->rectcolor], NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points+1, 0); } } diff --git a/src/draw.c b/src/draw.c index 959cd124..d2fd90c6 100644 --- a/src/draw.c +++ b/src/draw.c @@ -609,7 +609,9 @@ void draw_symbol(int what,int c, int n,int layer,short tmp_flip, short rot, for(j=0;j< symptr->polygons[layer]; ++j) { int dash; + int bezier; polygon = &(symptr->poly[layer])[j]; + bezier = !strboolcmp(get_tok_value(polygon->prop_ptr, "bezier", 0), "true"); dash = (disabled == 1) ? 3 : polygon->dash; x = my_malloc(_ALLOC_ID_, sizeof(double) * polygon->points); y = my_malloc(_ALLOC_ID_, sizeof(double) * polygon->points); @@ -618,7 +620,7 @@ void draw_symbol(int what,int c, int n,int layer,short tmp_flip, short rot, x[k]+= x0; y[k] += y0; } - drawpolygon(c, NOW, x, y, polygon->points, polygon->fill, dash); /* added fill */ + drawpolygon(c, NOW, x, y, polygon->points, polygon->fill, dash, bezier); /* added fill */ my_free(_ALLOC_ID_, &x); my_free(_ALLOC_ID_, &y); } @@ -828,8 +830,9 @@ void draw_temp_symbol(int what, GC gc, int n,int layer,short tmp_flip, short rot } for(j=0;j< symptr->polygons[layer]; ++j) { + int bezier; polygon = &(symptr->poly[layer])[j]; - + bezier = !strboolcmp(get_tok_value(polygon->prop_ptr, "bezier", 0), "true"); { /* scope block so we declare some auxiliary arrays for coord transforms. 20171115 */ int k; double *x = my_malloc(_ALLOC_ID_, sizeof(double) * polygon->points); @@ -839,7 +842,7 @@ void draw_temp_symbol(int what, GC gc, int n,int layer,short tmp_flip, short rot x[k] += x0; y[k] += y0; } - drawtemppolygon(gc, NOW, x, y, polygon->points); + drawtemppolygon(gc, NOW, x, y, polygon->points, bezier); my_free(_ALLOC_ID_, &x); my_free(_ALLOC_ID_, &y); } @@ -1188,33 +1191,6 @@ void drawline(int c, int what, double linex1, double liney1, double linex2, doub i=0; } } -void drawbezier(void) -{ - XPoint p[512]; - int i = 0; - double t; - double x1=100.0; - double y1=-400.0; - double x2=500.0; - double y2=-800.0; - double x3=800.0; - double y3=-200.0; - double x4=1100.0; - double y4=-400.0; - double x, y; - - i = 0; - for(t = 0; t <= 1.0; t += 0.00390625 /* 1/256 */) { - x = pow(1-t, 3) * x1 + 3 * pow(1-t, 2) * t * x2 + 3 * (1-t) * pow(t, 2) * x3 + pow(t, 3) * x4; - y = pow(1-t, 3) * y1 + 3 * pow(1-t, 2) * t * y2 + 3 * (1-t) * pow(t, 2) * y3 + pow(t, 3) * y4; - p[i].x = (short)X_TO_SCREEN(x); - p[i].y = (short)Y_TO_SCREEN(y); - i++; - } - XDrawLines(display, xctx->window, xctx->gc[4], p, i, CoordModeOrigin); - XDrawLines(display, xctx->save_pixmap, xctx->gc[4], p, i, CoordModeOrigin); - -} void drawtempline(GC gc, int what, double linex1,double liney1,double linex2,double liney2) { @@ -1467,7 +1443,6 @@ void filledarc(int c, int what, double x, double y, double r, double a, double b } } - void drawarc(int c, int what, double x, double y, double r, double a, double b, int arc_fill, int dash) { static int i=0; @@ -1561,7 +1536,6 @@ void drawarc(int c, int what, double x, double y, double r, double a, double b, } } - void filledrect(int c, int what, double rectx1,double recty1,double rectx2,double recty2) { static int i=0; @@ -1630,7 +1604,6 @@ void polygon_bbox(double *x, double *y, int points, double *bx1, double *by1, do } } - void arc_bbox(double x, double y, double r, double a, double b, double *bx1, double *by1, double *bx2, double *by2) { @@ -1688,11 +1661,40 @@ void arc_bbox(double x, double y, double r, double a, double b, /* Convex Nonconvex Complex */ #define Polygontype Nonconvex + +static void drawbezier(Drawable w, GC gc, int c, double *x, double *y, int points, int fill) +{ + XPoint p[512]; + int i = 0; + double t; + double xp, yp; + + if(points == 4) { + if(gc == xctx->gc[SELLAYER]) for(i = 0; i < points; i++) { + drawtemparc(gc, NOW, x[i], y[i], cadhalfdotsize, 0., 360.); + } + i = 0; + for(t = 0; t <= 1.0; t += 0.0078125/* 1/128 */) { + xp = pow(1-t, 3) * x[0] + 3 * pow(1-t, 2) * t * x[1] + 3 * (1-t) * pow(t, 2) * x[2] + pow(t, 3) * x[3]; + yp = pow(1-t, 3) * y[0] + 3 * pow(1-t, 2) * t * y[1] + 3 * (1-t) * pow(t, 2) * y[2] + pow(t, 3) * y[3]; + p[i].x = (short)X_TO_SCREEN(xp); + p[i].y = (short)Y_TO_SCREEN(yp); + i++; + } + XDrawLines(display, w, gc, p, i, CoordModeOrigin); + if(fill) { + XFillPolygon(display, w, xctx->gcstipple[c], p, i, Polygontype, CoordModeOrigin); + } + } + +} + /* Unused 'what' parameter used in spice data draw_graph() * to avoid unnecessary clipping (what = 0) */ -void drawpolygon(int c, int what, double *x, double *y, int points, int poly_fill, int dash) +void drawpolygon(int c, int what, double *x, double *y, int points, int poly_fill, int dash, int flags) { double x1,y1,x2,y2; + int fill, bezier; XPoint *p; int i; short sx, sy; @@ -1719,36 +1721,49 @@ void drawpolygon(int c, int what, double *x, double *y, int points, int poly_fil for(i=0;ifill_pattern && xctx->fill_type[c] && + poly_fill && (x[0] == x[points-1]) && (y[0] == y[points-1]); + bezier = flags && points == 4; if(dash) { char dash_arr[2]; dash_arr[0] = dash_arr[1] = (char)dash; XSetDashes(display, xctx->gc[c], 0, dash_arr, 1); XSetLineAttributes (display, xctx->gc[c], XLINEWIDTH(xctx->lw), xDashType, xCap, xJoin); } - if(xctx->draw_window) XDrawLines(display, xctx->window, xctx->gc[c], p, points, CoordModeOrigin); - if(xctx->draw_pixmap) - XDrawLines(display, xctx->save_pixmap, xctx->gc[c], p, points, CoordModeOrigin); - if(xctx->fill_pattern && xctx->fill_type[c]){ - if(poly_fill && (x[0] == x[points-1]) && (y[0] == y[points-1])) { - if(xctx->draw_window) - XFillPolygon(display, xctx->window, xctx->gcstipple[c], p, points, Polygontype, CoordModeOrigin); - if(xctx->draw_pixmap) - XFillPolygon(display, xctx->save_pixmap, xctx->gcstipple[c], p, points, Polygontype, CoordModeOrigin); + if(xctx->draw_window) { + if(bezier) { + drawbezier(xctx->window, xctx->gc[c], c, x, y, points, fill); + } else { + XDrawLines(display, xctx->window, xctx->gc[c], p, points, CoordModeOrigin); } } + if(xctx->draw_pixmap) { + if(bezier) { + drawbezier(xctx->save_pixmap, xctx->gc[c], c, x, y, points, fill); + } else { + XDrawLines(display, xctx->save_pixmap, xctx->gc[c], p, points, CoordModeOrigin); + } + } + if(fill && !bezier) { + if(xctx->draw_window) + XFillPolygon(display, xctx->window, xctx->gcstipple[c], p, points, Polygontype, CoordModeOrigin); + if(xctx->draw_pixmap) + XFillPolygon(display, xctx->save_pixmap, xctx->gcstipple[c], p, points, Polygontype, CoordModeOrigin); + } if(dash) { XSetLineAttributes (display, xctx->gc[c], XLINEWIDTH(xctx->lw) ,LineSolid, LINECAP , LINEJOIN); } my_free(_ALLOC_ID_, &p); } -void drawtemppolygon(GC gc, int what, double *x, double *y, int points) +void drawtemppolygon(GC gc, int what, double *x, double *y, int points, int flags) { double x1,y1,x2,y2; double sx1,sy1,sx2,sy2; XPoint *p; int i; short sx, sy; + int bezier; if(!has_x) return; polygon_bbox(x, y, points, &x1,&y1,&x2,&y2); sx1=X_TO_SCREEN(x1); @@ -1757,18 +1772,25 @@ void drawtemppolygon(GC gc, int what, double *x, double *y, int points) sy2=Y_TO_SCREEN(y2); if( rectclip(xctx->areax1,xctx->areay1,xctx->areax2,xctx->areay2,&sx1,&sy1,&sx2,&sy2) ) { + bezier = flags && points == 4; if((fix_broken_tiled_fill || !_unix) && gc == xctx->gctiled) { MyXCopyAreaDouble(display, xctx->save_pixmap, xctx->window, xctx->gc[0], - x1, y1, x2, y2, x1, y1, xctx->lw); + x1 - cadhalfdotsize, y1 - cadhalfdotsize, + x2 + cadhalfdotsize, y2 + cadhalfdotsize, + x1 - cadhalfdotsize, y1 - cadhalfdotsize, xctx->lw); } else { - p = my_malloc(_ALLOC_ID_, sizeof(XPoint) * points); - for(i=0;iwindow, gc, 0, x, y, points, 0); + } else { + p = my_malloc(_ALLOC_ID_, sizeof(XPoint) * points); + for(i=0;iwindow, gc, p, points, CoordModeOrigin); + my_free(_ALLOC_ID_, &p); } - XDrawLines(display, xctx->window, gc, p, points, CoordModeOrigin); - my_free(_ALLOC_ID_, &p); } } } @@ -4140,8 +4162,10 @@ void draw(void) drawarc(cc, ADD, a->x, a->y, a->r, a->a, a->b, a->fill, a->dash); } if(xctx->enable_layer[c]) for(i=0;ipolygons[c]; ++i) { + int bezier; xPoly *p = &xctx->poly[c][i]; - drawpolygon(cc, NOW, p->x, p->y, p->points, p->fill, p->dash); + bezier = !strboolcmp(get_tok_value(p->prop_ptr, "bezier", 0), "true"); + drawpolygon(cc, NOW, p->x, p->y, p->points, p->fill, p->dash, bezier); } if(use_hash) init_inst_iterator(&ctx, x1, y1, x2, y2); else i = -1; diff --git a/src/editprop.c b/src/editprop.c index 33d110fb..b623a682 100644 --- a/src/editprop.c +++ b/src/editprop.c @@ -1131,6 +1131,7 @@ static int edit_arc_property(void) static int edit_polygon_property(void) { int old_fill; + int oldbezier, bezier; int k; double x1=0., y1=0., x2=0., y2=0.; int c, i, ii, old_dash; @@ -1159,6 +1160,7 @@ static int edit_polygon_property(void) i = xctx->sel_array[ii].n; c = xctx->sel_array[ii].col; + oldbezier = !strboolcmp(get_tok_value(xctx->poly[c][i].prop_ptr,"bezier",0),"true") ; if(oldprop && preserve == 1) { set_different_token(&xctx->poly[c][i].prop_ptr, (char *) tclgetvar("retval"), oldprop); } else { @@ -1166,6 +1168,7 @@ static int edit_polygon_property(void) } old_fill = xctx->poly[c][i].fill; old_dash = xctx->poly[c][i].dash; + bezier = !strboolcmp(get_tok_value(xctx->poly[c][i].prop_ptr,"bezier",0),"true") ; if( !strboolcmp(get_tok_value(xctx->poly[c][i].prop_ptr,"fill",0),"true") ) xctx->poly[c][i].fill =1; else @@ -1176,7 +1179,7 @@ static int edit_polygon_property(void) xctx->poly[c][i].dash = (short)(d >= 0 ? d : 0); } else xctx->poly[c][i].dash = 0; - if(old_fill != xctx->poly[c][i].fill || old_dash != xctx->poly[c][i].dash) { + if(old_fill != xctx->poly[c][i].fill || old_dash != xctx->poly[c][i].dash || oldbezier != bezier) { if(!drw) { bbox(START,0.0,0.0,0.0,0.0); drw = 1; @@ -1187,7 +1190,7 @@ static int edit_polygon_property(void) if(k==0 || xctx->poly[c][i].x[k] > x2) x2 = xctx->poly[c][i].x[k]; if(k==0 || xctx->poly[c][i].y[k] > y2) y2 = xctx->poly[c][i].y[k]; } - bbox(ADD, x1, y1, x2, y2); + bbox(ADD, x1-cadhalfdotsize, y1-cadhalfdotsize, x2+cadhalfdotsize, y2+cadhalfdotsize); } } if(drw) { diff --git a/src/move.c b/src/move.c index f81f8cee..ec20caa9 100644 --- a/src/move.c +++ b/src/move.c @@ -305,8 +305,10 @@ void draw_selection(GC g, int interruptable) break; case POLYGON: { + int bezier; double *x = my_malloc(_ALLOC_ID_, sizeof(double) *xctx->poly[c][n].points); double *y = my_malloc(_ALLOC_ID_, sizeof(double) *xctx->poly[c][n].points); + bezier = !strboolcmp(get_tok_value(xctx->poly[c][n].prop_ptr, "bezier", 0), "true"); if(xctx->poly[c][n].sel==SELECTED || xctx->poly[c][n].sel==SELECTED1) { for(k=0;kpoly[c][n].points; ++k) { if( xctx->poly[c][n].sel==SELECTED || xctx->poly[c][n].selected_point[k]) { @@ -324,7 +326,7 @@ void draw_selection(GC g, int interruptable) y[k] = xctx->poly[c][n].y[k]; } } - drawtemppolygon(g, NOW, x, y, xctx->poly[c][n].points); + drawtemppolygon(g, NOW, x, y, xctx->poly[c][n].points, bezier); } my_free(_ALLOC_ID_, &x); my_free(_ALLOC_ID_, &y); diff --git a/src/save.c b/src/save.c index 061b64fa..93bb3ebb 100644 --- a/src/save.c +++ b/src/save.c @@ -1300,7 +1300,10 @@ int table_read(const char *f) } line_ptr = line; while(*line_ptr) { /* non empty line ? */ - if(*line_ptr != ' ' && *line_ptr != '\t' && *line_ptr != '\n') empty = 0; + if(*line_ptr != ' ' && *line_ptr != '\t' && *line_ptr != '\n') { + empty = 0; + break; + } line_ptr++; } if(empty) { @@ -1317,9 +1320,9 @@ int table_read(const char *f) line_ptr = line; field = 0; #ifdef __unix__ - while( (line_tok = strtok_r(line_ptr, " \t\n", &line_save)) ) { + while( (line_tok = strtok_r(line_ptr, ", \t\n", &line_save)) ) { #else - while( (line_tok = my_strtok_r(line_ptr, " \t\n", "", 0, &line_save)) ) { + while( (line_tok = my_strtok_r(line_ptr, ", \t\n", "", 0, &line_save)) ) { #endif line_ptr = NULL; /* dbg(1,"%s ", line_tok); */ diff --git a/src/scheduler.c b/src/scheduler.c index 35bb160b..c5c55fc6 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -5212,7 +5212,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg /* test * Testmode ... */ - else if(0 && !strcmp(argv[1], "test") ) + else if(1 && !strcmp(argv[1], "test") ) { Iterator_ctx ctx; Objectentry *objectptr; @@ -5264,7 +5264,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg Tcl_ResetResult(interp); } else if(argc > 2 && atoi(argv[2]) == 3) { - drawbezier(); + } } diff --git a/src/select.c b/src/select.c index 5f3006bb..ceef54ea 100644 --- a/src/select.c +++ b/src/select.c @@ -867,9 +867,13 @@ void unselect_all(int dr) if(xctx->poly[c][i].sel) { int k; + int bezier = !strboolcmp(get_tok_value(xctx->poly[c][i].prop_ptr, "bezier", 0), "true"); for(k=0;kpoly[c][i].points; ++k) xctx->poly[c][i].selected_point[k] = 0; xctx->poly[c][i].sel = 0; - if(dr) drawtemppolygon(xctx->gctiled, NOW, xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points); + if(dr) { + drawtemppolygon(xctx->gctiled, NOW, + xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points, bezier); + } } } } @@ -1094,6 +1098,7 @@ void select_polygon(int c, int i, unsigned short select_mode, int fast ) { char str[1024]; /* overflow safe */ char s[256]; /* overflow safe */ + int bezier; if(!fast) { my_strncpy(s,xctx->poly[c][i].prop_ptr!=NULL?xctx->poly[c][i].prop_ptr:"",S(s)); @@ -1104,12 +1109,15 @@ void select_polygon(int c, int i, unsigned short select_mode, int fast ) my_snprintf(str, S(str), "n=%4d x0 = %.16g y0 = %.16g ...", i, xctx->poly[c][i].x[0], xctx->poly[c][i].y[0]); statusmsg(str,1); } + bezier = !strboolcmp(get_tok_value(xctx->poly[c][i].prop_ptr, "bezier", 0), "true"); xctx->poly[c][i].sel = select_mode; if(select_mode) { - drawtemppolygon(xctx->gc[SELLAYER], NOW, xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points); + drawtemppolygon(xctx->gc[SELLAYER], NOW, + xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points, bezier); } else { - drawtemppolygon(xctx->gctiled, NOW, xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points); + drawtemppolygon(xctx->gctiled, NOW, + xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points, bezier); } if(xctx->poly[c][i].sel == SELECTED) set_first_sel(POLYGON, i, c); xctx->need_reb_sel_arr=1; diff --git a/src/xschem.h b/src/xschem.h index 18835c77..7050858e 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -1389,9 +1389,8 @@ extern void drawtemprect(GC gc, int what, double rectx1,double recty1, extern void drawtemparc(GC gc, int what, double x, double y, double r, double a, double b); extern void drawarc(int c, int what, double x, double y, double r, double a, double b, int arc_fill, int dash); extern void filledarc(int c, int what, double x, double y, double r, double a, double b); -extern void drawtemppolygon(GC gc, int what, double *x, double *y, int points); -extern void drawpolygon(int c, int what, double *x, double *y, int points, int poly_fill, int dash); -extern void drawbezier(void); +extern void drawtemppolygon(GC gc, int what, double *x, double *y, int points, int flags); +extern void drawpolygon(int c, int what, double *x, double *y, int points, int poly_fill, int dash, int flags); extern void draw_temp_symbol(int what, GC gc, int n,int layer, short tmp_flip, short tmp_rot, double xoffset, double yoffset); extern void draw_temp_string(GC gc,int what, const char *str, short rot, short flip, int hcenter, int vcenter,