diff --git a/src/actions.c b/src/actions.c index ead14264..c0b508c9 100644 --- a/src/actions.c +++ b/src/actions.c @@ -198,42 +198,46 @@ const char *add_ext(const char *f, const char *ext) static void reset_cairo(int create, int clear) { #ifdef HAS_CAIRO - /* save_sfc is based on pixmap and pixmaps are not resizeable, so on resize - * we must destroy & recreate everything. sfc can be resized using cairo_*_surface_set_size - * being based on window */ - cairo_destroy(cairo_save_ctx); - cairo_surface_destroy(save_sfc); - #if HAS_XRENDER==1 - #if HAS_XCB==1 - save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, screen_xcb, xctx->save_pixmap, - &format_rgb, xctx->xschem_w, xctx->xschem_h); - #else - save_sfc = cairo_xlib_surface_create_with_xrender_format(display, xctx->save_pixmap, - DefaultScreenOfDisplay(display), format, xctx->xschem_w, xctx->xschem_h); - #endif /* HAS_XCB */ - #else - save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, xctx->xschem_w, xctx->xschem_h); - #endif /* HAS_XRENDER */ - if(cairo_surface_status(save_sfc)!=CAIRO_STATUS_SUCCESS) { - fprintf(errfp, "ERROR: invalid cairo xcb surface\n"); - exit(-1); + if(clear) { + /* xctx->save_sfc is based on pixmap and pixmaps are not resizeable, so on resize + * we must destroy & recreate everything. sfc can be resized using cairo_*_surface_set_size + * being based on window */ + cairo_destroy(xctx->cairo_save_ctx); + cairo_surface_destroy(xctx->save_sfc); + } + if(create) { + #if HAS_XRENDER==1 + #if HAS_XCB==1 + xctx->save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, screen_xcb, xctx->save_pixmap, + &format_rgb, xctx->xschem_w, xctx->xschem_h); + #else + xctx->save_sfc = cairo_xlib_surface_create_with_xrender_format(display, xctx->save_pixmap, + DefaultScreenOfDisplay(display), format, xctx->xschem_w, xctx->xschem_h); + #endif /* HAS_XCB */ + #else + xctx->save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, xctx->xschem_w, xctx->xschem_h); + #endif /* HAS_XRENDER */ + if(cairo_surface_status(xctx->save_sfc)!=CAIRO_STATUS_SUCCESS) { + fprintf(errfp, "ERROR: invalid cairo xcb surface\n"); + exit(-1); + } + xctx->cairo_save_ctx = cairo_create(xctx->save_sfc); + cairo_set_line_width(xctx->cairo_save_ctx, 1); + cairo_set_line_join(xctx->cairo_save_ctx, CAIRO_LINE_JOIN_ROUND); + cairo_set_line_cap(xctx->cairo_save_ctx, CAIRO_LINE_CAP_ROUND); + cairo_select_font_face (xctx->cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (xctx->cairo_save_ctx, 20); } - cairo_save_ctx = cairo_create(save_sfc); - cairo_set_line_width(cairo_save_ctx, 1); - cairo_set_line_join(cairo_save_ctx, CAIRO_LINE_JOIN_ROUND); - cairo_set_line_cap(cairo_save_ctx, CAIRO_LINE_CAP_ROUND); - cairo_select_font_face (cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size (cairo_save_ctx, 20); /* 20171125 select xlib or xcb :-) */ #if HAS_XCB==1 && HAS_XRENDER==1 cairo_xcb_surface_set_size(sfc, xctx->xschem_w, xctx->xschem_h); #else cairo_xlib_surface_set_size(sfc, xctx->xschem_w, xctx->xschem_h); - #endif /* HAS_XCB */ + #endif /* HAS_XCB && HAS_XRENDER */ #endif /* HAS_CAIRO */ } -void resetwin(int create_pixmap, int clear_pixmap, int preview_window) +void resetwin(int create_pixmap, int clear_pixmap, int force) { int i; XWindowAttributes wattr; @@ -255,9 +259,8 @@ void resetwin(int create_pixmap, int clear_pixmap, int preview_window) xctx->areaw = xctx->areax2-xctx->areax1; xctx->areah = xctx->areay2-xctx->areay1; - /* if no preview_window or create_pixmap==1 avoid unnecessary work if no resize */ - /* !create_pixmap ensures the XSetTile is executed when done with the preview */ - if( preview_window || xctx->xschem_w !=xctx->xrect[0].width || xctx->xschem_h !=xctx->xrect[0].height) { + /* if no force avoid unnecessary work if no resize */ + if( force || xctx->xschem_w !=xctx->xrect[0].width || xctx->xschem_h !=xctx->xrect[0].height) { dbg(1, "resetwin(): x=%d y=%d xctx->xschem_w=%d xctx->xschem_h=%d\n", wattr.x, wattr.y, xctx->xschem_w,xctx->xschem_h); dbg(1, "resetwin(): changing size\n\n"); @@ -278,11 +281,11 @@ void resetwin(int create_pixmap, int clear_pixmap, int preview_window) xctx->save_pixmap = XCreatePixmap(display, xctx->window, xctx->xschem_w, xctx->xschem_h, depth); } XSetTile(display,gctiled, xctx->save_pixmap); + reset_cairo(create_pixmap, clear_pixmap); } - reset_cairo(create_pixmap, clear_pixmap); #else HWND hwnd; - if (preview_window) { + if (force) { hwnd = Tk_GetHWND(pre_window); } else { @@ -302,9 +305,8 @@ void resetwin(int create_pixmap, int clear_pixmap, int preview_window) xctx->areay1 = -2 * INT_WIDTH(xctx->lw); xctx->areaw = xctx->areax2 - xctx->areax1; xctx->areah = xctx->areay2 - xctx->areay1; - /* if no preview_window or create_pixmap==1 avoid unnecessary work if no resize */ - /* !create_pixmap ensures the XSetTile is executed when done with the preview */ - if( preview_window || xctx->xschem_w !=xctx->xrect[0].width || + /* if no force avoid unnecessary work if no resize */ + if( force || xctx->xschem_w !=xctx->xrect[0].width || xctx->xschem_h !=xctx->xrect[0].height) { dbg(1, "resetwin(): x=%d y=%d xctx->xschem_w=%d xctx->xschem_h=%d\n", rct.right, rct.bottom, xctx->xschem_w, xctx->xschem_h); @@ -2358,9 +2360,9 @@ void place_text(int draw_text, double mx, double my) if(t->flags & TEXT_ITALIC) slant = CAIRO_FONT_SLANT_ITALIC; if(t->flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE; cairo_save(cairo_ctx); - cairo_save(cairo_save_ctx); + cairo_save(xctx->cairo_save_ctx); cairo_select_font_face (cairo_ctx, textfont, slant, weight); - cairo_select_font_face (cairo_save_ctx, textfont, slant, weight); + cairo_select_font_face (xctx->cairo_save_ctx, textfont, slant, weight); } #endif save_draw=draw_window; @@ -2372,7 +2374,7 @@ void place_text(int draw_text, double mx, double my) #ifdef HAS_CAIRO if((textfont && textfont[0]) || t->flags) { cairo_restore(cairo_ctx); - cairo_restore(cairo_save_ctx); + cairo_restore(xctx->cairo_save_ctx); } #endif select_text(xctx->texts, SELECTED, 0); diff --git a/src/draw.c b/src/draw.c index 36c9c33a..b9ddffc7 100644 --- a/src/draw.c +++ b/src/draw.c @@ -108,30 +108,30 @@ void print_image() XSetTile(display, gctiled, xctx->save_pixmap); #ifdef HAS_CAIRO - cairo_destroy(cairo_save_ctx); - cairo_surface_destroy(save_sfc); + cairo_destroy(xctx->cairo_save_ctx); + cairo_surface_destroy(xctx->save_sfc); #if HAS_XRENDER==1 #if HAS_XCB==1 - save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, screen_xcb, xctx->save_pixmap, &format_rgb, w, h); + xctx->save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, screen_xcb, xctx->save_pixmap, &format_rgb, w, h); #else - save_sfc = cairo_xlib_surface_create_with_xrender_format(display, + xctx->save_sfc = cairo_xlib_surface_create_with_xrender_format(display, xctx->save_pixmap, DefaultScreenOfDisplay(display), format, w, h); #endif /*HAS_XCB */ #else - save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, w, h); + xctx->save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, w, h); #endif /*HAS_XRENDER */ - if(cairo_surface_status(save_sfc)!=CAIRO_STATUS_SUCCESS) { + if(cairo_surface_status(xctx->save_sfc)!=CAIRO_STATUS_SUCCESS) { fprintf(errfp, "ERROR: invalid cairo xcb surface\n"); exit(-1); } - cairo_save_ctx = cairo_create(save_sfc); - cairo_set_line_width(cairo_save_ctx, 1); - cairo_set_line_join(cairo_save_ctx, CAIRO_LINE_JOIN_ROUND); - cairo_set_line_cap(cairo_save_ctx, CAIRO_LINE_CAP_ROUND); - cairo_select_font_face (cairo_save_ctx, cairo_font_name, + xctx->cairo_save_ctx = cairo_create(xctx->save_sfc); + cairo_set_line_width(xctx->cairo_save_ctx, 1); + cairo_set_line_join(xctx->cairo_save_ctx, CAIRO_LINE_JOIN_ROUND); + cairo_set_line_cap(xctx->cairo_save_ctx, CAIRO_LINE_CAP_ROUND); + cairo_select_font_face (xctx->cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size (cairo_save_ctx, 20); + cairo_set_font_size (xctx->cairo_save_ctx, 20); #endif /*HAS_CAIRO */ for(tmp=0;tmpcairo_save_ctx); + cairo_surface_destroy(xctx->save_sfc); #if HAS_XRENDER==1 #if HAS_XCB==1 - save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, screen_xcb, xctx->save_pixmap, &format_rgb, w, h); + xctx->save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, screen_xcb, xctx->save_pixmap, &format_rgb, w, h); #else - save_sfc = cairo_xlib_surface_create_with_xrender_format (display, + xctx->save_sfc = cairo_xlib_surface_create_with_xrender_format (display, xctx->save_pixmap, DefaultScreenOfDisplay(display), format, w, h); #endif /*HAS_XCB */ #else - save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, w, h); + xctx->save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, w, h); #endif /*HAS_XRENDER */ - if(cairo_surface_status(save_sfc)!=CAIRO_STATUS_SUCCESS) { + if(cairo_surface_status(xctx->save_sfc)!=CAIRO_STATUS_SUCCESS) { fprintf(errfp, "ERROR: invalid cairo xcb surface\n"); exit(-1); } - cairo_save_ctx = cairo_create(save_sfc); - cairo_set_line_width(cairo_save_ctx, 1); - cairo_set_line_join(cairo_save_ctx, CAIRO_LINE_JOIN_ROUND); - cairo_set_line_cap(cairo_save_ctx, CAIRO_LINE_CAP_ROUND); - cairo_select_font_face (cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size (cairo_save_ctx, 20); + xctx->cairo_save_ctx = cairo_create(xctx->save_sfc); + cairo_set_line_width(xctx->cairo_save_ctx, 1); + cairo_set_line_join(xctx->cairo_save_ctx, CAIRO_LINE_JOIN_ROUND); + cairo_set_line_cap(xctx->cairo_save_ctx, CAIRO_LINE_CAP_ROUND); + cairo_select_font_face (xctx->cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (xctx->cairo_save_ctx, 20); #endif /*HAS_CAIRO */ for(tmp=0;tmpcairo_save_ctx, (double)xcolor_array[layer].red/65535.0, (double)xcolor_array[layer].green/65535.0, (double)xcolor_array[layer].blue/65535.0); @@ -265,7 +265,7 @@ int set_text_custom_font(xText *txt) #ifdef HAS_CAIRO -static void cairo_draw_string_line(cairo_t *cairo_ctx, char *s, +static void cairo_draw_string_line(cairo_t *c_ctx, char *s, double x, double y, int rot, int flip, int lineno, double fontheight, double fontascent, double fontdescent, int llength) { @@ -301,13 +301,13 @@ static void cairo_draw_string_line(cairo_t *cairo_ctx, char *s, else if(rot==2 && flip==1) {iy=iy-fontheight-lines+line_delta+fontascent+vc;} else if(rot==3 && flip==1) {iy=iy+line_offset;ix+=line_delta+fontascent-vc;} - cairo_save(cairo_ctx); - cairo_translate(cairo_ctx, ix, iy); - cairo_rotate(cairo_ctx, XSCH_PI/2*rot1); + cairo_save(c_ctx); + cairo_translate(c_ctx, ix, iy); + cairo_rotate(c_ctx, XSCH_PI/2*rot1); - cairo_move_to(cairo_ctx, 0,0); - cairo_show_text(cairo_ctx, s); - cairo_restore(cairo_ctx); + cairo_move_to(c_ctx, 0,0); + cairo_show_text(c_ctx, s); + cairo_restore(c_ctx); } /* CAIRO version */ @@ -356,7 +356,7 @@ void draw_string(int layer, int what, const char *str, int rot, int flip, int hc set_cairo_color(layer); cairo_set_font_size (cairo_ctx, size*xctx->mooz); - cairo_set_font_size (cairo_save_ctx, size*xctx->mooz); + cairo_set_font_size (xctx->cairo_save_ctx, size*xctx->mooz); cairo_font_extents(cairo_ctx, &fext); dbg(1, "draw_string(): size * mooz=%g height=%g ascent=%g descent=%g\n", size * xctx->mooz, fext.height, fext.ascent, fext.descent); @@ -370,7 +370,7 @@ void draw_string(int layer, int what, const char *str, int rot, int flip, int hc /*fprintf(errfp, "cairo_draw_string(): tt=%s, longest line: %d\n", tt, cairo_longest_line); */ if(draw_window) cairo_draw_string_line(cairo_ctx, tt, x, y, rot, flip, lineno, fext.height, fext.ascent, fext.descent, llength); - if(draw_pixmap) cairo_draw_string_line(cairo_save_ctx, tt, x, y, rot, flip, + if(draw_pixmap) cairo_draw_string_line(xctx->cairo_save_ctx, tt, x, y, rot, flip, lineno, fext.height, fext.ascent, fext.descent, llength); lineno++; if(c==0) break; @@ -603,9 +603,9 @@ void draw_symbol(int what,int c, int n,int layer,int tmp_flip, int rot, if(symptr->text[j].flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE; cairo_save(cairo_ctx); - cairo_save(cairo_save_ctx); + cairo_save(xctx->cairo_save_ctx); cairo_select_font_face (cairo_ctx, textfont, slant, weight); - cairo_select_font_face (cairo_save_ctx, textfont, slant, weight); + cairo_select_font_face (xctx->cairo_save_ctx, textfont, slant, weight); } #endif dbg(1, "drawing string: str=%s prop=%s\n", txtptr, text.prop_ptr); @@ -620,7 +620,7 @@ void draw_symbol(int what,int c, int n,int layer,int tmp_flip, int rot, #ifdef HAS_CAIRO if( (textfont && textfont[0]) || symptr->text[j].flags) { cairo_restore(cairo_ctx); - cairo_restore(cairo_save_ctx); + cairo_restore(xctx->cairo_save_ctx); } #endif } @@ -1736,9 +1736,9 @@ void draw(void) if(xctx->text[i].flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE; cairo_save(cairo_ctx); - cairo_save(cairo_save_ctx); + cairo_save(xctx->cairo_save_ctx); cairo_select_font_face (cairo_ctx, textfont, slant, weight); - cairo_select_font_face (cairo_save_ctx, textfont, slant, weight); + cairo_select_font_face (xctx->cairo_save_ctx, textfont, slant, weight); } #endif @@ -1749,7 +1749,7 @@ void draw(void) #ifdef HAS_CAIRO if((textfont && textfont[0]) || xctx->text[i].flags ) { cairo_restore(cairo_ctx); - cairo_restore(cairo_save_ctx); + cairo_restore(xctx->cairo_save_ctx); } #endif #ifndef HAS_CAIRO diff --git a/src/globals.c b/src/globals.c index 88c5c73e..f4f1e48d 100644 --- a/src/globals.c +++ b/src/globals.c @@ -103,9 +103,9 @@ XPoint *gridpoint; /* pointer to array of gridpoints, used in draw() */ XColor xcolor_array[256]; Visual *visual; #ifdef HAS_CAIRO -cairo_surface_t *sfc, *save_sfc; -cairo_t *cairo_ctx, *cairo_save_ctx; XRenderPictFormat *format; +cairo_surface_t *sfc; +cairo_t *cairo_ctx; #if HAS_XCB==1 xcb_connection_t *xcbconn; @@ -200,7 +200,6 @@ int head_undo_ptr=0; int max_undo=MAX_UNDO; int draw_dots=1; int draw_single_layer=-1; -int check_version = 0; /* if set ensures 'v' version header line is present before loading file */ int yyparse_error = 0; int *enable_layer; int n_active_layers=0; diff --git a/src/move.c b/src/move.c index b417c528..524ce47b 100644 --- a/src/move.c +++ b/src/move.c @@ -849,9 +849,9 @@ void copy_objects(int what) if(flags & TEXT_ITALIC) slant = CAIRO_FONT_SLANT_ITALIC; if(flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE; cairo_save(cairo_ctx); - cairo_save(cairo_save_ctx); + cairo_save(xctx->cairo_save_ctx); cairo_select_font_face (cairo_ctx, textfont, slant, weight); - cairo_select_font_face (cairo_save_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 */ @@ -866,7 +866,7 @@ void copy_objects(int what) #ifdef HAS_CAIRO if( (textfont && textfont[0]) || xctx->text[xctx->texts].flags) { cairo_restore(cairo_ctx); - cairo_restore(cairo_save_ctx); + cairo_restore(xctx->cairo_save_ctx); } #endif xctx->sel_array[i].n=xctx->texts; @@ -1383,9 +1383,9 @@ void move_objects(int what, int merge, double dx, double dy) 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(cairo_ctx); - cairo_save(cairo_save_ctx); + cairo_save(xctx->cairo_save_ctx); cairo_select_font_face (cairo_ctx, textfont, slant, weight); - cairo_select_font_face (cairo_save_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 */ @@ -1399,7 +1399,7 @@ void move_objects(int what, int merge, double dx, double dy) #ifdef HAS_CAIRO if( (textfont && textfont[0]) || xctx->text[n].flags) { cairo_restore(cairo_ctx); - cairo_restore(cairo_save_ctx); + cairo_restore(xctx->cairo_save_ctx); } #endif break; diff --git a/src/netlist.c b/src/netlist.c index 4b59ce36..6aa4e82f 100644 --- a/src/netlist.c +++ b/src/netlist.c @@ -1043,7 +1043,6 @@ int sym_vs_sch_pins() char *pin_dir=NULL; double tmpd; FILE *fd; - int version_found; int tmpi; int endfile; char tag[1]; @@ -1061,7 +1060,6 @@ int sym_vs_sch_pins() fd = fopen(filename, "r"); pin_cnt = 0; endfile = 0; - version_found=0; xctx->file_version[0] = '\0'; while(!endfile) { if(fscanf(fd," %c",tag)==EOF) break; @@ -1070,7 +1068,6 @@ int sym_vs_sch_pins() load_ascii_string(&xctx->version_string, fd); my_snprintf(xctx->file_version, S(xctx->file_version), "%s", get_tok_value(xctx->version_string, "file_version", 0)); - version_found = 1; break; case 'E': @@ -1206,7 +1203,6 @@ int sym_vs_sch_pins() break; } read_line(fd, 0); /* discard any remaining characters till (but not including) newline */ - if(check_version && !version_found) break; if(!xctx->file_version[0]) { my_snprintf(xctx->file_version, S(xctx->file_version), "1.0"); dbg(1, "sym_vs_sch_pins(): no file_version, assuming file_version=%s\n", xctx->file_version); diff --git a/src/save.c b/src/save.c index 86e9871c..c8a0413b 100644 --- a/src/save.c +++ b/src/save.c @@ -738,7 +738,6 @@ void read_xschem_file(FILE *fd) char name_embedded[PATH_MAX]; char tag[1]; int inst_cnt; - int version_found = 0; int ty=0; dbg(2, "read_xschem_file(): start\n"); @@ -754,7 +753,6 @@ void read_xschem_file(FILE *fd) if(xctx->version_string) { my_snprintf(xctx->file_version, S(xctx->file_version), "%s", get_tok_value(xctx->version_string, "file_version", 0)); - version_found = 1; } dbg(1, "read_xschem_file(): file_version=%s\n", xctx->file_version); break; @@ -846,7 +844,6 @@ void read_xschem_file(FILE *fd) xctx->schvhdlprop = str; } } - if(check_version && !version_found) return; if(!xctx->file_version[0]) { my_snprintf(xctx->file_version, S(xctx->file_version), "1.0"); dbg(1, "read_xschem_file(): no file_version, assuming file_version=%s\n", xctx->file_version); diff --git a/src/scheduler.c b/src/scheduler.c index 2ab298e9..32383089 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -2096,7 +2096,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg if( strlen(argv[3]) < sizeof(cairo_font_name) ) { my_strncpy(cairo_font_name, argv[3], S(cairo_font_name)); cairo_select_font_face(cairo_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - cairo_select_font_face(cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_select_font_face(xctx->cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); } } else #endif diff --git a/src/select.c b/src/select.c index 6a8b49fa..029afc6c 100644 --- a/src/select.c +++ b/src/select.c @@ -452,7 +452,7 @@ void bbox(int what,double x1,double y1, double x2, double y2) } #ifdef HAS_CAIRO cairo_reset_clip(cairo_ctx); - cairo_reset_clip(cairo_save_ctx); + cairo_reset_clip(xctx->cairo_save_ctx); #endif sem=0; break; @@ -482,8 +482,8 @@ void bbox(int what,double x1,double y1, double x2, double y2) #ifdef HAS_CAIRO cairo_rectangle(cairo_ctx, xctx->xrect[0].x, xctx->xrect[0].y, xctx->xrect[0].width, xctx->xrect[0].height); cairo_clip(cairo_ctx); - cairo_rectangle(cairo_save_ctx, xctx->xrect[0].x, xctx->xrect[0].y, xctx->xrect[0].width, xctx->xrect[0].height); - cairo_clip(cairo_save_ctx); + cairo_rectangle(xctx->cairo_save_ctx, xctx->xrect[0].x, xctx->xrect[0].y, xctx->xrect[0].width, xctx->xrect[0].height); + cairo_clip(xctx->cairo_save_ctx); #endif break; default: diff --git a/src/xinit.c b/src/xinit.c index 3886414c..4b9319d4 100644 --- a/src/xinit.c +++ b/src/xinit.c @@ -562,10 +562,6 @@ void alloc_xschem_data() if(xctx->sel_array==NULL){ fprintf(errfp, "Tcl_AppInit(): calloc error\n");tcleval( "exit"); } - pixmap=my_calloc(636, cadlayers, sizeof(Pixmap)); - if(pixmap==NULL){ - fprintf(errfp, "Tcl_AppInit(): calloc error\n");tcleval( "exit"); - } } @@ -619,6 +615,10 @@ void alloc_data() } } enable_layer=my_calloc(87, cadlayers, sizeof(int)); + pixmap=my_calloc(636, cadlayers, sizeof(Pixmap)); + if(pixmap==NULL){ + fprintf(errfp, "Tcl_AppInit(): calloc error\n");tcleval( "exit"); + } } void xwin_exit(void) @@ -636,9 +636,9 @@ void xwin_exit(void) if(has_x) { #ifdef HAS_CAIRO cairo_destroy(cairo_ctx); - cairo_destroy(cairo_save_ctx); + cairo_destroy(xctx->cairo_save_ctx); cairo_surface_destroy(sfc); - cairo_surface_destroy(save_sfc); + cairo_surface_destroy(xctx->save_sfc); #endif dbg(1, "xwin_exit(): Releasing pixmaps\n"); for(i=0;iwindow = pre_window; - resetwin(1, 0, 1); /* create preview pixmap resetwin(create_pixmap, clear_pixmap, preview_window) */ + dbg(1, "preview_window() draw\n"); + xctx = preview_xctx; + if(!current_file || strcmp(filename, current_file) ) { + if(current_file) { + preview_clear(); + } + my_strdup(117, ¤t_file, filename); + xctx = NULL; /* reset for preview */ + alloc_xschem_data(); /* alloc data into xctx */ + preview_xctx = xctx; + /* save some relevant global context */ + /* preview */ + dbg(1, "preview_window() draw, load schematic\n"); + load_schematic(1,filename, 0); + preview_xctx->window = pre_window; + resetwin(1, 0, 1); /* create preview pixmap. resetwin(create_pixmap, clear_pixmap, force) */ + } + resetwin(1, 1, 0); /* handle resize. resetwin(create_pixmap, clear_pixmap, force) */ + XSetTile(display,gctiled, xctx->save_pixmap); zoom_full(1, 0); /* draw */ - check_version = 0; - - /* restore context */ - unselect_all(); - remove_symbols(); - clear_drawing(); - - show_pin_net_names = save_show_pin; - resetwin(0, 1, 1); /* delete preview pixmap */ - free_xschem_data(); - xctx = save_xctx; /* restore schematic */ - - resetwin(0, 0, 0); /* set window size info back to original value */ - - set_modify(xctx->modified); - change_linewidth(-1.); - /* not needed: event loop takes care of this and don't need to regenerate xctx->save_pixmap. */ - /* draw(); */ + xctx = save_xctx; + XSetTile(display,gctiled, xctx->save_pixmap); } else if(!strcmp(what, "destroy")) { + dbg(1, "preview_window() destroy\n"); + xctx = preview_xctx; + if(current_file) { + preview_clear(); + preview_xctx = NULL; + } Tk_DestroyWindow(tkpre_window); + my_free(1144, ¤t_file); + xctx = save_xctx; /* restore schematic */ + save_xctx = NULL; + XSetTile(display,gctiled, xctx->save_pixmap); + set_modify(xctx->modified); } } @@ -896,7 +910,6 @@ void change_to_unix_fn(char* fn) if (fn[i]!='\\') fn[ii++] = fn[i]; else { fn[ii++] = '/'; if (fn[i + 1] == '\\') ++i; } } - } #endif @@ -1362,29 +1375,29 @@ int Tcl_AppInit(Tcl_Interp *inter) #if HAS_XCB==1 sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, screen_xcb, xctx->window, &format_rgb, 1 , 1); - save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, + xctx->save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, screen_xcb, xctx->save_pixmap, &format_rgb, 1 , 1); #else format = XRenderFindStandardFormat(display, PictStandardRGB24); sfc = cairo_xlib_surface_create_with_xrender_format (display, xctx->window, DefaultScreenOfDisplay(display), format, 1, 1); - save_sfc = cairo_xlib_surface_create_with_xrender_format( + xctx->save_sfc = cairo_xlib_surface_create_with_xrender_format( display, xctx->save_pixmap, DefaultScreenOfDisplay(display), format, 1, 1); #endif #else sfc = cairo_xlib_surface_create(display, xctx->window, visual, wattr.width, wattr.height); - save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, wattr.width, wattr.height); + xctx->save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, wattr.width, wattr.height); #endif if(cairo_surface_status(sfc)!=CAIRO_STATUS_SUCCESS) { fprintf(errfp, "ERROR: invalid cairo surface\n"); return 1; } - if(cairo_surface_status(save_sfc)!=CAIRO_STATUS_SUCCESS) { + if(cairo_surface_status(xctx->save_sfc)!=CAIRO_STATUS_SUCCESS) { fprintf(errfp, "ERROR: invalid cairo surface\n"); return 1; } cairo_ctx = cairo_create(sfc); - cairo_save_ctx = cairo_create(save_sfc); + xctx->cairo_save_ctx = cairo_create(xctx->save_sfc); #if 0 { @@ -1392,7 +1405,7 @@ int Tcl_AppInit(Tcl_Interp *inter) cfo = cairo_font_options_create (); cairo_font_options_set_antialias(cfo, CAIRO_ANTIALIAS_DEFAULT); /* CAIRO_ANTIALIAS_NONE */ cairo_set_font_options (cairo_ctx, cfo); - cairo_set_font_options (cairo_save_ctx, cfo); + cairo_set_font_options (xctx->cairo_save_ctx, cfo); } #endif @@ -1402,14 +1415,14 @@ int Tcl_AppInit(Tcl_Interp *inter) tclsetvar("has_cairo","1"); cairo_select_font_face(cairo_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size(cairo_ctx, 20); - cairo_select_font_face(cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size(cairo_save_ctx, 20); + cairo_select_font_face(xctx->cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size(xctx->cairo_save_ctx, 20); cairo_set_line_width(cairo_ctx, 1); - cairo_set_line_width(cairo_save_ctx, 1); + cairo_set_line_width(xctx->cairo_save_ctx, 1); cairo_set_line_join(cairo_ctx, CAIRO_LINE_JOIN_ROUND); cairo_set_line_cap(cairo_ctx, CAIRO_LINE_CAP_ROUND); - cairo_set_line_join(cairo_save_ctx, CAIRO_LINE_JOIN_ROUND); - cairo_set_line_cap(cairo_save_ctx, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join(xctx->cairo_save_ctx, CAIRO_LINE_JOIN_ROUND); + cairo_set_line_cap(xctx->cairo_save_ctx, CAIRO_LINE_CAP_ROUND); } #endif /* HAS_CAIRO */ diff --git a/src/xschem.h b/src/xschem.h index 6b794b34..4ff0e38a 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -533,6 +533,10 @@ typedef struct { Window window; Pixmap save_pixmap; XRectangle xrect[1]; + #ifdef HAS_CAIRO + cairo_surface_t *save_sfc; + cairo_t *cairo_save_ctx; + #endif } Xschem_ctx; struct Lcc { /* used for symbols containing schematics as instances (LCC, Local Custom Cell) */ @@ -669,7 +673,6 @@ extern int head_undo_ptr; extern int max_undo; extern int draw_dots; extern int draw_single_layer; -extern int check_version; extern int yyparse_error; extern char *xschem_executable; extern int depth; @@ -733,9 +736,10 @@ extern Pixmap cad_icon_pixmap, cad_icon_mask, *pixmap; extern XColor xcolor_array[]; extern Visual *visual; #ifdef HAS_CAIRO -extern cairo_surface_t *sfc, *save_sfc; -extern cairo_t *cairo_ctx, *cairo_save_ctx; extern XRenderPictFormat *format; +extern cairo_surface_t *sfc; +extern cairo_t *cairo_ctx; + #if HAS_XCB==1 extern xcb_connection_t *xcbconn; extern xcb_screen_t *screen_xcb; @@ -820,7 +824,7 @@ extern int Tcl_AppInit(Tcl_Interp *interp); extern int source_tcl_file(char *s); extern int callback(int event, int mx, int my, KeySym key, int button, int aux, int state); -extern void resetwin(int create_pixmap, int clear_pixmap, int preview_window); +extern void resetwin(int create_pixmap, int clear_pixmap, int force); extern void find_closest_net(double mx,double my); extern void find_closest_box(double mx,double my); extern void find_closest_arc(double mx,double my); diff --git a/src/xschem.tcl b/src/xschem.tcl index 681c75cd..023d45b0 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -1352,7 +1352,9 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} {init if { [winfo exists .dialog] } { .dialog.l.paneright.pre configure -background {} xschem preview_window draw .dialog.l.paneright.pre "$myload_dir1/$myload_dir2" - bind .dialog.l.paneright.pre {xschem preview_window draw .dialog.l.paneright.pre "$myload_dir1/$myload_dir2"} + bind .dialog.l.paneright.pre { + xschem preview_window draw .dialog.l.paneright.pre "$myload_dir1/$myload_dir2" + } } } else { bind .dialog.l.paneright.pre {} @@ -1389,8 +1391,9 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} {init } set t [is_xschem_file "$myload_dir1/$myload_retval"] if { $t eq {0} } { - set answer [tk_messageBox -message "$myload_dir1/$myload_retval does not seem to be an xschem file...\nContinue?" \ - -icon warning -parent . -type yesno] + set answer [ + tk_messageBox -message "$myload_dir1/$myload_retval does not seem to be an xschem file...\nContinue?" \ + -icon warning -parent . -type yesno] if { $answer eq "no"} { set myload_retval {} return {} @@ -1398,7 +1401,8 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} {init return "$myload_dir1/$myload_retval" } } elseif { $t ne {SYMBOL} && ($ext eq {.sym}) } { - set answer [tk_messageBox -message "$myload_dir1/$myload_retval does not seem to be a SYMBOL file...\nContinue?" \ + set answer [ + tk_messageBox -message "$myload_dir1/$myload_retval does not seem to be a SYMBOL file...\nContinue?" \ -icon warning -parent . -type yesno] if { $answer eq "no"} { set myload_retval {} @@ -3136,6 +3140,65 @@ proc toolbar_hide {} { set $toolbar_visible 0 } +proc set_bindings {window_path} { +global env no_x + ### + ### Tk event handling + ### + + # bind . { + # if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} { + # raise .dialog $window_path + # } + # } + bind . { + if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} { + raise .dialog $window_path + } + } + bind . { + if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} { + raise .dialog $window_path + } + } + bind . { + if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} { + raise .dialog $window_path + } + } + bind $window_path {xschem callback -3 %x %y 0 %b 0 %s} + bind $window_path {xschem callback -3 %x %y 0 %b 0 %s} + bind $window_path {xschem callback -3 %x %y 0 %b 0 %s} + bind $window_path {xschem callback %T %x %y 0 %w %h %s} + bind $window_path {xschem windowid; xschem callback %T %x %y 0 %w %h 0} + bind $window_path {xschem callback %T %x %y 0 %b 0 %s} + if {$::OS == "Windows"} { + bind $window_path { + if {%D<0} { + xschem callback 4 %x %y 0 5 0 %s + } else { + xschem callback 4 %x %y 0 4 0 %s + } + } + } + bind $window_path {xschem callback %T %x %y 0 %b 0 %s} + # on Windows Alt key mask is reported as 131072 (1<<17) so build masks manually with values passed from C code + if {$::OS == "Windows" } { + bind $window_path {xschem callback %T %x %y %N 0 0 [expr {$Mod1Mask}]} + bind $window_path {xschem callback %T %x %y %N 0 0 [expr {$ControlMask + $Mod1Mask}]} + bind $window_path {xschem callback %T %x %y %N 0 0 [expr {$ShiftMask + $Mod1Mask}]} + } + bind $window_path {xschem callback %T %x %y %N 0 0 %s} + bind $window_path {xschem callback %T %x %y %N 0 0 %s} ;# 20161118 + bind $window_path {xschem callback %T %x %y 0 0 0 %s} + bind $window_path {xschem callback %T %x %y 0 0 0 0 } + bind $window_path {} + bind $window_path { + wm withdraw .infotext + set show_infowindow 0 + } + bind $window_path "?" { textwindow "${XSCHEM_SHAREDIR}/xschem.help" } +} ## this function sets up all tk windows and binds X events. It is executed by xinit.c after completing ## all X initialization. This avoids race conditions. @@ -3143,9 +3206,8 @@ proc toolbar_hide {} { ## this could lead to crashes on some (may be slow) systems due to Configure/Expose events being delivered ## before xschem being ready to handle them. proc build_windows {} { - global env - if { ( $::OS== "Windows" || [string length [lindex [array get env DISPLAY] 1] ] > 0 ) - && ![info exists no_x]} { + global env no_x + if {($::OS== "Windows" || [string length [lindex [array get env DISPLAY] 1] ] > 0 ) && ![info exists no_x]} { pack .statusbar.2 -side left pack .statusbar.3 -side left pack .statusbar.4 -side left @@ -3160,67 +3222,7 @@ proc build_windows {} { pack .statusbar -after .drw -anchor sw -fill x bind .statusbar.5 { xschem set cadgrid $grid; focus .drw} bind .statusbar.3 { xschem set cadsnap $snap; focus .drw} - ### - ### Tk event handling - ### - - # bind . { - # if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} { - # raise .dialog .drw - # } - # } - bind . { - if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} { - raise .dialog .drw - } - } - bind . { - if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} { - raise .dialog .drw - } - } - bind . { - if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} { - raise .dialog .drw - } - } - - bind .drw {xschem callback -3 %x %y 0 %b 0 %s} - bind .drw {xschem callback -3 %x %y 0 %b 0 %s} - bind .drw {xschem callback -3 %x %y 0 %b 0 %s} - bind .drw {xschem callback %T %x %y 0 %w %h %s} - bind .drw {xschem windowid; xschem callback %T %x %y 0 %w %h 0} - bind .drw {xschem callback %T %x %y 0 %b 0 %s} - - if {$::OS == "Windows"} { - bind .drw { - if {%D<0} { - xschem callback 4 %x %y 0 5 0 %s - } else { - xschem callback 4 %x %y 0 4 0 %s - } - } - } - - bind .drw {xschem callback %T %x %y 0 %b 0 %s} - - # on Windows Alt key mask is reported as 131072 (1<<17) so build masks manually with values passed from C code - if {$::OS == "Windows" } { - bind .drw {xschem callback %T %x %y %N 0 0 [expr {$Mod1Mask}]} - bind .drw {xschem callback %T %x %y %N 0 0 [expr {$ControlMask + $Mod1Mask}]} - bind .drw {xschem callback %T %x %y %N 0 0 [expr {$ShiftMask + $Mod1Mask}]} - } - - bind .drw {xschem callback %T %x %y %N 0 0 %s} - bind .drw {xschem callback %T %x %y %N 0 0 %s} ;# 20161118 - bind .drw {xschem callback %T %x %y 0 0 0 %s} - bind .drw {xschem callback %T %x %y 0 0 0 0 } - bind .drw {} - bind .drw { - wm withdraw .infotext - set show_infowindow 0 - } - bind .drw "?" { textwindow "${XSCHEM_SHAREDIR}/xschem.help" } + set_bindings {.drw} } } diff --git a/xschem_library/examples/mos_power_ampli.sch b/xschem_library/examples/mos_power_ampli.sch index 70bcc2f3..11bac982 100644 --- a/xschem_library/examples/mos_power_ampli.sch +++ b/xschem_library/examples/mos_power_ampli.sch @@ -299,7 +299,7 @@ C {ngspice_get_expr.sym} 800 -970 0 1 {name=r1 node="[ngspice::get_current \{q4[ib]\}]" descr = Ib } -C {ngspice_get_expr.sym} 570 -460 0 0 {name=r11 +C {ngspice_get_expr.sym} 580 -460 0 0 {name=r11 node="[format %.4g [expr ([ngspice::get_voltage e8] - [ngspice::get_voltage c8]) * [ngspice::get_current \{q8[ic]\}]]] W" descr = power }