From f3230ceb423320324a788e5ccab35e1d00e31a14 Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Wed, 27 Sep 2023 01:28:31 +0200 Subject: [PATCH] FIX_BROKEN_TILED_FILL can now be changed runtime (fix_broken_tiled_fill) --- doc/xschem_man/developer_info.html | 6 ++++- src/actions.c | 20 ++++++++-------- src/callback.c | 38 +++++++++++++++--------------- src/draw.c | 36 ++++++++++++++-------------- src/globals.c | 11 +++++++++ src/move.c | 28 +++++++++++----------- src/scheduler.c | 19 +++++++++++++++ src/select.c | 12 +++++----- src/xinit.c | 23 +++++++++--------- src/xschem.h | 4 +++- src/xschem.tcl | 24 +++++++++++++++---- src/xschemrc | 7 ++++++ 12 files changed, 142 insertions(+), 86 deletions(-) diff --git a/doc/xschem_man/developer_info.html b/doc/xschem_man/developer_info.html index 02e7669d..ad305a3f 100644 --- a/doc/xschem_man/developer_info.html +++ b/doc/xschem_man/developer_info.html @@ -511,6 +511,7 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns" +
  • abort_operation
  • @@ -668,6 +669,7 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
          
  • currsch hierarchy level of current schematic (start at 0)
  • debug_var debug level (0 = no debug, 1, 2, 3,...)
  • draw_window direct draw into window
  • +
  • fix_broken_tiled_fill get drawing method setting (for broken GPUs)
  • format alternate format attribute to use in netlist (or NULL)
  • graph_lastsel number of last graph that was clicked
  • gridlayer layer number for grid
  • @@ -1060,6 +1062,8 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns" afterward
  • reset_flags
  •     Reset cached instance and symbol cached flags (inst->flags, sym->flags) 
    +
  • resetwin create_pixmap clear_pixmap force w h
  • +   internal command: calls resetwin() 
  • resolved_net [net]
  •     if 'net' is given  return its topmost full hierarchy name
        else returns the topmost full hierarchy name of selected net/pin/label.
    @@ -1141,6 +1145,7 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
          
  • color_ps set color psoscript (1 or 0)
  • constrained_move set constrained move (1=horiz, 2=vert, 0=none)
  • draw_window set drawing to window (1 or 0)
  • +
  • fix_broken_tiled_fill alternate drawing method for broken GPUs
  • format set name of custom format attribute used for netlisting
  • header_text set header metadata (used for license info)
  • hide_symbols set to 0,1,2 for various hiding level of symbols
  • @@ -1328,7 +1333,6 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns" - diff --git a/src/actions.c b/src/actions.c index 486f66a2..8f2a489c 100644 --- a/src/actions.c +++ b/src/actions.c @@ -3452,17 +3452,17 @@ void select_rect(int what, int select) { RECTORDER(xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2); - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) - /* - * MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y, - * xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y); - */ + if(fix_broken_tiled_fill || !_unix) { + /* + * MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y, + * xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y); + */ - MyXCopyAreaDouble(display, xctx->save_pixmap, xctx->window, xctx->gc[0], - xctx->nl_xr, xctx->nl_yr, xctx->nl_xr2, xctx->nl_yr2, xctx->nl_xr, xctx->nl_yr, xctx->lw); - #else - drawtemprect(xctx->gctiled, NOW, xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2); - #endif + MyXCopyAreaDouble(display, xctx->save_pixmap, xctx->window, xctx->gc[0], + xctx->nl_xr, xctx->nl_yr, xctx->nl_xr2, xctx->nl_yr2, xctx->nl_xr, xctx->nl_yr, xctx->lw); + } else { + drawtemprect(xctx->gctiled, NOW, xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2); + } /* draw_selection(xctx->gc[SELLAYER], 0); */ select_inside(xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2, xctx->nl_sel); diff --git a/src/callback.c b/src/callback.c index 6438e928..7cddd285 100644 --- a/src/callback.c +++ b/src/callback.c @@ -992,17 +992,17 @@ void draw_crosshair(int del) xctx->draw_pixmap = 0; xctx->draw_window = 1; - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) - MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], - 0, (int)Y_TO_SCREEN(xctx->prev_crossy) - 2 * INT_WIDTH(xctx->lw), - xctx->xrect[0].width, 4 * INT_WIDTH(xctx->lw), - 0, (int)Y_TO_SCREEN(xctx->prev_crossy) - 2 * INT_WIDTH(xctx->lw)); + if(fix_broken_tiled_fill || !_unix) { + MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], + 0, (int)Y_TO_SCREEN(xctx->prev_crossy) - 2 * INT_WIDTH(xctx->lw), + xctx->xrect[0].width, 4 * INT_WIDTH(xctx->lw), + 0, (int)Y_TO_SCREEN(xctx->prev_crossy) - 2 * INT_WIDTH(xctx->lw)); - MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], - (int)X_TO_SCREEN(xctx->prev_crossx) - 2 * INT_WIDTH(xctx->lw), 0, - 4 * INT_WIDTH(xctx->lw), xctx->xrect[0].height, - (int)X_TO_SCREEN(xctx->prev_crossx) - 2 * INT_WIDTH(xctx->lw), 0); - #endif + MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], + (int)X_TO_SCREEN(xctx->prev_crossx) - 2 * INT_WIDTH(xctx->lw), 0, + 4 * INT_WIDTH(xctx->lw), xctx->xrect[0].height, + (int)X_TO_SCREEN(xctx->prev_crossx) - 2 * INT_WIDTH(xctx->lw), 0); + } draw_selection(xctx->gc[SELLAYER], 0); drawtempline(xctx->gctiled, NOW, X_TO_XSCHEM(xctx->areax1), xctx->prev_crossy, X_TO_XSCHEM(xctx->areax2), xctx->prev_crossy); @@ -1184,16 +1184,16 @@ int draw_xhair = tclgetboolvar("draw_crosshair"); break; } if(xctx->ui_state & STARTPAN) pan(RUBBER, mx, my); - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) - if ((xctx->ui_state & STARTWIRE) || (xctx->ui_state & STARTARC) || - (xctx->ui_state & STARTLINE) || (xctx->ui_state & STARTMOVE) || - (xctx->ui_state & STARTCOPY) || (xctx->ui_state & STARTRECT) || - (xctx->ui_state & STARTPOLYGON) || /* (xctx->ui_state & STARTPAN) || */ - (xctx->ui_state & STARTSELECT)) { - MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y, - xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y); + if(fix_broken_tiled_fill || !_unix) { + if ((xctx->ui_state & STARTWIRE) || (xctx->ui_state & STARTARC) || + (xctx->ui_state & STARTLINE) || (xctx->ui_state & STARTMOVE) || + (xctx->ui_state & STARTCOPY) || (xctx->ui_state & STARTRECT) || + (xctx->ui_state & STARTPOLYGON) || /* (xctx->ui_state & STARTPAN) || */ + (xctx->ui_state & STARTSELECT)) { + MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y, + xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y); + } } - #endif if(draw_xhair) { draw_crosshair(0); } diff --git a/src/draw.c b/src/draw.c index c2092727..807351df 100644 --- a/src/draw.c +++ b/src/draw.c @@ -406,9 +406,9 @@ void draw_temp_string(GC gctext, int what, const char *str, short rot, short fli int tmp; double dtmp; if(!has_x) return; - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) - if(gctext == xctx->gctiled) return; - #endif + if(fix_broken_tiled_fill || !_unix) { + if(gctext == xctx->gctiled) return; + } dbg(2, "draw_string(): string=%s\n",str); if(!text_bbox(str, xscale, yscale, rot, flip, hcenter, vcenter, x1,y1, @@ -728,9 +728,9 @@ void draw_temp_symbol(int what, GC gc, int n,int layer,short tmp_flip, short rot if(xctx->inst[n].ptr == -1) return; if(!has_x) return; - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) - if(gc == xctx->gctiled) return; - #endif + if(fix_broken_tiled_fill || !_unix) { + if(gc == xctx->gctiled) return; + } if( (xctx->inst[n].flags & HIDE_INST) || (xctx->hide_symbols==1 && (xctx->inst[n].ptr+ xctx->sym)->prop_ptr && @@ -1161,9 +1161,9 @@ void drawtempline(GC gc, int what, double linex1,double liney1,double linex2,dou double x1,y1,x2,y2; if(!has_x) return; - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) - if(gc == xctx->gctiled) return; - #endif + if(fix_broken_tiled_fill || !_unix) { + if(gc == xctx->gctiled) return; + } if(what & ADD) { @@ -1238,9 +1238,9 @@ void drawtemparc(GC gc, int what, double x, double y, double r, double a, double double xx1, yy1, xx2, yy2; /* complete circle bbox in screen coords */ if(!has_x) return; - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) - if(gc == xctx->gctiled) return; - #endif + if(fix_broken_tiled_fill || !_unix) { + if(gc == xctx->gctiled) return; + } if(what & ADD) { @@ -1673,9 +1673,9 @@ void drawtemppolygon(GC g, int what, double *x, double *y, int points) int i; short sx, sy; if(!has_x) return; - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) - if(g == xctx->gctiled) return; - #endif + if(fix_broken_tiled_fill || !_unix) { + if(g == xctx->gctiled) return; + } polygon_bbox(x, y, points, &x1,&y1,&x2,&y2); x1=X_TO_SCREEN(x1); @@ -1767,9 +1767,9 @@ void drawtemprect(GC gc, int what, double rectx1,double recty1,double rectx2,dou double x1,y1,x2,y2; if(!has_x) return; - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) - if(gc == xctx->gctiled) return; - #endif + if(fix_broken_tiled_fill || !_unix) { + if(gc == xctx->gctiled) return; + } if(what & NOW) { diff --git a/src/globals.c b/src/globals.c index 6c1f24a8..4bf9a2c0 100644 --- a/src/globals.c +++ b/src/globals.c @@ -131,6 +131,17 @@ Pixmap cad_icon_pixmap=0, cad_icon_mask=0; /* char *cad_icon[] */ Pixmap *pixmap = NULL; Visual *visual; +#ifdef __unix__ +int _unix = 1; +#else +int _unix = 0; +#endif + +#ifdef FIX_BROKEN_TILED_FILL +int fix_broken_tiled_fill = 1; +#else +int fix_broken_tiled_fill = 0; +#endif /* ---------------------------------------------- */ /* These variables are mirrored in tcl code */ diff --git a/src/move.c b/src/move.c index f77e8f34..abe9c41c 100644 --- a/src/move.c +++ b/src/move.c @@ -195,13 +195,13 @@ void draw_selection(GC g, int interruptable) dbg(1,"draw_selection\n"); if(g != xctx->gctiled) xctx->movelastsel = xctx->lastsel; - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) - else { - MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y, - xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y); - if(tclgetboolvar("draw_crosshair")) draw_crosshair(0); + if(fix_broken_tiled_fill || !_unix) { + if(g == xctx->gctiled) { + MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y, + xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y); + if(tclgetboolvar("draw_crosshair")) draw_crosshair(0); + } } - #endif for(i=0;imovelastsel; ++i) { c = xctx->sel_array[i].col;n = xctx->sel_array[i].n; @@ -678,10 +678,10 @@ void copy_objects(int what) if(tclgetintvar("connect_by_kissing") == 2) tclsetintvar("connect_by_kissing", 0); } - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) - MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y, - xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y); - #endif + if(fix_broken_tiled_fill || !_unix) { + MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y, + xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y); + } xctx->move_rot = xctx->move_flip = 0; xctx->deltax = xctx->deltay = 0.; @@ -1124,11 +1124,11 @@ void move_objects(int what, int merge, double dx, double dy) pop_undo(0, 0); if(tclgetintvar("connect_by_kissing") == 2) tclsetintvar("connect_by_kissing", 0); } - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) + if(fix_broken_tiled_fill || !_unix) { if(xctx->save_pixmap && xctx->window) - MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y, - xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y); - #endif + MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y, + xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y); + } xctx->move_rot=xctx->move_flip=0; xctx->deltax=xctx->deltay=0.; diff --git a/src/scheduler.c b/src/scheduler.c index 52e8703b..6a449e62 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -1010,6 +1010,10 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg } break; case 'f': + if(!strcmp(argv[2], "fix_broken_tiled_fill")) { /* get drawing method setting (for broken GPUs) */ + if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} + Tcl_SetResult(interp, my_itoa(fix_broken_tiled_fill),TCL_VOLATILE); + } if(!strcmp(argv[2], "format")) { /* alternate format attribute to use in netlist (or NULL) */ if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} if(!xctx->format ) Tcl_SetResult(interp, "",TCL_STATIC); @@ -3317,6 +3321,17 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg Tcl_ResetResult(interp); } + /* resetwin create_pixmap clear_pixmap force w h + * internal command: calls resetwin() */ + else if(!strcmp(argv[1], "resetwin")) + { + if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} + if(argc > 6) { + resetwin(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6])); + } + Tcl_ResetResult(interp); + } + /* resolved_net [net] * if 'net' is given return its topmost full hierarchy name * else returns the topmost full hierarchy name of selected net/pin/label. @@ -3748,6 +3763,10 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} xctx->draw_window=atoi(argv[3]); } + else if(!strcmp(argv[2], "fix_broken_tiled_fill")) { /* alternate drawing method for broken GPUs */ + if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} + fix_broken_tiled_fill = atoi(argv[3]); + } else if(!strcmp(argv[2], "format")) { /* set name of custom format attribute used for netlisting */ if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} my_strdup(_ALLOC_ID_, &xctx->format, argv[3]); diff --git a/src/select.c b/src/select.c index bd2672fe..712b496b 100644 --- a/src/select.c +++ b/src/select.c @@ -924,13 +924,13 @@ void unselect_all(int dr) xctx->ui_state &= ~SELECTION; my_snprintf(str, S(str), "%s/%s", user_conf_dir, ".selection.sch"); /* 20161115 PWD->HOME */ xunlink(str); - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) - if(xctx->save_pixmap && xctx->window) { - MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y, - xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y); - if(tclgetboolvar("draw_crosshair")) draw_crosshair(0); + if(fix_broken_tiled_fill || !_unix) { + if(xctx->save_pixmap && xctx->window) { + MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y, + xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y); + if(tclgetboolvar("draw_crosshair")) draw_crosshair(0); + } } - #endif dbg(2, "unselect_all(1): done\n"); } diff --git a/src/xinit.c b/src/xinit.c index bc3e82dc..a4b8851d 100644 --- a/src/xinit.c +++ b/src/xinit.c @@ -2096,10 +2096,8 @@ void resetwin(int create_pixmap, int clear_pixmap, int force, int w, int h) XFreeGC(display,xctx->gctiled); } if(create_pixmap) { - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) XGCValues gcv; unsigned long gcvm; - #endif #ifdef __unix__ xctx->save_pixmap = XCreatePixmap(display, xctx->window, @@ -2109,16 +2107,16 @@ void resetwin(int create_pixmap, int clear_pixmap, int force, int w, int h) xctx->xrect[0].width, xctx->xrect[0].height, screendepth); #endif - #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__) - gcv.function = GXnoop; /* disable all graphic operations with gctiled */ - gcvm = GCFunction; - xctx->gctiled = XCreateGC(display,xctx->window, gcvm, &gcv); /* noop for gctiled */ - XSetFillStyle(display,xctx->gctiled,FillSolid); - #else - xctx->gctiled = XCreateGC(display,xctx->window,0L, NULL); - XSetTile(display,xctx->gctiled, xctx->save_pixmap); - XSetFillStyle(display,xctx->gctiled,FillTiled); - #endif + if(fix_broken_tiled_fill || !_unix) { + gcv.function = GXnoop; /* disable all graphic operations with gctiled */ + gcvm = GCFunction; + xctx->gctiled = XCreateGC(display,xctx->window, gcvm, &gcv); /* noop for gctiled */ + XSetFillStyle(display,xctx->gctiled,FillSolid); + } else { + xctx->gctiled = XCreateGC(display,xctx->window,0L, NULL); + XSetTile(display,xctx->gctiled, xctx->save_pixmap); + XSetFillStyle(display,xctx->gctiled,FillTiled); + } /* whenever a pixmap is recreated all GC attributes must be reissued */ resetcairo(1, 0, 1); /* create, clear, force */ @@ -2490,6 +2488,7 @@ int Tcl_AppInit(Tcl_Interp *inter) l_width=atoi(tclgetvar("line_width")); if(tclgetboolvar("change_lw")) l_width = 0.0; cadlayers=atoi(tclgetvar("cadlayers")); + fix_broken_tiled_fill = tclgetboolvar("fix_broken_tiled_fill"); if(debug_var==-10) debug_var=0; my_snprintf(tmp, S(tmp), "%.16g",CADGRID); tclvareval("set_ne cadgrid ", tmp, NULL); diff --git a/src/xschem.h b/src/xschem.h index 31839a91..af44fe2a 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -1079,11 +1079,13 @@ typedef struct { /* GLOBAL VARIABLES */ -/*********** X11 specific globals ***********/ +/*********** X11/system specific globals ***********/ extern Colormap colormap; extern unsigned char **pixdata; extern unsigned char pixdata_init[22][32]; extern Display *display; +extern int _unix; /* set to 1 on unix systems */ +extern int fix_broken_tiled_fill; /* if set to 1 work around some GPUs with rotten tiled fill operations */ #ifdef HAS_XCB extern xcb_connection_t *xcb_conn; diff --git a/src/xschem.tcl b/src/xschem.tcl index 4d41acf1..ab9498ad 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -5593,8 +5593,8 @@ set tctx::global_list { delay_flag dim_bg dim_value disable_unique_names do_all_inst draw_crosshair draw_grid draw_window edit_prop_pos edit_prop_size edit_symbol_prop_new_sel editprop_sympath en_hilight_conn_inst enable_dim_bg enable_stretch - filetmp flat_netlist fullscreen gaw_fd gaw_tcp_address graph_bus graph_change_done graph_digital - graph_linewidth_mult graph_logx + filetmp fix_broken_tiled_fill flat_netlist fullscreen gaw_fd gaw_tcp_address graph_bus + graph_change_done graph_digital graph_linewidth_mult graph_logx graph_logy graph_rainbow graph_raw_level graph_schname graph_sel_color graph_sel_wave graph_selected graph_sort graph_unlocked hide_empty_graphs hide_symbols hsize incr_hilight infowindow_text input_line_cmd input_line_data launcher_default_program @@ -6116,9 +6116,6 @@ proc build_widgets { {topwin {} } } { -command { input_line "Enter grid spacing (float):" "xschem set cadgrid" $cadgrid } - $topwin.menubar.view.menu add checkbutton -label "View only Probes" -variable only_probes \ - -accelerator {5} \ - -command { xschem only_probes } $topwin.menubar.view.menu add command -label "Toggle colorscheme" -accelerator {Shift+O} -command { xschem toggle_colorscheme xschem build_colors @@ -6150,6 +6147,19 @@ proc build_widgets { {topwin {} } } { -command { if { $draw_window == 1} { xschem set draw_window 1} else { xschem set draw_window 0} } + + $topwin.menubar.view.menu add checkbutton -label "Fix for GPUs with broken tiled fill" \ + -variable fix_broken_tiled_fill \ + -command { + if { $fix_broken_tiled_fill == 1} { + xschem set fix_broken_tiled_fill 1 + } else { + xschem set fix_broken_tiled_fill 0 + } + xschem resetwin 1 1 0 0 0 + xschem redraw + } + $topwin.menubar.view.menu add checkbutton -label "Symbol text" -variable sym_txt \ -accelerator {Ctrl+B} -command { xschem set sym_txt $sym_txt; xschem redraw } $topwin.menubar.view.menu add checkbutton -label "Toggle variable line width" -variable change_lw \ @@ -6278,6 +6288,9 @@ proc build_widgets { {topwin {} } } { xschem redraw } \ -variable compare_sch \ -accelerator {Alt-X} + $topwin.menubar.hilight.menu add checkbutton -label "View only Probes" -variable only_probes \ + -accelerator {5} \ + -command { xschem only_probes } $topwin.menubar.hilight.menu add command \ -label {Highlight net-pin mismatches on sel. instances} \ -command "xschem net_pin_mismatch" \ @@ -6845,6 +6858,7 @@ set_ne dark_colorscheme 1 set_ne enable_dim_bg 0 set_ne dim_bg 0.0 set_ne dim_value 0.0 +set_ne fix_broken_tiled_fill 0 ;# set to 1 on some broken X11 drivers / GPUs that show garbage on screen */ ##### set colors if {!$rainbow_colors} { set_ne cadlayers 22 diff --git a/src/xschemrc b/src/xschemrc index e07ac463..b092b74a 100644 --- a/src/xschemrc +++ b/src/xschemrc @@ -469,3 +469,10 @@ #### Instead, additional drives can be added using XSCHEM_LIBRARY_PATH #### default: 1 # set add_all_windows_drives 0 + +########################################################################### +#### FIX GRAPHIC PROBLEMS ON SOME DRIVERS/GPU CONFIGURATIONS +########################################################################### +#### if you see garbage on screen / graphic artifacts while editing with +#### xschem try to set this to 1. Default: not enabled (0) +# set fix_broken_tiled_fill 0